您的当前位置:首页正文

Android 高版本 androidx 引发 D8 Cannot invoke “String.length()“ because “<parameter1>“ is null 问题解决

2024-11-13 来源:个人技术集锦

快速介绍一个 Andorid 升级适配的 Bug ,如果你近期升级某些库的时候,出现了无法编辑,提示类似 D8 Cannot invoke "String.length()" ,那么恭喜你,你遇到了 androidx 高版本的兼容 bug。

类似的 bug 会出现在一些高版本的 androidx 相关库文件中,如:

  • Failed to transform camera-extensions-1.4.0-alpha05.aar

  • Failed to transform lifecycle-livedata-core-2.8.0.aar

  • Failed to transform appcompat-resources-1.7.0.aar

  • ···

如果升级的库包含以上 package 都可能触发 R8/D8 的 bug,因为 androidX 之前已经开始升级到了 JDK 21,其中有些已经包含,但在旧版 AGP 中没有正确处理。

解决办法之一是升级到 AGP 8.3+ 之后,因为问题在 8.3.3-dev 里修复了问题,修复作为 AGP 8.3 的一部分,对于 AGP 8.1 和 8.0 它也向后移植支持,对应版本是 8.1.44 和 8.0.46 ,解决的 fix 也很简单,就是针对 Null 情况做了适配。

当然,这个 fix 没有移植到 AGP 7.4 的 D8/R8 ,但是如果你真的需要,理论上应该能够将 D8/R8 的 8.0.44 或 8.1.44 与 AGP 7.4 结合使用,使用特定的 D8/R8 版本,可以将以下代码合并到 settings.gradlesettings.gradle.kts

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:8.1.44")
        }
    }
}

不得不说,这种问题的修复很简单,但是波及层面还是挺广的, Cannot invoke "String.length()" because "<parameter1>" is null 这样的问题也很让人摸不着头脑,这些年 Kotlin 和 AGP 的发展变化还挺大的,造成的版本兼容问题也是一言难尽,只能说老项目能不动就不动,因为某些第三方库升级依赖的时候,也许真的没有考虑那么多。

比如 Flutter 的某插件,升级后就因为无端端升级 appcompat 到 1.7 导致无法编译的 bug,最终只能紧急发布一个降级依赖的 hotfix 。

参考资料:

  • https://bugs.openjdk.org/browse/JDK-8308450

  • https://issuetracker.google.com/issues/336164417

  • https://issuetracker.google.com/issues/342522142

Top