快速介绍一个 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.gradle
或 settings.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