什么是喷射器?

Posted

技术标签:

【中文标题】什么是喷射器?【英文标题】:What is Jetifier? 【发布时间】:2019-01-11 19:43:50 【问题描述】:

例如,要使用 androidx 打包的依赖项创建一个新项目,这个新项目需要在 gradle.properties 文件中添加以下行:

android.enableJetifier=true

那么它是什么意思 - “启用喷射器”?

【问题讨论】:

IIRC,Jetifier 是一种未记录的 Googly 技术,它应该自动转换传递依赖项以使用 AndroidX 库。例如,假设您的dependencies 中有implementation "com.commonsware.cwac:document:0.3.0"。该库版本对com.android.support:support-annotations:27.0.2 具有传递依赖。但是,您希望使用 androidx.annotation:annotation 作为使用其他 AndroidX 依赖项的一部分。 Jetifier 会以某种方式更新com.commonsware.cwac:document 以使用androidx.annotation:annotation 【参考方案1】:

喷射器

来自official doc

当此标志设置为 true 时,Android 插件会自动迁移现有的第三方库以通过重写其二进制文件来使用 AndroidX 依赖项。如果未指定,则默认为 false。

这对兼容性很有用。当消费者使用androidX 而生产者使用support 时。例如,当您在 AndroidX 上的项目想要使用使用 support library 而不是 AndroidX[Example] 的依赖项时

【讨论】:

【参考方案2】:

添加这两行 android.useAndroidX=true

android.enableJetifier=true

在buid.gradle中 它对我有用

【讨论】:

【参考方案3】:

假设您熟悉AndroidX。如果没有,请查看@this post。

Jetifier 将转换所有依赖项的support libraries 自动设置为AndroidX,如果您不将其设置为true,那么您的 项目将同时拥有支持 (got deprecated after 28.0.0 version) 和 AndroidX 包,这是多余的。

举例

如果您的依赖项中有PhotoView.java。使用支持库AppCompatImageView

import android.support.v7.widget.AppCompatImageView;

这个类现在被移动到androidx包,那么PhotoView将如何得到androidxAppCompatImageView呢?并且应用仍然在设备中运行。

谁做的?

Jetifier,在构建时转换所有支持包的依赖。

Jetifier 将在构建项目时将android.support.v7.widget.AppCompatImageView 转换为androidx.appcompat.widget.AppCompatImageView

结论

当您从 Support Libraries 迁移到 AndroidX 时,启用 Jetifier 很重要

请参阅this post 以了解有关 AndroidX 的更多信息。

信息

在使用依赖类时启用 Jetifier 后,您的代码可能会显示编译时错误。 您可以通过删除.idea.gradle 并重新同步项目来删除它。

【讨论】:

您可以通过删除 .idea/libraries 并重新同步 Gradle 来消除编译时错误。 我认为 Jetifier 在构建时工作,而不是在运行时工作,如此处所述。您可以在 gradle 上使用 android.enableJetifier=true 或使用独立的 jetifier 工具 developer.android.com/studio/command-line/jetifier 迁移到 androidx。这两个选项都会在构建时替换包名称,因此旧的支持库甚至不是打包的一部分。 这是最好的答案。 +1【参考方案4】:

Jetifier 有助于将 android 项目迁移到 AndroidX

Jetifier 有助于使 第三方 库与您的 AndroidX 项目兼容

如果您没有在您的 android 项目中使用任何 3rd 方库,那么您不需要使用 Jetifier,因为 Jetifier 仅有助于“使 3rd 方库”与您的项目兼容,以防您迁移到 AndroidX .因此,为了让您的项目使用 Jetifier,您可以在 gradle.properties 中编写以下代码。

android.enableJetifier=true
android.useAndroidX=true

如果您没有迁移到 AndroidX 并使用以前使用 Android 库的方式(例如:com.android.support),那么这些 3rd 方库不需要像这些 3rd 那样兼容派对库已经与之前使用 Android 库的方式兼容。在这种情况下,你不需要使用 Jetifier,所以现在,你不需要写上面给出的行,或者你可以简单地写如下来更改将来的值以移动到 androidx:-

android.enableJetifier=false
android.useAndroidX=false

【讨论】:

【参考方案5】:

喷射器

jetifier 是一个方便的工具,可在构建时自动将您的 dependencies 迁移到 AndroidX。如果没有它,您需要在迁移之前使用您使用的每个依赖项都有一个 AndroidX 版本,而这可能在一段时间内不会发生。

需要注意一个重要的限制:jetifier 仅适用于打包的工件。它不适用于您的源代码,需要您自己更新

要启用 AndroidX,您需要在 gradle.properties 文件中添加 2 个标志。第一个标志告诉 Android 插件使用AndroidX 包而不是AppCompat,第二个标志将启用Jetifier

android.useAndroidX=true
android.enableJetifier=true

请参阅this、this 帖子以了解有关 AndroidX 的更多信息

【讨论】:

【参考方案6】:

在今年的 Google I/O (18) 上,Google 发布了 Jetpack,它是一组库,旨在让开发者的生活更轻松。

Jetpack 包括之前引入的 Android 架构组件(ViewModel、Room、Paging、LiveData 等)以及新引入的架构组件,如 WorkManager、Navigation。除了这个 Jetpack 还有其他的库,如 AndroidX、AndroidKTX 等。

AndroidX 是 Android 支持库的新封装结构,如支持、数据绑定、设计等。

例如现在,在我们的项目中导入库时,开发者将使用 androidx.databinding. 而不是 android.databinding.

这使 Google 可以在库包中添加 SemVerSemantic Versioning。对于开发人员来说,这意味着我们不必为所有支持库使用相同的支持库版本。每个支持或更好的说法是 AndroidX 库都将保持其自己的版本控制。

对开发人员而言,另一个优势是我们不必为项目中的所有支持库维护相同的版本。

关于 Jetifier,它在构建时转换所有依赖的支持包。 根据 Jetifier 的官方文档

Jetifier 工具将支持库依赖的库迁移到依赖 而是等效的 AndroidX 包。该工具可让您迁移 直接使用单个库,而不是使用 Android gradle 与 Android Studio 捆绑在一起的插件。

要在项目中使用 AndroidX,我们必须将项目的 targetSdkVersion 设置为 28 并在 gradle.properties 文件中添加以下两行。

android.useAndroidX=true

android.enableJetifier=true

我希望这能回答您的问题。

编辑

This link 具有所有支持库组件与其 AndroidX 对应部分的映射。

关于AndroidX的详细解释请参考This博客

【讨论】:

您并没有真正回答“什么是 Jetifier?”这个问题,只是在讨论 AndroidX 和 Jetpack。 @DavidMiguel 我已经回答了主要问题是什么意思 - “启用喷射器”?虽然如果您认为我的回答是片面的,我会相应地更新我的回答。

以上是关于什么是喷射器?的主要内容,如果未能解决你的问题,请参考以下文章

在 reducer 上执行 Hadoop 组合器

了解 HIVE 数据库中的映射器和缩减器

什么是喷射器?

Amazon EMR:为每个 EMR 实例设置唯一数量的映射器和缩减器

SpringMVC 组件执行流程,组件:前端控制器 DispatcherServlet,处理器映射器 HandlerMapping,处理器设配器 HandlerAdapter ,视图解析器 ViewR

C++ 中的 Yaml 发射器