问题
在运行 gradle plugin 插件的 transform R8
阶段出现了报错
Caused by: com.android.tools.r8.internal.xk: java.lang.NullPointerException: Cannot invoke “String.length()” because “” is null
报错日志
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:minifyCommonReleaseWithR8'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.R8Task$R8Runnable
> Compilation failed to complete, origin: D:\download\250310\agp7mbFix\app\build\intermediates\transforms\CheckPluginTransform\common\release\27.jar
> :androidx/appcompat/graphics/drawable/DrawableContainerCompat$1.class
//略略略
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.tasks.R8Task$R8Runnable
//略略略
Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin:
D:\download\250310\agp7mbFix\app\build\intermediates\transforms\CheckPluginTransform\common\release\27.jar
:androidx/appcompat/graphics/drawable/DrawableContainerCompat$1.class
//略略略
Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "<parameter1>" is null
//略略略
Caused by: java.util.concurrent.ExecutionException: com.android.tools.r8.internal.xk: java.lang.NullPointerException: Cannot invoke "String.length()" because "<parameter1>" is null
//略略略
Caused by: com.android.tools.r8.internal.xk: java.lang.NullPointerException: Cannot invoke "String.length()" because "<parameter1>" is null
环境
看日志便知道报错是在 R8 优化阶段
看看我当前的打包环境,AGP7+ 的工程
- AGP:7.4.2
- Gradle:7.6.4
分析
看报错的这个类属于哪一依赖 jar 里面:androidx/appcompat/graphics/drawable/DrawableContainerCompat$1.class
找到他是来自于依赖:androidx.appcompat:appcompat-resources:1.7.0
这个依赖最终是谁引入的呢?来自 androidx.appcompat:appcompat
+--- androidx.appcompat:appcompat:1.2.0 -> 1.7.0
| +--- androidx.activity:activity:1.7.0 -> 1.9.2
| +--- androidx.appcompat:appcompat-resources:1.7.0
查看官方发布的版本日志,目前最新版本就是 1.7.0
那么先尝试降低一个版本打包会不会也有这个问题呢?
强制指定版本依赖 1.6.0
,最终打包成功 ✌️
那么问题来了
一开始我还以为是因为我的插件 transform 存在问题导致打包报错
现在看来并不是我插件影响
难道我后续打包都要使用低版本吗?
接着又发现另外一个依赖也存在同样的问题: androidx.viewpager2:viewpager2:1.1.0
没错,我还是选择先降版本打包,使用 1.0.0
打包果然是正常的
小结
所以临时解决版本发降版本打包
- androidx.appcompat:appcompat-resources:1.7.0 -> androidx.appcompat:appcompat-resources:1.2.0
- androidx.appcompat:appcompat:1.7.0 -> androidx.appcompat:appcompat:1.2.0
- androidx.viewpager2:viewpager2:1.1.0 -> androidx.viewpager2:viewpager2:1.0.0
但是总不能一直降版本打包吧,所以创建了一个 IssueTracker
详细描述看链接:NullPointerException compiling with R8 4.0.52
可能需要 VPN 才能访问
我对这个 Issue 做一个简单的总结
解决方案
方案一
- 当前
AGP 7.4.2
你需要升级R8 4.0.72
版本
Android Studio 工程使用指定的 R8 版本:Replacing R8 in Android Gradle plugin
pluginManagement {
buildscript {
repositories {
mavenCentral()
maven {
url = uri("https://storage.googleapis.com/r8-releases/raw")
}
}
dependencies {
classpath("com.android.tools:r8:4.0.72")
}
}
}
方案二
- 我上面提到的,降低 androidx 模块版本
方案三
- 升级 AGP 版本(因为 AGP 是固定搭配 R8 版本一起发布的)