当您升级到 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
,因此 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)需求的模块,启用 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 规则,以确保其配置正确。有关如何配置 keep 规则的指南,请参阅 缩小、混淆和优化您的应用。
结语
总而言之,这些就是为使用 AGP 8.0 的 Android Studio Flamingo 版本,准备 app 构建的五种方法。如果您开发插件的话,请阅读我们的 博文 ,以了解插件变更。如果您想了解有关 构建变更 的更多信息,请观看来自 Android Dev Summit '22 的 视频。
代码片段许可证:
Copyright 2023 Google LLC.
SPDX-License-Identifier: Apache-2.0
对于很多刚学习ANDROID的小伙伴来说,很多人对于Android Studio的安装都不太熟悉,这里针对Androider也准备了Android Studio视频教程和Android Studio最新的安装包。