Open usherdl opened 4 years ago
补丁下发的时候,有没重新校验版本合法性啊?? 我之前遇到过找不到类和方法的问题,因为已经安装了补丁2的APP,居然还能收到补丁1的下发。所以必须设置自动合成==false,校验版本合法性后再调用手动合成方法。
@liangdong9676 ,测试阶段测过两台机器 补丁都一切正常。 不太明白你说的 校验版本合法性
是什么意思 , 出现问题后测了多台机器都正常 , 只找到一台能复现 crash 的机器。
当前基准 只有这一个补丁
异常类型:
手机型号:小米 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 日志 文件都在 , 关于日志以及其他 编译生成的文件可能包含敏感信息 希望可以邮件沟通。 谢谢