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

今天傍晚,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指令,所以无法复用,字节码地址不同表明了这一点。

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

相关推荐
JMchen12319 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs20 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob20 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔20 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99620 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly1 天前
md模拟器安卓版带金手指2026
android
儿歌八万首1 天前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19431 天前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs1 天前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&1 天前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin