原文链接。
当您晋级到 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