Android 高版本 androidx 引发 D8 Cannot invoke “String.length()“ beca ...

打印 上一主题 下一主题

主题 1008|帖子 1008|积分 3024

快速介绍一个 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 情况做了适配。
   也就是单纯升级某个 8.0 版本并不能办理题目,另外貌似 AGP 8.2.7 也有修复题目。
  

固然,这个 fix 没有移植到 AGP 7.4 的 D8/R8 ,但是如果你真的必要,理论上应该能够将 D8/R8 的 8.0.44 或 8.1.44 与 AGP 7.4 联合利用,利用特定的 D8/R8 版本,可以将以下代码合并到 settings.gradle 或 settings.gradle.kts :
  1. pluginManagement {
  2.     buildscript {
  3.         repositories {
  4.             mavenCentral()
  5.             maven {
  6.                 url = uri("https://storage.googleapis.com/r8-releases/raw")
  7.             }
  8.         }
  9.         dependencies {
  10.             classpath("com.android.tools:r8:8.1.44")
  11.         }
  12.     }
  13. }
复制代码
不得不说,这种题目的修复很简单,但是波及层面还是挺广的, 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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表