1. 介绍
移动热修复(Sophix)是阿里云提供的Android平台App热修复服务方案
2. Sophix优势
通过比较可以发现Sophix相比其他平台的实现更具优势
A.对于部分修改,补丁即时生效,不需要应用重启(这个还得看情况,较大的修改或者修改类结构之类的,会导致重启)
B.补丁包同样采用差异技术,生成的PATCH体积小
C.对应用无侵入,几乎没有性能损耗
D.傻瓜式接入
E.能够实现代码修复、资源修复、so修复等方面,因此更加全面的满足修复要求。
缺点:
A. 不支持四大组件的修复,这里的修复是新增,或更改。因为如果要修复四大组件,必须在AndroidManifest里面预先插入代理组件,并且尽可能声明所有的权限,这么做会给原先的App添加很多臃肿的代码,对app的侵入性很强,因此不支持四大组件新增和更改的修复,但是四大组件里面的代码是可以修复的。
1. Sophix原理简单介绍
Sophix的代码修复体系同时涵盖了底层替换方案和类加载方案,两种方案的结合,可以实现优势互补,完全兼容的作用,可以灵活的根据实际情况启动切换。在生成补丁时,补丁工具会根据实际代码变动情况进行自动选择,针对小修改,在底层替换方案限制范围内的,就直接采用底层替换修复,这样可以做到代码修复即时生效,而对于代码修改超出底层替换限制的,会使用类加载替换,虽然及时性不是很好,但是可以达到热修复目的。
4.阿里巴巴提供的快速接入文档:
https://help.aliyun.com/document_detail/53240.html?spm=5176.doc53238.6.546.T3HWbI
2. 补丁工具下载地址
Window:
Mac
Linux
3. 补丁工具使用文档
https://help.aliyun.com/document_detail/53247.html?spm=5176.doc53248.6.548.lHabEj
4. 调试工具下载地址
5. 调试工具使用文档:
https://help.aliyun.com/document_detail/53248.html?spm=5176.doc53247.6.549.zPEvTh
Demo实践
在新建项目之前,需要提前在阿里云移动热修复中申请账号,并创建相应的App。审核通过后再进行剩余操作。
1. 新建Sophix工程
2. 在工程中配置Sophix依赖
A. 在根节点下配置阿里云仓库
repositories {
//阿里云仓库
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
B.在依赖(dependencies)中添加
compile 'com.aliyun.ams:alicloud-android-hotfix:3.0.5'
C. 本Demo为了兼容Android6.0,增加了v7兼容包
compile 'com.android.support:appcompat-v7:25.0.1'
3. 配置混淆
#基线包使用,生成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
4.配置相关权限
<!-- 网络权限 -->
<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" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
5.在Application节点中添加阿里云热修复服务后台申请的App id ,App Secrets和RSA密钥
<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 secrets" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="app rsa密钥" />
6. 建立Application的子类,并在Manifest中添加。在Application子类的attachBaseContext方法最前面或者onCreate方法最前面完成SophixManager的初始化。