一、必要性
android build-tools升级到31.0.0(S)后,会强制要求升级到gradle7,否则无法编译。gradle7废弃了大量的api,增加了更严格的安全限制,导致适配难度较大。
使用gradle7:
在gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
然后修改gradle-build版本7.0.0+
prop_gradleVersion=7.0.3
二、适配
2.1 maven适配
gradle7不推荐使用http协议,内部的maven不支持https,添加以下配置即可
maven {
// 允许使用http协议
allowInsecureProtocol = true
url mavenUrlRelease
}
2.1.1 PC maven适配
PC maven如果是原来的方式,还是会查找http的仓库,需要修改如下:
在settings.gradle中:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven {
allowInsecureProtocol = true
url mavenUrlRelease
}
}
}
之后删除根build.gradle的allprojects配置
2.2 gradle插件适配
说明:如果是其他插件编译报错,尝试更新到最新版本
gradle7对增量编译更严格,要求所有的插件都具备增量编译的功能。所有的属性,都必须添加注解的。
适配方法:
- 添加static,变成静态常量
- 添加 @Internal注解,跳过检测,但是会导致增量编译效果不佳。
- 添加 @Input注解,表示是输入文件夹
- 详情:https://cloud.tencent.com/developer/article/1787558
2.3 JDK适配
gradle7强制要求使用java11,本地需要修改用JDK为Java11;
2.4 其他问题记录
2.4.1 res没压缩,导致apk增大,或者res文件被混淆了
在gradle.properties
# Ensure that resources in `res` are not optimization
android.enableResourceOptimizations=false
2.4.2 so没压缩,导致apk增大
<application
android:extractNativeLibs="true">
2.4.3 dex没压缩
<application
android:useEmbeddedDex ="false">
在android标签内
//需要android标签内
packagingOptions {
dex {
useLegacyPackaging = true
}
}
2.4.4新版android studio,没有gradle任务了
新版默认不创建任务,提高构建性能,可以通过以下方式开启。开启后会导致sync变慢 Settings->Experimental-Gradle-Do not build Gradle tasks list during Grade snc
2.4.5“manifest merger failed with multiple errors see logs”
升级版本:
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
2.4.6 android:exported needs to be explicitly specified for <activity>
使用Action的activity、service、Broadcast等必须声明exported