【问题标题】: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

标签: android gradle androidx


【解决方案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
        

        请参阅thisthis 帖子以了解有关 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 我已经回答了主要问题是什么意思 - “启用喷射器”?虽然如果您认为我的回答是片面的,我会相应地更新我的回答。
          猜你喜欢
          • 2016-06-04
          • 1970-01-01
          • 2010-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多