升级到AGP8.0,JDK17

1.使用 DSL,来声明命名空间属性

namespace DSL 属性,代表生成的 R 和 BuildConfig 类的 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 = 34
    ...
}

Android Studio AGP 升级助手,将通过把包从 Android 清单的package属性,移动到构建文件中的 namespace 属性,来帮助您进行迁移。


image.png

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

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

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

image.png

2.验证在默认情况下,对于库模块来说,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)。


image.png

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

3.仅对需要的模块启用 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。

4.为有(AIDL 和 RenderScript)需求的模块,启用 AIDL 和 RenderScript

与 BuildConfig 类似,AIDL 和 RenderScript 默认处于关闭状态。要为特定模块启用它们,请在模块的 build.gradle.kts 文件的 android {} 块中,将 aidl 和 renderScript 选项设置为 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

5.默认情况下,R8已经是完整模式了

最后一个行为变化:R8 现在默认就是完整模式了,这可以减少 app 大小,同时提高性能。您不需要为这个变更,更新任何内容,但如果您遇到 构建 或 运行时 失败,那您应该仔细检查您的 keep 规则,以确保其配置正确。有关如何配置 keep 规则的指南,如果您需要所有模块,仍保持旧的行为,请在您的 gradle.properties 文件中设置

android.enableR8.fullMode=false
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容