全部产品
云市场
云游戏
    在7.0以上版本的手机系统上出现java.lang.Exception: ... abort cold fix异常

在7.0以上版本的手机系统上出现java.lang.Exception: ... abort cold fix异常

更新时间:2018-01-15 20:18:23

在7.0以上版本的手机系统上出现java.lang.Exception: … abort cold fix异常,应用崩溃,一般后面还会报出java.lang.ClassNotFoundException异常

问题

在7.0以上版本手机系统上出现java.lang.Exception: … abort cold fix异常,应用崩溃,一般后面还会报出java.lang.ClassNotFoundException异常

问题原因

在Android N以后的版本会对频繁使用的app进行jit操作,从而生成app image并更新oat文件。如果app image包含了补丁修改的class,就无法进行热更新。因为app在启动时会把这些类加入到PathClassloader的ClassTable中,系统在查找类时会直接使用base.apk中的class,最终导致修复不成功。
因此我们在7.0以上版本做了特殊处理来避免jit的影响,但是这种处理需要保证在Sophix初始化前不用到其他自定义类。另外有可能是冷启动修复在运行时开启了Instant Run或者安装包与打补丁的旧包不一致导致。

解决方案

首先确保Instant Run是关闭状态,并且安装在手机上的包与打补丁的旧包一致。

解决方法和4.4的pre-verify问题一样。Sophix初始化放在Application最前面,同时在初始化前的代码都要使用系统类而不使用自定义类(如自定义的logutil等)。

具体就是把initialize写到attachBaseContext里面,但query还是在onCreat的最前面;如果有用到MultiDex,直接继承Application,在attachBaseContext里写MultiDex.install(base),然后在onCreat的最前面initialize和query,如果还会出现这个崩溃,把initialize写到attachBaseContext的MultiDex.install(base)后面,但query还是在onCreat的最前面。仍然解决不了的可到钉钉群里寻求支持。
若上述步骤仍未能定位问题,可以询问技术支持解决:技术支持

或者直接改用稳健接入也可以避免这个问题。