背景:从Android14(目标版本设置为target34)开始,AGP要求8.0以上,升级AGP的目的是为后续更新做准备。 改动分为两个大部份,一个是必然涉及的修改,第二个是我的项目中遇到的问题。
必然涉及的修改
升级AGP版本
- agp7.2.1 -> 8.0
- gradle7.3.3 -> 8.0
指定JAVA版本17
首先是gradle的编译版本,JDK改为17
其次是指定各模块的版本
听说如果有很多个模块的话可以在gradle.properties里统一配置,但我不会,我让AI帮我我一个个模块改的,也挺快。
android{
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
namespace 修改
删除各module的 AndroidManifext 里的package, 如 package="com.google.email",改为gradle里的namespace:
android {
namespace 'com.google.email'
}
关于R资源引用问题
这个问题参考的这篇博客
一、资源id默认不再是final类型
AGP8.0开始资源id默认不再是final类型,改为动态生成,这会影响到java的switch-case语句,解决方案:
- 方案一、修改java代码,把原来的switch-case改为if-else
- 方案二、在gradle.properties里加上
android.nonFinalResIds=false禁用资源id动态生成
二、其他模块的R资源需要指定完整路径
8.0开始引用其他模块的R资源需要指定完整路径,如:android.R.xxx,解决方案还是一样,要么直接改代码,要么禁用,也是在在gradle.properties里加上 android.nonTransitiveRClass=false
BuildConfig类生成
agp8默认不会自动生成 BuildConfig 类,如果有需要可以这样配置:
android{
buildFeatures {
// 用于生成BuildConfig类
buildConfig = true
}
}
我的项目中遇到的问题
GreenDao插件问题
我的greenDao插件版本是org.greenrobot:greendao-gradle-plugin:3.3.0,
升级到3.3.1即可解决。
Deprecated警告
警告内容:
警告: [dep-ann] 未使用 @Deprecated 对已过时的项目进行注释
这其实不影响编译不算问题,但是警告的字体却是红色的看着难受所以列出来;出现这个的原因是只在注释里加了@deprecated没有在代码上加@Deprecated,如下面的代码就会有编译警告:
/**
* @deprecated
*/
class A{
}
- 解决方案一:加上
@Deprecated, 如:
/**
* @deprecated
*/
@Deprecated
class A{
}
- 解决方案二:取消deprecated检查
android{
lintOptions {
disable 'DeprecatedMethod'
disable 'DeprecatedClass'
abortOnError false
}
}
ARouter路由sdk不支持agp8
由于阿里的ARouter已不再更新,升级apg8后会报如下错误:
Execution failed for task ':app:transformClassesWithCom.alibaba.arouterForSitAppCNDebug'. java.lang.UnsupportedOperationException: NestHost requires ASM7
我的方案是使用货拉拉的TheRouter,因为它提供了ARouter迁移TheRouter的插件,且api基本相同代码工作量较小,功能似乎也挺稳定;具体配置方案可以看官方文档
TheRouter与'org.bouncycastle:bcprov-jdk15on:1.55'冲突
这是TheRouter引起的一个问题,我的项目有个第三方sdk依赖了bouncycastle,我也不知道它具体用了什么功能所以也不敢把这个bouncycastle去掉,具体报错如下:
Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: /Users/john/AndroidStudioProjects/AppGradle8/app/build/intermediates/classes/sitAppCNDebug/ALL/theRouterTransformWithSitAppCNDebug/classes.jar:org/bouncycastle/asn1/ASN1GeneralizedTime.class at Version.fakeStackEntry(Version_8.5.35.java:0) Caused by: com.android.builder.dexing.DexArchiveBuilderException: Failed to process: /Users/john/AndroidStudioProjects/appGradle8/app/build/intermediates/classes/sitAppCNDebug/ALL/theRouterTransformWithSitAppCNDebug/classes.jar
Caused by: com.android.builder.dexing.DexArchiveBuilderException: Error while dexing.
at com.android.tools.r8.T.a(R8_8.5.35_9c55004e7c41a17b1ed47c4e1952cb6778b3dac6afb6afc113a2737c3cde13e0:5) at com.android.tools.r8.internal.to.a(R8_8.5.35_9c55004e7c41a17b1ed47c4e1952cb6778b3dac6afb6afc113a2737c3cde13e0:82) at com.android.tools.r8.internal.to.a(R8_8.5.35_9c55004e7c41a17b1ed47c4e1952cb6778b3dac6afb6afc113a2737c3cde13e0:32) at com.android.tools.r8.internal.to.a(R8_8.5.35_9c55004e7c41a17b1ed47c4e1952cb6778b3dac6afb6afc113a2737c3cde13e0:31) Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: /Users/john/AndroidStudioProjects/AppGradle8/app/build/intermediates/classes/sitAppCNDebug/ALL/theRouterTransformWithSitAppCNDebug/classes.jar:org/bouncycastle/asn1/ASN1GeneralizedTime.class
at com.android.tools.r8.internal.to.b(R8_8.5.35_9c55004e7c41a17b1ed47c4e1952cb6778b3dac6afb6afc113a2737c3cde13e0:2) at com.android.tools.r8.D8.run(R8_8.5.35_9c55004e7c41a17b1ed47c4e1952cb6778b3dac6afb6afc113a2737c3cde13e0:11) at com.android.builder.dexing.D8DexArchiveBuilder.convert(D8DexArchiveBuilder.java:125)
TheRouter官方提供了解决方案:TheRouter给的方案,试了没用;
我的解决方案是升级 bouncycastle 版本:
org.bouncycastle:bcprov-jdk15on:1.55 改为 org.bouncycastle:bcprov-jdk16:1.46,不知道对具体功能有没有影响,反正是不报错了。
fat-aar 插件版本更新及PermittedSubclasses requires ASM9
为了避免重复开发,我们的app需要整个打包成一个aar包给其他部门app使用,所以会用到这个fat-aar打包插件,一直用的是com.github.kezong:fat-aar:1.3.8,但和ARouter一样也不维护了,好在有个大佬fork了代码做了APG8.0以上版本适配,这是 github地址,具体依赖的插件版本:com.github.aasitnikov:fat-aar-android:1.4.1; 依赖后报错误:
PermittedSubclasses requires ASM9,
这个问题一直不知道怎么解决,AI建议我升级Gradle试试(这是这次agp升级过程中AI经常给的建议),于是我从8.0升级到8.3,不行,又从8.3升级到8.5,解决!最终升级到的版本是
AGP8.5、Gradle8.7
感觉是fat-aar-android这个插件所谓的适配其实是强绑定了AGP版本,算了,能解决问题就行。
以上。
参考及感谢: