我提了一个 Androidx IssueTracker

发布于:2025-04-09 ⋅ 阅读:(33) ⋅ 点赞:(0)

在这里插入图片描述

问题

在运行 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 版本一起发布的)