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

原文链接

当您升级到 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属性来帮助您进行迁移。

1_aGl-XX_Pzk6O3x8iQX2kpA.webp

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

以前,package 属性同时用于设置 applicationId 和资源命名空间,不必要地耦合这两个几乎不相关的概念。

通过禁止在清单文件中设置 package 名称并引入 namespace 属性,我们将用于您app标识的 applicationId 从资源命名空间中分离出来。这阐明了命名空间值的来源,并让您在不影响您的 applicationId 的情况下重构app的代码和资源

1_oy9XphDn18TVZkCMs-2KUg.webp

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

1_UZ8qotL7zi_dHDTcSDKjEQ.webp

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

1_ZYbmlhTw-HFplcaiQgRVCA.webp

在非传递行为中,每个库模块 R 类仅包含模块本身声明的资源,从而减少了该模块的R 类的大小。

1_eDKdzO7RTLcnO2F-lY7sKg.webp

仅对需要的模块启用 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
复制代码

猜你喜欢

转载自juejin.im/post/7223767530980671525