原文链接。

当您晋级到 Android Studio Flamingo 和 Android Gradle 插件 (AGP) 8.0 时,您需求更新您的 app 构建文件以习惯五个重要的构建行为更改。

AGP 晋级帮手 能够协助您完成这些更改。当您运用它时,它会主张经过添加代码行来挑选退出构建行为更改,来保存现有的构建行为。稍后经过删去这些代码行搬迁到新行为。

请注意,在本文中咱们指的是 build.gradle.kts 文件,但假如您运用的是 Groovy,则相同的更改适用于 build.gradle 文件。让咱们来看看这些改变。

运用 DSL 声明命名空间特点

namespace DSL 特点代表生成的 RBuildConfig 类的 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特点来协助您进行搬迁。

为 Android Studio Flamingo(火烈鸟)版本准备你的 app 构建的 5 种方法

要了解咱们为什么要进行此更改,让咱们看看之前的行为。

曾经,package 特点同时用于设置 applicationId 和资源命名空间,不必要地耦合这两个简直不相关的概念。

经过禁止在清单文件中设置 package 称号并引进 namespace 特点,咱们将用于您app标识的 applicationId 从资源命名空间中分离出来。这阐明晰命名空间值的来历,并让您在不影响您的 applicationId 的状况下重构app的代码和资源

为 Android Studio Flamingo(火烈鸟)版本准备你的 app 构建的 5 种方法

验证 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)。

为 Android Studio Flamingo(火烈鸟)版本准备你的 app 构建的 5 种方法

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

为 Android Studio Flamingo(火烈鸟)版本准备你的 app 构建的 5 种方法

在非传递行为中,每个库模块 R 类仅包括模块自身声明的资源,然后减少了该模块的R 类的巨细。

为 Android Studio Flamingo(火烈鸟)版本准备你的 app 构建的 5 种方法

仅对需求的模块启用 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 相似,AIDLRenderScript 默认处于关闭状态。 要为特定模块启用它们,请在模块的 build.gradle.kts 文件的 android {} 块中将 aidlrenderScript 选项设置为 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