Android Studio Flamingo と Android Gradle Plugin (AGP) 8.0 にアップグレードする場合、5 つの重要なビルド動作の変更に対応するために、アプリのビルド ファイルを更新する必要があります。
AGP アップグレード アシスタントは、これらの変更を行うのに役立ちます。これを使用する場合、ビルド動作の変更をオプトアウトするコード行を追加して、既存のビルド動作を維持することを提案します。これらのコード行を削除して、後で新しい動作に移行してください。
この記事ではbuild.gradle.kts
ファイルが、Groovy を使用している場合は、同じ変更がbuild.gradle
ファイルに適用されることに注意してください。変更点を見てみましょう。
DSL を使用して名前空間属性を宣言する
namespace
DSL 属性は、生成されたR
およびBuildConfig
、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 アップグレード アシスタントは、パッケージをpackage
Android マニフェストのプロパティからビルド ファイルのプロパティに移動することでnamespace
移行を支援します。
この変更を行った理由を理解するために、以前の動作を見てみましょう。
以前は、package
設定applicationId
と、これら 2 つのほとんど関連のない概念が不必要に結合されていました。
通过禁止在清单文件中设置 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 を必要とするモジュールまたはプロジェクト全体で AIDL または RenderScript を再度有効にすることができますが、RenderScript は Android 12 で廃止されるため、そこから移行する必要があることに注意してください。
// 在 gradle.properties 为整个项目设置 AIDL 和 RenderScript
+android.defaults.buildfeatures.aidl=true
+android.defaults.buildfeatures.renderScript=true
复制代码
デフォルトの R8 フル モード
最後の動作変更: R8 はデフォルトでフル モードになり、アプリのサイズが小さくなり、パフォーマンスが向上します。この変更のために何も更新する必要はありませんが、ビルドまたは実行時にエラーが発生した場合は、keepルールが正しく構成されていることを再確認する必要があります。保持ルールの設定方法については、アプリの縮小。
エピローグ
AGP 8.0 を使用して Android Studio の Flamingo バージョン用にアプリのビルドを準備する 5 つの方法をまとめると、次のようになります。プラグインを開発する場合は、プラグインの変更に関するブログ。ビルドの変更点について詳しく知りたい場合は、Android Dev Summit '22 のこのビデオとAGP リリース ノートをご覧ください。
コード スニペット ライセンス:
Copyright 2023 Google LLC.
SPDX-License-Identifier: Apache-2.0
复制代码