准备工作
打开阿里云
找到产品
找到移动热修复
创建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啊、补丁包发错了怎么办啊、补丁怎么找不到啊等等,其实都有对应的解决方案,实在解决不了也可以提交一个工单,我这个集成下来十分钟左右就搞定了,当然,官方文档我也研究了好几遍。。