发布补丁后,什么时候可以在app上生效,怎么办?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
只有调用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之后,已有补丁情况下拉取到新补丁,一次重启后可直接生效。注:已加载补丁中有资源的改动,再拉取新补丁也适用。