SopHix初试

接入步骤

一 基本配置

1.1 申请开通阿里移动热修复
1.2 创建产品 & 添加应用
1.3 Android Studio 项目build.gradle添加Mavel依赖

1
2
3
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}

app module build.gradle添加依赖

1
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.1'

1.4 添加权限

1
2
3
4
5
6
<! -- 网络权限 -->
<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"/>

1.5 配置AndroidManifest文件
AndroidManifest.xml中间的application节点下添加如下配置:

1
2
3
4
5
6
7
8
9
<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密钥" />

1.6 混淆配置

1
2
3
4
5
6
7
8
9
10
#基线包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/buidl/outputs/mapping/release路径下,移动到/app路径下
#修复后的项目使用,保证混淆结果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize

二 SDK接口使用

2.1 接入范例
initialize的调用应该尽可能的早,必须在Application.attachBaseContext()的最开始(在super.attachBaseContext之后,如果有Multidex,也需要在Multidex.install之后)进行SDK初始化操作,初始化之前不能用到其他自定义类,否则极有可能导致崩溃。而查询服务器是否有可用补丁的操作可以在后面的任意地方。不建议在Application.onCreate()中初始化,因为如果带有ContentProvider,就会使得Sophix初始化时机太迟从而引发问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// initialize必须放在attachBaseContext最前面,初始化代码直接写在Application类里面,切勿封装到其他类。
SophixManager.getInstance().setContext(this)
.setAppVersion(appVersion)
.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();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();

三 补丁包的生成

3.1 下载 SopHix补丁工具

3.2 生成补丁
打开补丁生成工具,利用新包旧包生成补丁包

四 补丁包的下发

4.1 打开热修复控制台,添加版本,上传补丁
4.2 测试补丁

  1. 手机安装调试工具,adb shell input text packname 输入apk的包名
    ![](https://user-gold-cdn.xitu.io/2018/3/29/16270f139c0adaa1?w=1080&h=2160&f=png&s=123
  2. 扫码验证
  3. adb push patch.jar 手机的任意绝对路径
  4. 手机输入jar路径,点击应用补丁

应用已经存在一个补丁, 请求发现有新补丁后,本次不受影响。并且在下次启动时补丁文件删除, 下载并预加载新补丁。在下下次启动时应用新补丁。
补丁在后台发布之后, 并不会主动下行推送到客户端, 需要手动调用queryAndLoadNewPatch方法查询后台补丁是否可用.

4.3 测试无误后控制台选择新建发布进行灰度发布

灰度测试,就是在某项产品或应用正式发布前,选择特定人群试用,逐步扩大其试用者数量,以便及时发现和纠正其中的问题。

4.4 再次确认无误后,进行全量发布