在7.0以上版本的手机系统上出现java.lang.Exception: … abort cold fix异常
问题
在7.0以上版本手机系统上出现java.lang.Exception: … abort cold fix异常,应用崩溃
问题原因
在Android N以后的版本会对频繁使用的app进行jit操作,从而生成app image并更新oat文件。如果app image包含了补丁修改的class,就无法进行热更新。因为app在启动时会把这些类加入到PathClassloader的ClassTable中,系统在查找类时会直接使用base.apk中的class,最终导致修复不成功。因此我们在7.0以上版本做了特殊处理来避免jit的影响,但是这种处理需要保证在Sophix初始化前不用到其他自定义类。
解决方案
解决方法和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的最前面。仍然解决不了的可到钉钉群里寻求支持。若上述步骤仍未能定位问题,可以询问技术支持解决:
技术支持
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
面对在Android 7.0及以上版本系统上出现的java.lang.Exception: ... abort cold fix
异常,这通常与热更新技术(如阿里云的Sophix)和Android系统的即时编译器(JIT)机制冲突有关。根据您描述的问题原因和解决方案,这里提供一些具体的实施步骤和建议,结合阿里云产品——阿里云移动热修复Sophix的使用场景:
确保Sophix初始化时机:
SophixManager.initialize()
)放置在自定义Application
类的attachBaseContext(Context context)
方法中。这样做可以确保Sophix在应用启动的最早阶段完成初始化,减少与其他组件或自定义类加载的冲突。@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果使用了MultiDex,先调用MultiDex.install(base)
MultiDex.install(base);
// 然后初始化Sophix
SophixManager.getInstance().initialize(this, "您的AppId", "您的appSecret", new SamplePatchListener());
// 其他需要在attachBaseContext中执行的初始化操作
}
避免提前引用自定义类:
attachBaseContext
及之前的方法中,确保不直接或间接引用任何自定义类(包括自定义日志工具、业务逻辑类等),以防止这些类被提前加载到PathClassLoader的ClassTable中,导致后续热更新失效。查询补丁状态:
queryAndLoadNewPatch()
)的操作应放在onCreate()
方法的最前面,以保证在应用的其他部分运行前,补丁有机会被正确加载。@Override
public void onCreate() {
super.onCreate();
// 查询并加载新补丁
SophixManager.getInstance().queryAndLoadNewPatch();
// 应用的其他初始化操作
}
处理MultiDex情况:
MultiDex.install(base)
调用在SophixManager.initialize()
之前完成,因为MultiDex的安装也会影响类加载顺序。进一步排查与求助:
通过上述措施,大多数因JIT优化导致的热更新失败问题应该能够得到解决。如果问题复杂,直接与阿里云技术支持沟通是获取针对性解决方案的最佳途径。