快速应用「幽灵调用」的正式修复

今天傍晚,Google将幽灵调用的修复正式合入到R8的诸多版本中,App终于可以用起来了。下面我简单介绍下,再讲下如何在App中快速应用。

整体情况

Google已将修复合入到以下几个R8版本中,注意,是R8版本,而非AGP(Android Gradle Plugin)版本:

  • 8.10.36
  • 8.11.28
  • 8.12.24
  • 8.13.10
  • 9.0.11-dev

对于R8 8.x系列,它们通常会随着 AGP的迭代进入正式版本。举个例子:AGP 目前最新版本是 8.13,未来如果继续发 8.13.1、8.13.2 等小版本,就有可能包含这次 R8 的修复。但也不排除某个大版本只发一次,如果没有新迭代,那这个 AGP 分支就不会带上修复。

而对于即将在下半年发布的 AGP 9.0,Google明确提到会包含此次修复。

当下的解决方案

未来版本什么时候发布我们无法完全确定,那现在该怎么办?

答案是:通过替换 R8 的方式来立即应用修复 。Google 官方提供了操作方法:r8.googlesource.com/r8/#replaci...

To override the embedded version with a prebuilt R8 with version , merge the following into the top level settings.gradle or settings.gradle.kts:

scss 复制代码
pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:<version>")
        }
    }
}

核心思路很简单:

  • Google 已经把这些修复过的 R8 版本存档在仓库:storage.googleapis.com/r8-releases...
  • 我们只需要在构建脚本里指定这个仓库,并在 classpath 中写入需要的 R8 版本号,就能让 AGP 使用我们指定的 R8,自然也就包含了修复。

实测验证

我在本地项目里亲测了一遍,配置如下:

arduino 复制代码
classpath "com.android.tools:r8:8.10.36"

然后打开 minifyEnabled,编译生成 release APK,并对其中的 classes.dex 执行:

复制代码
dexdump -d classes.dex

结果显示:

sql 复制代码
09a198:                    |[09a198] com.xxx.testdedupe.MyViewA.onDetachedFromWindow:()V
09a1a8: 6f10 540b 0100     |0000: invoke-super {v1}, Landroid/view/View;.onDetachedFromWindow:()V // method@0b54
09a1ae: 6300 0000          |0003: sget-boolean v0, LA/c;.a:Z // field@0000
09a1b2: 3800 0900          |0005: if-eqz v0, 000e // +0009
09a1b6: 6e10 c80a 0100     |0007: invoke-virtual {v1}, Landroid/view/View;.getAlpha:()F // method@0ac8
09a1bc: 0a00               |000a: move-result v0
09a1be: 6e20 900b 0100     |000b: invoke-virtual {v1, v0}, Landroid/view/View;.setAlpha:(F)V // method@0b90
09a1c4: 0e00               |000e: return-void
sql 复制代码
09a1fc:                    |[09a1fc] com.xxx.testdedupe.MyViewB.onDetachedFromWindow:()V
09a20c: 6f10 540b 0100     |0000: invoke-super {v1}, Landroid/view/View;.onDetachedFromWindow:()V // method@0b54
09a212: 6300 0000          |0003: sget-boolean v0, LA/c;.a:Z // field@0000
09a216: 3800 0900          |0005: if-eqz v0, 000e // +0009
09a21a: 6e10 c80a 0100     |0007: invoke-virtual {v1}, Landroid/view/View;.getAlpha:()F // method@0ac8
09a220: 0a00               |000a: move-result v0
09a222: 6e20 900b 0100     |000b: invoke-virtual {v1, v0}, Landroid/view/View;.setAlpha:(F)V // method@0b90
09a228: 0e00               |000e: return-void

虽然字节码内容完全一样,但因为有invoke-super指令,所以无法复用,字节码地址不同表明了这一点。

这就说明修复生效,幽灵调用的问题彻底解决。

相关推荐
向阳花开_miemie3 小时前
Android音频学习(二十)——高通HAL
android·学习·音视频
2501_925317133 小时前
博客SEO优化实战:从Google到百度,一套可复制的排名增长SOP
android·百度·rxjava
Charles豪3 小时前
MR、AR、VR:技术浪潮下安卓应用的未来走向
android·java·人工智能·xr·mr
2501_915921433 小时前
HTTPS 映射如何做?(HTTPS 映射配置、SNI 映射、TLS 终止、内网映射与 iOS 真机验证实战)
android·网络协议·ios·小程序·https·uni-app·iphone
TeleostNaCl3 小时前
SMBJ 简单使用指南 实现在 Java/Android 程序中访问 SMB 服务器
android·java·运维·服务器·经验分享·kotlin
小孔龙4 小时前
Kotlin 序列化:重复引用是技术问题还是架构缺陷?
android·kotlin·json
掘金一周4 小时前
2025年还有前端不会Nodejs ?| 掘金一周 9.25
android·前端·后端
2501_915106324 小时前
iOS 混淆与机器学习模型保护 在移动端保密权重与推理逻辑的实战指南(iOS 混淆、模型加密、ipa 加固)
android·人工智能·机器学习·ios·小程序·uni-app·iphone
低调小一5 小时前
从Android到iOS:启动监控实现的跨平台技术对比
android·ios·cocoa