原文链接。
当您升级到 Android Studio Flamingo 和 Android Gradle 插件 (AGP) 8.0 时,您需要更新您的 app 构建文件以适应五个重要的构建行为更改。
AGP 升级助手 可以帮助您完成这些更改。当您使用它时,它会建议通过添加代码行来选择退出构建行为更改,来保留现有的构建行为。稍后通过删除这些代码行迁移到新行为。
请注意,在本文中我们指的是 build.gradle.kts
文件,但如果您使用的是 Groovy,则相同的更改适用于 build.gradle
文件。让我们来看看这些变化。
使用 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 = 33
...
}
复制代码
Android Studio AGP 升级助手将通过把包从 Android 清单的package
属性移动到构建文件中的namespace
属性来帮助您进行迁移。
要了解我们为什么要进行此更改,让我们看看之前的行为。
以前,package
属性同时用于设置 applicationId
和资源命名空间,不必要地耦合这两个几乎不相关的概念。
通过禁止在清单文件中设置 package
名称并引入 namespace
属性,我们将用于您app标识的 applicationId
从资源命名空间中分离出来。这阐明了命名空间值的来源,并让您在不影响您的 applicationId
的情况下重构app的代码和资源
验证 R 类在默认情况下对于库模块是不可传递的
库模块的 R
类现在默认是不可传递的,这意味着每个 R
类只包含库模块本身声明的资源,而不是来自其依赖项的资源。 这意味着您在引用资源时必须使用完全限定的命名空间调用。
gradle.properties
文件中的 nonTransitiveRClass
标志控制着 R
类的行为。从 AGP 8.0 开始,未指定时为 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
)。
R
类是生成的类,可将您的资源名称映射到代码中的 ID。在 Android Studio Bumblebee/AGP 7.1 之前,R
类是可传递的。这意味着构建不仅为库R
类生成资源 ID,而且还为库所依赖的所有模块生成资源 ID。这一代导致更大的可执行文件大小和更长的构建时间。
在非传递行为中,每个库模块 R
类仅包含模块本身声明的资源,从而减少了该模块的R
类的大小。
仅对需要的模块启用 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
。
为需要的模块启用 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
复制代码
默认R8完整模式
最后一个行为变化:R8 现在默认处于完整模式,可以减小 app 大小并提高性能。您不需要为此更改更新任何内容,但如果您遇到构建或运行时失败,您应该仔细检查您的 keep 规则配置正确。 有关如何配置保留规则的指南,请参阅 缩小、混淆和优化您的应用。
结语
总的来说,这些是为使用 AGP 8.0 的 Android Studio Flamingo 版本准备 app 构建的五种方法。如果您开发插件,请阅读我们的 博文 了解插件更改。如果您想了解有关构建更改的更多信息,请观看来自 Android Dev Summit '22 的 视频 和 AGP 发行说明。
代码片段许可证:
Copyright 2023 Google LLC.
SPDX-License-Identifier: Apache-2.0
复制代码