准备工作
- 打开阿里云
- 找到产品
- 找到移动热修复
- 创建APP(在右上角)
- 然后会有app id 等信息,配置会用到(复制的时候注意会有空格)
1、配置
- 添加maven仓库地址:
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
- 添加gradle坐标版本依赖:
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.0'
- 添加权限
<! -- 网络权限 -->
<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"/>
注意 READ_EXTERNAL_STORAGE
在6.0+需要动态获取的哦~
- 在AndroidManifest.xml中间的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密钥" />
- Application中初始化
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
// initialize最好放在attachBaseContext最前面,初始化直接在Application类里面,切勿封装到其他类
SophixManager.getInstance().setContext(this)
.setAppVersion(getVersionName())
.setAesKey(null)
.setEnableDebug(true)//正式发布该参数必须为false
.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
//SophixManager.getInstance().killProcessSafely();
} else {
// 其它错误信息, 查看PatchStatus类说明
}
}
}).initialize();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();
}
public String getVersionName() {
try {
return this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
以上配置无需动脑,直接从集成文档中复制过来就ok的~
别忘了引用你的Application类
2、代码
这一步就是模拟修复bug
- 就很简单设置“第一次运行”
- 运行效果
- 这时候签名打一个包,demo_1.apk,假装这是一个出bug的apk
- 完成之后,修改代码并变成红色,假装修复
- 运行效果
- 此时再打一个包,demo_2.apk
3、发布
好了,到第三步了,也是比较关键的地方了,但是不要怕,依然没有难度
大概原理:在第二步中我们打了两个安装包,demo_1.apk 和 demo_2.apk,就是比较这两个apk,差异的部分生成补丁包,然后控制台去控制下发、拉取、加载等操作。
所以,现在就需要用到补丁包,需要这个工具SophixPatchTool,以windows为例,下载之后解压,找到并打开SophixPatchTool.exe,然后选择旧包、新包
设置里面选择补丁包的输出路径
高级
点击 GO 开始生成补丁包
这里可能会遇到
apk加固
而无法生成补丁包的情况,加固前先生成补丁,然后再加固,加固了的apk是可以应用上补丁的。
- 打开输出路径
可以看到多了一个sophix-patch.jar文件
- 控制台先添加版本,比如1.0.0
- 然后查看详情中,选择上传补丁,就是刚才的jar文件
- 上传之后就可以发布了
比如现在手机装的是demo_1.apk,发布之后就可以重新打开,再运行就是demo_2.apk的效果了
为什么需要重新打开呢
在生成补丁包的时候,有一个高级选项,我没有勾选强制冷启动,Sophix就会根据情况自己去选择冷启动生效还是及时生效。
哦对了,还有个测试,调试补丁
也超简单的,下载调试工具,是个apk,打开如下图
操作:
- 第一个是输入包名,然后点击连接,连接成功的话会在下面通知内容中显示success
- 然后扫描二维码,就是发布时那个二维码
- 然后就是输入绝对路径了,就是补丁包在手机的路径
- 然后点击应用就ok了,通知中会显示-1,表示本地补丁,2 表示本地补丁模式, 1 表示加载成功
总结
整套操作下来基本没有难度,不过要用好的话还是需要把官方文档好好研究一下,比如能不能直接加一个Activity啊、补丁包发错了怎么办啊、补丁怎么找不到啊等等,其实都有对应的解决方案,实在解决不了也可以提交一个工单,我这个集成下来十分钟左右就搞定了,当然,官方文档我也研究了好几遍。。