Kotlin 混合运行时 ABI

问题背景

AGP 完整游戏由两部分组成:

  1. 官方 3.21.0 混淆 DEX 转换而来的游戏类;
  2. MOD 新增 Kotlin 业务类(约 25 个)。

两者对 Kotlin 运行时的 ABI 假设不同,直接混用会出现:

  • NoSuchFieldError: EmptyCoroutineContext.a(官方字段名是 a,stdlib 是 INSTANCE)
  • NoSuchMethodError: ContinuationImpl.<init>(Lrj0;Lek0;)V(默认包混淆参数类型)

真实描述符(已核实)

符号官方 DEX 形态AGP stdlib 形态
EmptyCoroutineContext静态字段 aINSTANCE
ContinuationImpl 构造器(Lrj0;Lek0;)V(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V
CoroutineSingletonsaCOROUTINE_SUSPENDED

rj0 = kotlin.coroutines.Continuation,ek0 = CoroutineContext(默认包混淆名)。

解决路线(R113 定稿)

  • 72 个官方 Kotlin 类被统一改名为 oreki/shadow/kotlin/**,新增类全部绑定 shadow 形态。
  • 构建期守卫 scripts/agp/check_a_batch_abi.py 对 A 批 5 类逐条断言 ABI,违反即构建失败。
  • 官方类转换必须保持 R107 J8 混合形态:enjarify 为基线,少量协程调度热路径类(ox0/gk0/dc2/tf2/vf2/t01)
    用 dex2jar 版本。全量 enjarify 会让逻辑线程在 SpeedrunMilestone 协程链 livelock;
    全量 dex2jar 会因 new 子类 + invoke-direct 父类构造器 被改写而 ART VerifyError。

证据

状态:已验证
证据等级:实测(AVD 线程栈 + 构建守卫)
适用版本:Android 3.21.0 / AGP 9.5.1
来源 Commit:ae734966bf712faca3ff7bbb389d8724a8efe7e5(PR 88)
验证:本地 APK f2f72a61;新档首写 40.2s;5 分钟自动化 0 ABI 崩溃

相关

coroutine-abi · agp · android · dex-abi