快速介绍一个 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
:
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 "
这样的问题也很让人摸不着头脑,这些年 Kotlin 和 AGP 的发展变化还挺大的,造成的版本兼容问题也是一言难尽,只能说老项目能不动就不动,因为某些第三方库升级依赖的时候,也许真的没有考虑那么多。
比如 Flutter 的某插件,升级后就因为无端端升级 appcompat 到 1.7 导致无法编译的 bug,最终只能紧急发布一个降级依赖的 hotfix 。
参考资料:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/22027,转载请注明出处。
评论0