阿里热修复集成

最近一段时间,心情不是很好,在版本发布的时候,很多细节问题自己没有考虑到,测试也没有发现。

以前看过热更新的文档但是自己没有集成到项目里面过,今天集成做个记录。

阿里热更新 (Mobile Hotfix)

阿里热更新最新版本3.2.3支持内容:

方法替换、方法增加减少(需要在生成补丁时勾选强制冷启动)、方法反射调用(需要在生成补丁时勾选强制冷启动)、即时生效(我没付费,反正我没有)、多DEX(热更新的原理是将dex文件放入旧版本dex的前面,具体内容请看点击打开链接)、资源更新、so库更新、所有Android版本、所有机型(这个我不是很信^-^)。

在集成的时候,需要下载一个SDK,我将它放在libs下面,但是后来发现可以直接使用gradle,为了方便的我果断在app的gradle文件下面添加依赖: 

compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.3'

同时添加maven仓库:

repositories {

maven {

url "http://maven.aliyun.com/nexus/content/repositories/releases"

}

}

如若仓库访问失败, 那么只能用本地依赖的方式进行依赖;

//热更新所需权限

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在Manifest的application节点中注册:

<meta-data android:name="com.taobao.android.hotfix.IDSECRET"

android:value="App ID" />

<meta-data android:name="com.taobao.android.hotfix.APPSECRET"

android:value="App Secret" />

<meta-data android:name="com.taobao.android.hotfix.RSASECRET"

android:value="RSA密钥" />

密钥获取步骤:

在产品界面会看到控制台选项。


控制台里面需要自己添加产品,我本身创建了一个MyDemo工程。


点击我们创建的产品后,还需要添加一个应用(这里我不是很清楚有什么具体的意义)


点击下面的移动热修复,可以看到一个应用信息,点击查看就是我们需要的信息了。



配置好文件后,我们需要在app的application中添加初始化:

attachBaseContext方法中加入(attachBaseContext是系统方法

   SophixManager.getInstance().setContext(this)
                .setAppVersion("APP版本号")
                .setAesKey(null)
                .setEnableDebug(true)
                .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) {
                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                            // 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀,以此加快应用补丁,详见1.3.2.3
                        } else {
                            // 其它错误信息, 查看PatchStatus类说明
                        }
                    }
                }).initialize();

onCreate方法中加入(queryAndLoadNewPatch不可放在attachBaseContext中否则无网络权限)

 SophixManager.getInstance().queryAndLoadNewPatch();

queryAndLoadNewPatch 用于查询服务器是否有新的可用补丁;

因为文档中没有具体要求,所以我是开子线程进行注册。

(友情提示:在manifest里面填写信息的时候不要存在空格)

这样我们的配置就完成了,接下来我们的需要知道是怎么去更新了。

首先我们需要

下载打包工具:打包工具下载链接,根据你需要的实际情况去下载。

运行SophixPatchTool程序,配置好你的信息。点击GO生成补丁。
现在进入你的阿里云管理后台,
找到补丁管理,上传你的第一个补丁,这样你觉得行了吗?

我开始以为行了,但是试了很久才发现没效果,找了很久才发现,原来上传以后不代表已经发布,我们需要进入详情,然后发布应用。这样就行了。(更新以后需要提示用户重启才能生效哦!)

这个在setPatchLoadStatusStub会有回调,code码:

  1. //兼容老版本的code说明
  2. int CODE_LOAD_SUCCESS = 1;//加载阶段, 成功
  3. int CODE_ERR_INBLACKLIST = 4;//加载阶段, 失败设备不支持
  4. int CODE_REQ_NOUPDATE = 6;//查询阶段, 没有发布新补丁
  5. int CODE_REQ_NOTNEWEST = 7;//查询阶段, 补丁不是最新的
  6. int CODE_DOWNLOAD_SUCCESS = 9;//查询阶段, 补丁下载成功
  7. int CODE_DOWNLOAD_BROKEN = 10;//查询阶段, 补丁文件损坏下载失败
  8. int CODE_UNZIP_FAIL = 11;//查询阶段, 补丁解密失败
  9. int CODE_LOAD_RELAUNCH = 12;//预加载阶段, 需要重启
  10. int CODE_REQ_APPIDERR = 15;//查询阶段, appid异常
  11. int CODE_REQ_SIGNERR = 16;//查询阶段, 签名异常
  12. int CODE_REQ_UNAVAIABLE = 17;//查询阶段, 系统无效
  13. int CODE_REQ_SYSTEMERR = 22;//查询阶段, 系统异常
  14. int CODE_REQ_CLEARPATCH = 18;//查询阶段, 一键清除补丁
  15. int CODE_PATCH_INVAILD = 20;//加载阶段, 补丁格式非法
  16. //查询阶段的code说明
  17. int CODE_QUERY_UNDEFINED = 31;//未定义异常
  18. int CODE_QUERY_CONNECT = 32;//连接异常
  19. int CODE_QUERY_STREAM = 33;//流异常
  20. int CODE_QUERY_EMPTY = 34;//请求空异常
  21. int CODE_QUERY_BROKEN = 35;//请求完整性校验失败异常
  22. int CODE_QUERY_PARSE = 36;//请求解析异常
  23. int CODE_QUERY_LACK = 37;//请求缺少必要参数异常
  24. //预加载阶段的code说明
  25. int CODE_PRELOAD_SUCCESS = 100;//预加载成功
  26. int CODE_PRELOAD_UNDEFINED = 101;//未定义异常
  27. int CODE_PRELOAD_HANDLE_DEX = 102;//dex加载异常
  28. int CODE_PRELOAD_NOT_ZIP_FORMAT = 103;//基线dex非zip格式异常
  29. int CODE_PRELOAD_REMOVE_BASEDEX = 105;//基线dex处理异常
  30. //加载阶段的code说明 分三部分dex加载, resource加载, lib加载
  31. //dex加载
  32. int CODE_LOAD_UNDEFINED = 71;//未定义异常
  33. int CODE_LOAD_AES_DECRYPT = 72;//aes对称解密异常
  34. int CODE_LOAD_MFITEM = 73;//补丁SOPHIX.MF文件解析异常
  35. int CODE_LOAD_COPY_FILE = 74;//补丁拷贝异常
  36. int CODE_LOAD_SIGNATURE = 75;//补丁签名校验异常
  37. int CODE_LOAD_SOPHIX_VERSION = 76;//补丁和补丁工具版本不一致异常
  38. int CODE_LOAD_NOT_ZIP_FORMAT = 77;//补丁zip解析异常
  39. int CODE_LOAD_DELETE_OPT = 80;//删除无效odex文件异常
  40. int CODE_LOAD_HANDLE_DEX = 81;//加载dex异常
  41. // 反射调用异常
  42. int CODE_LOAD_FIND_CLASS = 82;
  43. int CODE_LOAD_FIND_CONSTRUCTOR = 83;
  44. int CODE_LOAD_FIND_METHOD = 84;
  45. int CODE_LOAD_FIND_FIELD = 85;
  46. int CODE_LOAD_ILLEGAL_ACCESS = 86;
  47. //resource加载
  48. public static final int CODE_LOAD_RES_ADDASSERTPATH = 123;//新增资源补丁包异常
  49. //lib加载
  50. int CODE_LOAD_LIB_UNDEFINED = 131;//未定义异常
  51. int CODE_LOAD_LIB_CPUABIS = 132;//获取primaryCpuAbis异常
  52. int CODE_LOAD_LIB_JSON = 133;//json格式异常
  53. int CODE_LOAD_LIB_LOST = 134;//lib库不完整异常
  54. int CODE_LOAD_LIB_UNZIP = 135;//解压异常
  55. int CODE_LOAD_LIB_INJECT = 136;//注入异常



快速集成文档

补丁打包工具下载

拉取不到补丁排查文档


猜你喜欢

转载自blog.csdn.net/qq_33240767/article/details/80676410