应用研发平台EMAS中 sophix热更新可以做为功能发版用吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
Sophix 是阿里云提供的热修复解决方案,其核心目标是帮助开发者在应用运行过程中快速修复线上问题,而无需重新发布完整版本。然而,关于是否可以将 Sophix 热更新用于功能发版,需要从以下几个方面进行分析:
Sophix 提供了较为全面的热修复能力,包括但不限于以下内容: - 方法替换:全面支持方法替换。 - 方法增加/减少:以冷启动方式支持。 - 资源更新:支持大部分资源的更新(但存在例外,详见下文)。 - so库更新:支持动态库的更新。 - Android版本兼容性:支持所有 Android 版本,包括 7.0 及以上。
这些功能使得 Sophix 能够覆盖大部分代码和资源的修改需求,理论上可以用于新增功能或优化现有功能。
尽管 Sophix 功能强大,但在某些场景下存在限制,可能影响其作为功能发版的适用性: - 初始化相关代码无法修复:SophixManager.initialize
方法调用之前的代码无法修复,因为热修复框架尚未加载。 - Application 类及其直接依赖类的限制: - Application 类本身无法被修复。 - Application 中直接用到的类无法增减方法和字段,原因是系统在安装时会对这些类进行优化,导致偏移量固定。 - 建议:尽量减少 Application 直接依赖的类,并通过封装或反射调用来避免上述问题。 - AndroidManifest.xml 的限制: - AndroidManifest.xml 文件中的内容无法修改,包括四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的新增或修改。 - 主题资源等配置也无法通过热修复生效。 - 特定资源的限制: - 通知栏图标、启动图标、RemoteViews 以及通过 getResources().getIdentifier()
方式调用的资源无法修复。 - 重要提醒:如果通知图标发生变动,可能导致推送通知时崩溃,因此务必保持通知图标的稳定性。 - 热修复框架本身的代码:Sophix 框架自身的代码默认不支持修复。
部分补丁需要通过冷启动才能生效。这意味着用户需要重启应用后才能体验到新功能。这种机制可能会对用户体验造成一定影响,尤其是在功能发版场景下,用户可能期望即时生效。
基于上述功能支持和限制,Sophix 热更新在以下场景中可以作为功能发版使用: - 小规模功能更新:如新增或优化某些非核心功能模块,且不涉及 AndroidManifest.xml 或受限资源的修改。 - 紧急功能上线:当需要快速上线某些功能以应对突发需求时,Sophix 热更新可以作为一种临时解决方案。 - 灰度发布:Sophix 支持服务端控制发布与灰度功能,可以通过逐步推送补丁的方式验证新功能的稳定性。
然而,在以下场景中,Sophix 热更新可能不适合用于功能发版: - 涉及 AndroidManifest.xml 修改的功能:如新增 Activity 或 Service。 - 大规模功能重构:如果涉及大量代码或资源的改动,可能会超出热修复的能力范围。 - 对用户体验要求较高的场景:冷启动修复可能导致用户需要重启应用,影响体验。
为了更好地利用 Sophix 热更新进行功能发版,建议采取以下措施: - 提前规划功能设计:避免在功能开发中使用受限的资源或组件。 - 采用稳健接入方式:将 Sophix 初始化逻辑放在单独的 StubApplication 中,以解决 Application 类无法修复的问题。 - 预留扩展空间:在 AndroidManifest.xml 中预留空组件,以便后续更新时添加新功能。 - 充分测试补丁包:在正式发布前,确保补丁包在不同机型和系统版本上的兼容性。
Sophix 热更新可以在一定程度上用于功能发版,但其适用性取决于具体的功能需求和实现方式。对于小规模、非核心功能的更新,Sophix 是一种高效的选择;而对于涉及 AndroidManifest.xml 修改或大规模重构的功能,则建议通过完整版本发布来实现。