开发者社区 问答 正文

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



在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的最前面。仍然解决不了的可到钉钉群里寻求支持。若上述步骤仍未能定位问题,可以询问技术支持解决: 技术支持

展开
收起
猫饭先生 2017-10-24 11:34:49 1854 分享 版权
阿里云 AI 助理回答

面对在Android 7.0及以上版本系统上出现的java.lang.Exception: ... abort cold fix异常,这通常与热更新技术(如阿里云的Sophix)和Android系统的即时编译器(JIT)机制冲突有关。根据您描述的问题原因和解决方案,这里提供一些具体的实施步骤和建议,结合阿里云产品——阿里云移动热修复Sophix的使用场景:

解决方案实施步骤

  1. 确保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中执行的初始化操作
    }
    
  2. 避免提前引用自定义类

    • attachBaseContext及之前的方法中,确保不直接或间接引用任何自定义类(包括自定义日志工具、业务逻辑类等),以防止这些类被提前加载到PathClassLoader的ClassTable中,导致后续热更新失效。
  3. 查询补丁状态

    • 尽管按照上述步骤进行了初始化,但查询补丁状态(queryAndLoadNewPatch())的操作应放在onCreate()方法的最前面,以保证在应用的其他部分运行前,补丁有机会被正确加载。
    @Override
    public void onCreate() {
       super.onCreate();
       // 查询并加载新补丁
       SophixManager.getInstance().queryAndLoadNewPatch();
       // 应用的其他初始化操作
    }
    
  4. 处理MultiDex情况

    • 如果您的应用支持多DEX文件,确保MultiDex.install(base)调用在SophixManager.initialize()之前完成,因为MultiDex的安装也会影响类加载顺序。
  5. 进一步排查与求助

    • 如果遵循以上步骤后问题仍然存在,建议检查是否有其他第三方库或组件也在早期初始化过程中可能引入了自定义类的加载。
    • 加入阿里云提供的官方技术支持渠道,如钉钉群,获取更专业的帮助和指导。
    • 考虑收集详细的崩溃日志,并联系阿里云的技术支持团队进行深入分析。

通过上述措施,大多数因JIT优化导致的热更新失败问题应该能够得到解决。如果问题复杂,直接与阿里云技术支持沟通是获取针对性解决方案的最佳途径。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答