开发者社区> 问答> 正文

【移动热修复】发布补丁后,什么时候可以在App上生效?

发布补丁后,什么时候可以在App上生效?

展开
收起
EMAS支持组 2022-09-27 13:06:45 427 0
1 条回答
写回答
取消 提交回答
  • 只有调用queryAndLoadNewPatch才会请求新的补丁。

    假如你在Application的onCreate里面这么写的:

    SophixManager.getInstance().setContext(this)
                    .setAppVersion(appVersion)
                    .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                        @Override
                        public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                            // 补丁加载回调通知
                            if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                                // 表明补丁加载成功
                            } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                                // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                                // 建议: 用户可以监听进入后台事件, 然后应用自杀
                            } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                                // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
                                // SophixManager.getInstance().cleanPatches();
                            } else {
                                // 其它错误信息, 查看PatchStatus类说明
                            }
                        }
                    }).initialize();
    SophixManager.getInstance().queryAndLoadNewPatch();
    
    

    那么,假设你现在发布了一个新补丁,而且其他地方没有再调用到queryAndLoadNewPatch。那么对于以下 三种情况 ,App生效的时间不同:

    一:如果你是在没有加载补丁的时候queryAndLoadNewPatch,对于即时生效的热修复会马上应用补丁,对于强制冷启动的热修复会在下一次重启后应用补丁。

    二:如果本地已经有一个不带资源的补丁正在被应用,此时下发了一个新补丁

    第一次重启,会调用queryAndLoadNewPatch,接着会在正常删除老补丁后完成下载和补丁预加载。但由于已经initialize,不会马上加载新补丁。

    第二次重启,initialize会发现刚才已经加载的新补丁,加载,新补丁生效。

    因此通常就会重启两次。

    三:如果本地已经有一个带有资源的补丁正在被应用,此时下发了一个新补丁

    第一次重启,会调用queryAndLoadNewPatch,会发现已经有新补丁,但本次要保证老补丁运行时查找资源正常,所以还不能删除替换老补丁,而是会在下次重启后进行删除。

    第二次重启,检测到之前请求到了新补丁,会在initialize时先删除老补丁,然后继续调用queryAndLoadNewPatch,会完成下载和补丁预加载。但由于已经initialize,不会马上加载新补丁。

    第三次重启,initialize会发现刚才已经加载的新补丁,加载,新补丁生效。

    这样就会重启三次。

    所以可以在App运行过程中定期调用queryAndLoadNewPatch,以提早查询新补丁并进行预加载,这样可以减少重启次数。

    所以加载新补丁的时机取决于queryAndLoadNewPatch。

    自3.1.5之后,已有补丁情况下拉取到新补丁,一次重启后可直接生效。


    更多官方信息

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

相关电子书

更多
女性移动App安全攻防战 立即下载
汇聚云计算的生态核能——云市场,云上APP Store 立即下载
千万级用户直播App——服务端架构设计和思考 立即下载

相关实验场景

更多