Tencent / tinker

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Other
17.17k stars 3.34k forks source link

java.lang.NoSuchMethodError No virtual method setXXX(Z)V in class XXX ,有现场 能稳定复现 #1421

Open usherdl opened 4 years ago

usherdl commented 4 years ago

异常类型:

java.lang.NoSuchMethodError

No virtual method setXXX(Z)V in class L _package/entity/ProvinceCityEntity; or its super classes (declaration of '_package.ProvinceCityEntity' appears in base.apk!classes3.dex)

手机型号:小米 Mix 2

手机系统版本:Android 9.0

tinker版本:1.9.14.5

gradle版本:3.2.0

是否使用热更新SDK: Bugly SDK & 自有方式两种方式下发补丁

系统:Mac

堆栈/日志:

使用 tinker版本 最近半年无改动, 本期上线之后 也遇到了需要发补丁修复的场景

补丁包内类 ProvinceCityEntity 新增 字段以及 get set 方法 ,按照我们的上线流程 第一步补丁下发到指定设备过测试, 测试 honor8 android8 跑过流程没有问题正常 不定上线 。 第一次下发5w 设备 一小时内收到大量crash 。 紧急停掉补丁 分析原因。初步结论 补丁包里的类部分生效,部分没有生效。

关于数据,补丁激活 大概3w , crash 场景不会所有用户都会走到,算一半 1.5w 。 后bugly 收集到 1.1w crash , 几乎可以认为是必现。bugly 数据 Android 10 4.8w 次crash ,Android 9 1.6w次 , Android 8 6k次crash ,7.1.1 35次crash。 华为机型比例巨大

我们本地测试找到了必现的机器 小米 Mix 2 Android 9.0、

目前收集到的线索,apk 共有5个 dex ,基准包 ProvinceCityEntity 在dex3 中,但是 补丁包 该类 ProvinceCityEntity 在dex5 中 。从 crash 堆栈来看也是在 dex3 中(base3.apk) 中找到了ProvinceCityEntity 但是没有找到 新增的字段set 方法。

tinker 介绍的文章是dex 全量替换,暂时不清楚这个全量替换是 补丁的 dex3 跟 基准 dex3 合并,还是如何全量替换。

我看过 PathClassLoader , tinker_classN.apk 在element 数组最前面理论上不会出现加载一半的情况。因为并不是所有机型必现。所以上述的 dex3 跟 dex3 合并问题推论应该是不成立的。

dex.log 看过了, 没看到任何异常信息

Class L_package/entity/ProvinceCityEntity; will be added into changed classes dex ...

在之前基准上 重新打补丁依旧有此问题, 因为 release 包没法debug ,能root的机器都是低版本复现不了现场 问题很难查。尝试过重新打一个基准,基准包加入debugable 标记, 这个时候 ProvinceCityEntity 出现在了补丁包的 dex3 中, 不能复原现场 也就是不会crash 。

尝试过 基准稍作改动,在同一台机器上打基准 & 打原补丁内容 ,还是会crash 依旧是release包没法调试

目前现场都在,复现路径 都很明确, outputs/apk/tinkerpatch/release 日志 文件都在 , 关于日志以及其他 编译生成的文件可能包含敏感信息 希望可以邮件沟通。 谢谢

liangdong9676 commented 4 years ago

补丁下发的时候,有没重新校验版本合法性啊?? 我之前遇到过找不到类和方法的问题,因为已经安装了补丁2的APP,居然还能收到补丁1的下发。所以必须设置自动合成==false,校验版本合法性后再调用手动合成方法。

usherdl commented 4 years ago

@liangdong9676 ,测试阶段测过两台机器 补丁都一切正常。 不太明白你说的 校验版本合法性 是什么意思 , 出现问题后测了多台机器都正常 , 只找到一台能复现 crash 的机器。

当前基准 只有这一个补丁