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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

验证在默认情况下,对于库模块来说,R 类是不可传递的

库模块的 R 类现在默认是不可传递的,这意味着每个 R 类只包含库模块本身声明的资源,而不是来自其依赖项的资源。这意味着您在引用资源时,必须使用完全限定的命名空间来调用。

gradle.properties 文件中的 nonTransitiveRClass 标志控制着 R 类的行为。从 AGP 8.0 开始,未指定时为 true,因此 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)需求的模块,启用 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 规则,以确保其配置正确。有关如何配置 keep 规则的指南,请参阅 缩小、混淆和优化您的应用


结语

总而言之,这些就是为使用 AGP 8.0 的 Android Studio Flamingo 版本,准备 app 构建的五种方法。如果您开发插件的话,请阅读我们的 博文 ,以了解插件变更。如果您想了解有关 构建变更 的更多信息,请观看来自 Android Dev Summit '22 的 视频

代码片段许可证:

Copyright 2023 Google LLC.
SPDX-License-Identifier: Apache-2.0

对于很多刚学习ANDROID的小伙伴来说,很多人对于Android Studio的安装都不太熟悉,这里针对Androider也准备了Android Studio视频教程和Android Studio最新的安装包。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值