今年Android领域热门技术之一是热修复技术,试用了一下阿里的Sophix,真心给阿里的技术点赞,接入成本非常低。唯一遗憾的是不是完全免费,单个账户创建的应用总活跃设备超过5万台就会收费(偶买噶...),但是有5万台的额度也够用了o(╯□╰)o
对比
使用步骤
- 注册阿里云账号
- 注册“移动热修复”功能
- 创建APP
- 创建版本
- 集成Sophix到Android工程
- build apk,一个old.apk, 一个new.apk,使用补丁生成工具,生成补丁
- 上传补丁
- 使用调试app,扫描补丁二维码,进行测试
- 发布补丁
集成注意事项
- gradle配置
- AndroidManifest添加
<!--Sophix配置-->
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="" />
- 混淆配置
基线包
### Sophix
#基线包使用,生成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
非基线包
基线包生成的mapping.txt在app/buidl/outputs/mapping/release路径下,移动到/app路径下
### Sophix
#基线包使用,生成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
- Application
initialize的调用应该尽可能的早,必须在Application.attachBaseContext()或者Application.onCreate()的最开始进行SDK初始化操作,否则极有可能导致崩溃。而查询服务器是否有可用补丁的操作可以在后面的任意地方。
SophixManager.getInstance().setContext(this)
.setAppVersion(appVersion)
.setSecretMetaData("IDSECRET", "APPSECRET", "RSASECRET")//使用自己的替换
.setAesKey(null)
.setEnableDebug(true)
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
String msg = new StringBuilder("").append("Mode:").append(mode)
.append(" Code:").append(code)
.append(" Info:").append(info)
.append(" HandlePatchVersion:").append(handlePatchVersion).toString();
LogUtil.i(msg);
// 补丁加载回调通知
if (code == PatchStatus.CODE_LOAD_SUCCESS) {
// 表明补丁加载成功
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
// 建议: 用户可以监听进入后台事件, 然后应用自杀,以此加快应用补丁
// 建议调用killProcessSafely,详见1.3.2.3
// SophixManager.getInstance().killProcessSafely();
} else if (code == PatchStatus.CODE_LOAD_FAIL) {
// 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
// SophixManager.getInstance().cleanPatches();
} else {
// 其它错误信息, 查看PatchStatus类说明
}
}
}).initialize();
- 拉取补丁,放在initialize()之后,可以放在onCreate()中
SophixManager.getInstance().queryAndLoadNewPatch();