Android Studio Flamingo リリース用にアプリ ビルドを準備する 5 つの方法

原文へのリンク

Android Studio Flamingo と Android Gradle Plugin (AGP) 8.0 にアップグレードする場合、5 つの重要なビルド動作の変更に対応するために、アプリのビルド ファイルを更新する必要があります。

AGP アップグレード アシスタントは、これらの変更を行うのに役立ちます。これを使用する場合、ビルド動作の変更をオプトアウトするコード行を追加して、既存のビルド動作を維持することを提案します。これらのコード行を削除して、後で新しい動作に移行してください。

この記事ではbuild.gradle.ktsファイルが、Groovy を使用している場合は、同じ変更がbuild.gradleファイルに適用されることに注意してください。変更点を見てみましょう。

DSL を使用して名前空間属性を宣言する

namespaceDSL 属性は、生成されたRおよびBuildConfig、Android マニフェストで以前に定義されたpackage属性。名前空間構成に移動するには、モジュール レベル ファイルのブロックnamespaceDSL を追加し、マニフェスト ファイルの属性を削除します。build.gradle.ktsandroid {}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 アップグレード アシスタントは、パッケージをpackageAndroid マニフェストのプロパティからビルド ファイルのプロパティに移動することでnamespace移行を支援します。

1_aGl-XX_Pzk6O3x8iQX2kpA.webp

この変更を行った理由を理解するために、以前の動作を見てみましょう。

以前は、package設定applicationIdと、これら 2 つのほとんど関連のない概念が不必要に結合されていました。

通过禁止在清单文件中设置 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似ており、既定AIDLではオフになっています。RenderScript特定のモジュールに対してそれらを有効にするにはbuild.gradle.ktsモジュールのファイルのブロックでおよびandroid {}オプションを に設定しますaidlrenderScripttrue

// 模块 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
复制代码

おすすめ

転載: juejin.im/post/7223767530980671525