最近一段时间,心情不是很好,在版本发布的时候,很多细节问题自己没有考虑到,测试也没有发现。
以前看过热更新的文档但是自己没有集成到项目里面过,今天集成做个记录。
阿里热更新 (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里面填写信息的时候不要存在空格)
这样我们的配置就完成了,接下来我们的需要知道是怎么去更新了。
首先我们需要
下载打包工具:打包工具下载链接,根据你需要的实际情况去下载。
我开始以为行了,但是试了很久才发现没效果,找了很久才发现,原来上传以后不代表已经发布,我们需要进入详情,然后发布应用。这样就行了。(更新以后需要提示用户重启才能生效哦!)
这个在setPatchLoadStatusStub会有回调,code码:
//兼容老版本的code说明
int CODE_LOAD_SUCCESS = 1;//加载阶段, 成功
int CODE_ERR_INBLACKLIST = 4;//加载阶段, 失败设备不支持
int CODE_REQ_NOUPDATE = 6;//查询阶段, 没有发布新补丁
int CODE_REQ_NOTNEWEST = 7;//查询阶段, 补丁不是最新的
int CODE_DOWNLOAD_SUCCESS = 9;//查询阶段, 补丁下载成功
int CODE_DOWNLOAD_BROKEN = 10;//查询阶段, 补丁文件损坏下载失败
int CODE_UNZIP_FAIL = 11;//查询阶段, 补丁解密失败
int CODE_LOAD_RELAUNCH = 12;//预加载阶段, 需要重启
int CODE_REQ_APPIDERR = 15;//查询阶段, appid异常
int CODE_REQ_SIGNERR = 16;//查询阶段, 签名异常
int CODE_REQ_UNAVAIABLE = 17;//查询阶段, 系统无效
int CODE_REQ_SYSTEMERR = 22;//查询阶段, 系统异常
int CODE_REQ_CLEARPATCH = 18;//查询阶段, 一键清除补丁
int CODE_PATCH_INVAILD = 20;//加载阶段, 补丁格式非法
//查询阶段的code说明
int CODE_QUERY_UNDEFINED = 31;//未定义异常
int CODE_QUERY_CONNECT = 32;//连接异常
int CODE_QUERY_STREAM = 33;//流异常
int CODE_QUERY_EMPTY = 34;//请求空异常
int CODE_QUERY_BROKEN = 35;//请求完整性校验失败异常
int CODE_QUERY_PARSE = 36;//请求解析异常
int CODE_QUERY_LACK = 37;//请求缺少必要参数异常
//预加载阶段的code说明
int CODE_PRELOAD_SUCCESS = 100;//预加载成功
int CODE_PRELOAD_UNDEFINED = 101;//未定义异常
int CODE_PRELOAD_HANDLE_DEX = 102;//dex加载异常
int CODE_PRELOAD_NOT_ZIP_FORMAT = 103;//基线dex非zip格式异常
int CODE_PRELOAD_REMOVE_BASEDEX = 105;//基线dex处理异常
//加载阶段的code说明 分三部分dex加载, resource加载, lib加载
//dex加载
int CODE_LOAD_UNDEFINED = 71;//未定义异常
int CODE_LOAD_AES_DECRYPT = 72;//aes对称解密异常
int CODE_LOAD_MFITEM = 73;//补丁SOPHIX.MF文件解析异常
int CODE_LOAD_COPY_FILE = 74;//补丁拷贝异常
int CODE_LOAD_SIGNATURE = 75;//补丁签名校验异常
int CODE_LOAD_SOPHIX_VERSION = 76;//补丁和补丁工具版本不一致异常
int CODE_LOAD_NOT_ZIP_FORMAT = 77;//补丁zip解析异常
int CODE_LOAD_DELETE_OPT = 80;//删除无效odex文件异常
int CODE_LOAD_HANDLE_DEX = 81;//加载dex异常
// 反射调用异常
int CODE_LOAD_FIND_CLASS = 82;
int CODE_LOAD_FIND_CONSTRUCTOR = 83;
int CODE_LOAD_FIND_METHOD = 84;
int CODE_LOAD_FIND_FIELD = 85;
int CODE_LOAD_ILLEGAL_ACCESS = 86;
//resource加载
public static final int CODE_LOAD_RES_ADDASSERTPATH = 123;//新增资源补丁包异常
//lib加载
int CODE_LOAD_LIB_UNDEFINED = 131;//未定义异常
int CODE_LOAD_LIB_CPUABIS = 132;//获取primaryCpuAbis异常
int CODE_LOAD_LIB_JSON = 133;//json格式异常
int CODE_LOAD_LIB_LOST = 134;//lib库不完整异常
int CODE_LOAD_LIB_UNZIP = 135;//解压异常
int CODE_LOAD_LIB_INJECT = 136;//注入异常