Android Gradle 插件8.0.0(2023年4月)
刚刚发现,新创建的一个Android项目,成功运行到手机上了,然后在代码中想使用一下BuildConfig
这个类,发现没有,按以前的经验,项目刚创建时BuildConfig
是不存在的,但是一但成功运行到手机上后就肯定是已经自动生成了的,但是这次是真没有这个类,如果在代码中不理会报错直接使用BuildConfig
,运行将会失败,会提示找不到这个类。
几经周折,发现是在Android Gradle Plugin 8.0
(简称AGP 8.0
)版本的时候发生了改变,运行AGP 8.0
需要JDK 17
,官网链接:https://developer.android.google.cn/build/releases/gradle-plugin#8-0-0,这里我们顺便把AGP 8.0
的其他功能也一起记录一下,这里只记录了其中一部分主要功能,完整的还请查看官网。
Android Gradle 插件 8.0.0 是一个主要版本,包含各种新功能和改进。
兼容性
最小版本 | 默认版本 | 备注 | |
---|---|---|---|
Gradle | 8.0 | 8.0 | 查看更新Gradle学习更多 |
SDK Build Tools | 30.0.3 | 30.0.3 | 安装或配置SDK构建工具 |
NDK | N/A | 25.1.8937393 | 安装或配置不同版本的NDK |
JDK | 17 | 17 | 查看设置JDK版本学习更多 |
重大更改:模块级构建脚本中需要命名空间
之前是在清单文件中通过package
设置命名空间,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.helloworld">
新版本设置官网链接:https://developer.android.google.cn/studio/build/configure-app-module?hl=zh-cn#set-namespace
每个 Android 模块都有一个命名空间,此命名空间为Kotlin
或Java
包名,用于产生R
和BuildConfig
类。
命名空间由模块的 build.gradle
文件中的 namespace
属性定义,如以下代码段所示。namespace
最初会设为您在创建项目时选择的软件包名称。
android {
namespace "com.example.myapp"
...
}
重大更改:构建选项默认值
从 AGP 8.0
开始,这些标志的默认值已更改以提高构建性能。要升级AGP
请使用AGP Upgrade Assistant
(Tools
> AGP Upgrade Assistant
)。升级助手将指导您更新代码以适应新行为或设置flags
以保留以前的行为。
Flag | 新的默认值 | 以前的默认值 | 说明 |
---|---|---|---|
android.defaults.buildfeatures.buildconfig | false | true | AGP 8.0 默认不产生BuildConfig |
android.defaults.buildfeatures.aidl | false | true | AGP 8.0 默认不启用AIDL 支持 |
android.defaults.buildfeatures.renderscript | false | true | AGP 8.0 默认不启用RenderScript 支持 |
android.nonFinalResIds | true | false | AGP 8.0 默认使用non-final fields 产生R 类 |
android.nonTransitiveRClass | true | false | AGP 8.0仅为当前模块中定义的资源生成R类。 |
android.enableR8.fullMode | true | false | AGP 8.0 默认启用 R8 完整模式。更多详情请参见 R8全模式。 |
在这里可以看到android.defaults.buildfeatures.buildconfig
标志以前默认值为true
,到APG8.0版本后默认为false
,也就是说现在默认是不会生成BuildConfig.java
文件了,那如何配置它生成BuildConfig.java
文件呢?在官网链接有说到:https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BuildFeatures#buildconfig,如下:
abstract var buildConfig: Boolean?
标志启用/禁用
BuildConfig
类的生成。
将值设置为null重置为默认值。默认值为true。
您可以通过在构建根项目的gradle.properties
文件中添加一行
android.defaults.buildfeatures.buildconfig=true
来覆盖构建中所有项目的默认设置。
更多关于这个特性的信息在:TBD,TBD(To Be Determined)意思为待定。
具体设置方式为:
-
在模块中设置,只对该模块生效:
android { buildFeatures { buildConfig = true } }
-
在
gradle.properties
中添加一行,对所有模块生效:android.defaults.buildfeatures.buildconfig = true
-
对于其它一些设置也是类似的,在Android开发者网站的官网搜索
BuildFeatures
,然后查看aidl
这个属性即可知道,如下:
新的设置插件
AGP 8.0.0-alpha09 引入了新的设置插件。设置插件可让您将全局配置(适用于所有模块的配置)集中在一处,因此您无需在多个模块中复制并粘贴配置。此外,您可以使用设置插件来创建工具 执行配置文件,或如何运行工具的不同指令,并在它们之间进行切换。
注意:该设置插件目前仅适用于 Groovy。
要使用设置插件,请在settings.gradle文件中应用该插件:
apply plugin 'com.android.settings'
集中全局配置
要配置全局配置,请在settings.gradle
文件中使用新的android块,如下:
android {
compileSdk 31
minSdk 28
...
}
运行 AGP 8 需要 JDK 17.0
使用 Android Gradle Plugin 8.0 构建应用程序时,现在需要 JDK 17 才能运行 Gradle。Android Studio Flamingo 捆绑了 JDK 17 并配置 Gradle 默认使用它,这意味着大多数 Android Studio 用户不需要对其项目进行任何配置更改。
如果您需要在 Android Studio 内手动设置 AGP 使用的 JDK 版本 ,则需要使用 JDK 17 或更高版本。
当使用独立于 Android Studio 的 AGP 时,请通过设置环境变量JAVA_HOME
或使用-Dorg.gradle.java.home
命令行选项设置JDK17的安装目录来升级JDK版本。