当您升级到 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 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 就变成了默认值。
要获得使用 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
文件。
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
。
为有(AIDL 和 RenderScript)需求的模块,启用 AIDL 和 RenderScript
与 BuildConfig
类似,AIDL
和 RenderScript
默认处于关闭状态。要为特定模块启用它们,请在模块的 build.gradle.kts
文件的 android {}
块中,将 aidl
和 renderScript
选项设置为 true
:
您可以使用类似的方法,为需要这些功能的模块或整个项目,重新启用 AIDL 或 RenderScript,但请注意,RenderScript 在 Android 12 中已被弃用,因此您应该从它进行 迁移。
默认情况下,R8已经是完整模式了
最后一个行为变化:R8 现在默认就是完整模式了,这可以减少 app 大小,同时提高性能。您不需要为这个变更,更新任何内容,但如果您遇到 构建 或 运行时 失败,那您应该仔细检查您的 keep 规则,以确保其配置正确。有关如何配置 keep 规则的指南,请参阅 缩小、混淆和优化您的应用。
结语
总而言之,这些就是为使用 AGP 8.0 的 Android Studio Flamingo 版本,准备 app 构建的五种方法。如果您开发插件的话,请阅读我们的 博文 ,以了解插件变更。如果您想了解有关 构建变更 的更多信息,请观看来自 Android Dev Summit '22 的 视频。
代码片段许可证:
对于很多刚学习ANDROID的小伙伴来说,很多人对于Android Studio的安装都不太熟悉,这里针对Androider也准备了Android Studio视频教程和Android Studio最新的安装包。