美文网首页
升级到AGP8.0,JDK17

升级到AGP8.0,JDK17

作者: 竖起大拇指 | 来源:发表于2024-08-04 14:25 被阅读0次

1.使用 DSL,来声明命名空间属性

namespace DSL 属性,代表生成的 R 和 BuildConfig 类的 Kotlin 或 Java 包名称,并替换之前在 Android 清单中定义的 package 属性。要迁移到命名空间配置,请将 namespace DSL 添加到模块级 build.gradle.kts 文件中的 android {} 块,并删除清单文件中的 package 属性。

// Android manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
-       package="com.example.app"
       >

// 模块 build.gradle.kts
android {
+    namespace = "com.example.app"
    compileSdk = 34
    ...
}

Android Studio AGP 升级助手,将通过把包从 Android 清单的package属性,移动到构建文件中的 namespace 属性,来帮助您进行迁移。


image.png

要了解我们为什么要进行此变更,让我们先看看之前的行为。

以前,package 属性同时用于设置 applicationId 和资源命名空间,不必要地耦合这两个几乎不相关的概念。

通过禁止在清单文件中设置 package 名称,并引入 namespace 属性,我们将用于您app标识的 applicationId ,从资源命名空间中分离出来。这阐明了命名空间值的来源,并让您在不影响您的 applicationId 的情况下,重构 app 的代码和资源。

image.png

2.验证在默认情况下,对于库模块来说,R 类是不可传递的

库模块的 R 类现在默认是不可传递的,这意味着每个 R 类只包含库模块本身声明的资源,而不是来自其依赖项的资源。这意味着您在引用资源时,必须使用完全限定的命名空间来调用。

gradle.properties 文件中的 nonTransitiveRClass 标志控制着 R 类的行为。从 AGP 8.0 开始,未指定时为 true,因此 true 就变成了默认值。

-val foo = R.drawable.android_ext_lib_2
+val foo = com.example.extra_lib_2.R.drawable.android_ext_lib_2

// gradle.properties
-android.nonTransitiveRClass=true

要获得使用 Android Studio 更新您的 R 类调用的帮助,请转至 Refactor > Migrate to Non-Transitive R Classes。此重构操作将所有 R 调用转换为完全限定的 R 调用,并将在 gradle.properties 文件中设置 android.nonTransitiveRClass = true(如果标志设置为 false)。


image.png

R 类是生成的类,可将您的资源名称映射到代码中的 ID。在 Android Studio Bumblebee/AGP 7.1 之前,R 类是可传递的。这意味着构建不仅为库R类生成资源 ID,而且还为库所依赖的所有模块生成资源 ID。所以这一代,导致了更大的可执行文件大小,还有更长的构建时间。

3.仅对需要的模块启用 BuildConfig

如果您从模块代码中调用 BuildConfig 类,则需要在模块的 build.gradle.kts 文件的 android {} 块中启用 buildConfig。否则,不再自动生成 BuildConfig 文件。

// 模块 build.gradle.kts
android {
  buildFeatures {
+    buildConfig = true
  }
}

BuildConfig 文件是一个 Java 文件,其中包含有关您当前构建的静态信息,例如 namespace 名称、flavor 名称、debug 标志等。以前 AGP 总是为所有 Android 模块生成 BuildConfig 文件。如果您开发一个多模块 app,您最终可能会得到大量 AGP 需要处理的 BuildConfig 文件,这会影响您的构建速度。但是,大多数模块不需要来自 BuildConfig 类的任何信息.

此外,BuildConfig 是一个 Java 文件。假设您的 app 是使用 Kotlin 编写的,在同一模块中混合使用 Java 和 Kotlin 的话,会进一步影响构建性能。为了缓解这种情况,我们在 gradle.properties 中引入了 android.enableBuildConfigAsBytecode 标志集。当 android.enableBuildConfigAsBytecode=true 时,BuildConfig 文件不再生成为 Java 文件,而是生成为编译文件。这就避免了 Java 编译步骤!

// gradle.properties
+android.defaults.buildfeatures.buildconfig=true
+android.enableBuildConfigAsBytecode=true

如果您需要所有模块,仍保持旧的行为,请在您的 gradle.properties 文件中设置 android.defaults.buildfeatures.buildconfig=true。

4.为有(AIDL 和 RenderScript)需求的模块,启用 AIDL 和 RenderScript

与 BuildConfig 类似,AIDL 和 RenderScript 默认处于关闭状态。要为特定模块启用它们,请在模块的 build.gradle.kts 文件的 android {} 块中,将 aidl 和 renderScript 选项设置为 true:

// 模块 build.gradle.kts
android {
  buildFeatures {
+   aidl = true
+   renderScript = true 
  }
}

您可以使用类似的方法,为需要这些功能的模块或整个项目,重新启用 AIDL 或 RenderScript,但请注意,RenderScript 在 Android 12 中已被弃用

// 在 gradle.properties 中,为整个项目设置 AIDL 和 RenderScript
+android.defaults.buildfeatures.aidl=true
+android.defaults.buildfeatures.renderScript=true

5.默认情况下,R8已经是完整模式了

最后一个行为变化:R8 现在默认就是完整模式了,这可以减少 app 大小,同时提高性能。您不需要为这个变更,更新任何内容,但如果您遇到 构建 或 运行时 失败,那您应该仔细检查您的 keep 规则,以确保其配置正确。有关如何配置 keep 规则的指南,如果您需要所有模块,仍保持旧的行为,请在您的 gradle.properties 文件中设置

android.enableR8.fullMode=false

相关文章

网友评论

      本文标题:升级到AGP8.0,JDK17

      本文链接:https://www.haomeiwen.com/subject/qtmtkjtx.html