开发者社区> 问答> 正文

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


只有调用queryAndLoadNewPatch才会请求新的补丁。
假如你在Application的onCreate里面这么写的:

  1. [backcolor=transparent]SophixManager[backcolor=transparent].[backcolor=transparent]getInstance[backcolor=transparent]().[backcolor=transparent]setContext[backcolor=transparent]([backcolor=transparent]this[backcolor=transparent])
  2. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]setAppVersion[backcolor=transparent]([backcolor=transparent]appVersion[backcolor=transparent])
  3. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]setPatchLoadStatusStub[backcolor=transparent]([backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]PatchLoadStatusListener[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  4. [backcolor=transparent]                    [backcolor=transparent]@Override
  5. [backcolor=transparent]                    [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] onLoad[backcolor=transparent]([backcolor=transparent]final[backcolor=transparent] [backcolor=transparent]int[backcolor=transparent] mode[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]final[backcolor=transparent] [backcolor=transparent]int[backcolor=transparent] code[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]final[backcolor=transparent] [backcolor=transparent]String[backcolor=transparent] info[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]final[backcolor=transparent] [backcolor=transparent]int[backcolor=transparent] handlePatchVersion[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  6. [backcolor=transparent]                        [backcolor=transparent]// 补丁加载回调通知
  7. [backcolor=transparent]                        [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]code [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]PatchStatus[backcolor=transparent].[backcolor=transparent]CODE_LOAD_SUCCESS[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  8. [backcolor=transparent]                            [backcolor=transparent]// 表明补丁加载成功
  9. [backcolor=transparent]                        [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]code [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]PatchStatus[backcolor=transparent].[backcolor=transparent]CODE_LOAD_RELAUNCH[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  10. [backcolor=transparent]                            [backcolor=transparent]// 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
  11. [backcolor=transparent]                            [backcolor=transparent]// 建议: 用户可以监听进入后台事件
  12. [backcolor=transparent]                        [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]code [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]PatchStatus[backcolor=transparent].[backcolor=transparent]CODE_LOAD_FAIL[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  13. [backcolor=transparent]                            [backcolor=transparent]// 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
  14. [backcolor=transparent]                            [backcolor=transparent]// SophixManager.getInstance().cleanPatches();
  15. [backcolor=transparent]                        [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
  16. [backcolor=transparent]                            [backcolor=transparent]// 其它错误信息, 查看PatchStatus类说明
  17. [backcolor=transparent]                        [backcolor=transparent]}
  18. [backcolor=transparent]                    [backcolor=transparent]}
  19. [backcolor=transparent]                [backcolor=transparent]}).[backcolor=transparent]initialize[backcolor=transparent]();
  20. [backcolor=transparent]SophixManager[backcolor=transparent].[backcolor=transparent]getInstance[backcolor=transparent]().[backcolor=transparent]queryAndLoadNewPatch[backcolor=transparent]();

那么,假设你现在发布了一个新补丁,而且其他地方没有再调用到queryAndLoadNewPatch。那么对于以下 [backcolor=transparent]三种情况 ,app生效的时间不同:
一:如果你是在没有加载补丁的时候queryAndLoadNewPatch,对于即时生效的热修复会马上应用补丁,对于强制冷启动的热修复会在下一次重启后应用补丁。

二:如果本地已经有一个不带资源的补丁正在被应用,此时下发了一个新补丁
第一次重启,会调用queryAndLoadNewPatch,接着会在正常删除老补丁后完成下载和补丁预加载。但由于已经initialize,不会马上加载新补丁。
第二次重启,initialize会发现刚才已经加载的新补丁,加载,新补丁生效。
因此通常就会重启两次。

三:如果本地已经有一个带有资源的补丁正在被应用,此时下发了一个新补丁
第一次重启,会调用queryAndLoadNewPatch,会发现已经有新补丁,但本次要保证老补丁运行时查找资源正常,所以还不能删除替换老补丁,而是会在下次重启后进行删除。
第二次重启,检测到之前请求到了新补丁,会在initialize时先删除老补丁,然后继续调用queryAndLoadNewPatch,会完成下载和补丁预加载。但由于已经initialize,不会马上加载新补丁。
第三次重启,initialize会发现刚才已经加载的新补丁,加载,新补丁生效。
这样就会重启三次。

所以可以在app运行过程中定期调用queryAndLoadNewPatch,以提早查询新补丁并进行预加载,这样可以减少重启次数。
[backcolor=transparent]所以加载新补丁的时机取决于queryAndLoadNewPatch。

展开
收起
猫饭先生 2017-10-25 10:04:06 1489 0
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

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

相关实验场景

更多