AGP8.0升级问题记录

128 阅读4分钟

背景:从Android14(目标版本设置为target34)开始,AGP要求8.0以上,升级AGP的目的是为后续更新做准备。 改动分为两个大部份,一个是必然涉及的修改,第二个是我的项目中遇到的问题

必然涉及的修改

升级AGP版本

  • agp7.2.1 -> 8.0
  • gradle7.3.3 -> 8.0

指定JAVA版本17

首先是gradle的编译版本,JDK改为17

image.png

其次是指定各模块的版本

听说如果有很多个模块的话可以在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版本,算了,能解决问题就行。

以上。

参考及感谢: