开发者社区> 问答> 正文

【移动热修复】Sophix是否支持任何代码和资源的修复?

Sophix是否支持任何代码和资源的修复?

展开
收起
EMAS支持组 2022-09-27 13:24:19 322 0
1 条回答
写回答
取消 提交回答
  • 几乎都是支持的。但严格来说,也是有一些特殊情况:

    首先,SophixManager的initialize被调用之前的代码无法修复。很好理解,热修复框架都没加载起来,怎么可能修复到呢?所以最好的做法是把初始化放在Application.attachBaseContext中。

    并且,如果是冷启动加载(一般来说大多数情况都是),调用initialize的所在类无法被修复。快速接入情况下,初始化都会放在入口Application类里面,因此Application是无法修复的。还需注意的是,Application中直接用到的类无法增减方法和字段,原因是在odex之后,Application访问这些类时可能被优化为固定偏移,因此增减方法和字段会导致这些字段的偏移出错。因此建议减少Application直接用到的类,尽量把它们都封装到一个单独类里面,并且使用反射调用可以避免偏移优化。而如果采用稳健接入,可以直接初始化放在单独的StubApplication里面,就可以修复原有的Application了,因此推荐直接使用稳健接入以避免上述问题。

    其次,AndroidManifest.xml里面的变动无法修复。因为AndroidManifest.xml是由系统在安装App时解析,因此在运行时App无法修改它的逻辑的。所以四大组件的新增和修改以及其中主题资源等配置都无法修复到。除非用比较hack的方式预先留空和提早注册,而这种方式就显得不够优雅了,不过开发者可以自己在AndroidManifest里面预留些空组件,后续更新时直接添加组件类即可。

    对于资源,除了AndroidManifest.xml里面的资源不支持,通知栏图标、启动图标资源、RemoteViews以及getResources().getIdentifier()方式调用的资源,也不支持修复。原因是这类资源是由系统负责展示的,而系统只会在安装包中找资源,不会找到补丁包。尤其需要注意的是,如果通知的图标发生变动,会导致推送通知时因找不到资源而崩溃,因此每次打补丁时务必使得通知的图标不变。

    另外,Sophix里热修复框架本身的代码默认不进行修复。

    除这上述情况,其他方面的所有热修复都可以得到支持。


    更多官方信息

    EMAS官网介绍:https://www.aliyun.com/product/emas

    Devops:https://www.aliyun.com/product/emascrash/mobile_devops

    移动热修复:https://www.aliyun.com/product/hotfix

    移动测试:https://www.aliyun.com/activity/emas/mqcexpert

    移动推送:https://www.aliyun.com/product/cps

    HTTPDNS:https://www.aliyun.com/product/httpdns

    EMAS 控制台: https://emas.console.aliyun.com/products

    2022-09-27 14:23:13
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
基于阿里巴巴以及合作伙伴的最佳实践,围绕大前端、云原生领域的相关技术热点(小程序、Serverless、应用中间件、低代码、DevOps)展开行业探讨,与开发者一起探寻云原生时代应用研发的新范式。
问答排行榜
最热
最新

相关电子书

更多
移动热修复新品发布 立即下载
阿里云移动服务新品发布-移动热修复 立即下载
荷鲁斯 移动端第三方库安全检查引擎介绍 立即下载

相关实验场景

更多