在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初始化时机:
Application
类的attachBaseContext()
方法中。这样做可以确保在任何自定义类加载之前完成热更新相关的初始化。@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果使用了MultiDex,先调用MultiDex.install(base)
MultiDex.install(base);
// 然后初始化Sophix
SophixManager.getInstance().initialize(this, "YourAppId", new Callback() {
// 初始化回调逻辑
});
// 如果有query操作,依然建议在onCreate中执行,但需保持在所有可能引用自定义类的代码之前
}
避免提前加载自定义类:
attachBaseContext()
之后、onCreate()
之前进行的任何操作,都应避免直接或间接引用自定义类(包括自定义的日志工具类等)。确保这一阶段仅使用系统类。处理MultiDex场景:
attachBaseContext()
中首先调用MultiDex.install(base)
,然后再进行Sophix的初始化。检查并调整其他初始化代码:
Application
类中的onCreate()
方法,确保所有可能触发自定义类加载的代码都放置在Sophix初始化及查询之后。测试与验证:
请记得替换示例代码中的"YourAppId"
为您的实际App ID,并根据实际情况调整Callback内的逻辑。希望这些建议能帮助您顺利解决遇到的问题。