Android热修复—阿里的新一代热修复技术Sophix
2017-08-18 10:21
761 查看
前言
热修复作为当下热门的技术,在业界内比较著名的有阿里的AndFix、Dexposed,腾讯QQ空间的超级补丁技术和微信的Tinker。但是我对热修复基本没怎么研究过,由于最近一段时间了解到阿里发布了新一代热修复技术—Sophix。于是我决定折腾一波…
一、开通移动热修复服务
1、注册阿里云账号,选择移动热修复服务 选择之后需要开通此功能,点击立即开通即可:
2、打开管理控制台,点击右上角创建APP
这时候返回Hotfix列表,会出现Android和iOS两个版本的APP。
ps:这里需要的是注意,一个是移动服务APP列表,一个是Hotfix列表,两个列表需要区分一下。
3、RSA密钥(后面需要在AndroidManifest文件中配置)
点击Hoxfix列表android版本的app后面的管理即可查看基本信息:
二、接入热修复服务
1、添加依赖包
在项目的app.gradle中:
1、添加maven仓库地址:
repositories { maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" } }1
2
3
4
5
6
1
2
3
4
5
6
2、添加gradle坐标版本依赖:
dependencies { compile 'com.aliyun.ams:alicloud-android-hotfix:3.1.0' }1
2
3
4
5
1
2
3
4
5
ps:如果项目中也依赖其它阿里系SDK,可能会同时依赖了utdid这个SDK,为了避免冲突可以这样:
dependencies { compile ('com.aliyun.ams:alicloud-android-hotfix:3.1.0') { exclude(module:'alicloud-android-utdid') } }1
2
3
4
5
6
1
2
3
4
5
6
2、AndroidManifest中相关配置
1、配置相关权限:
<!-- 网络权限 --> <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
2
3
4
5
6
7
1
2
3
4
5
6
7
2、添加元数据:
<application ... > <meta-data android:name="com.taobao.android.hotfix.IDSECRET" android:value="自己APP的App ID" /> <meta-data android:name="com.taobao.android.hotfix.APPSECRET" android:value="自己APP的App Secret" /> <meta-data android:name="com.taobao.android.hotfix.RSASECRET" android:value="自己APP的RSA密钥" /> </application>1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3、初始化Sophix
initialize的调用应该尽可能的早,必须在Application.attachBaseContext()或者Application.onCreate()的最开始进行SDK初始化操作,否则极有可能导致崩溃。而查询服务器是否有可用补丁的操作可以在后面的任意地方。
这里我是继承Application,在onCreate()方法中进行初始化:
public class SophixApp extends Application { @Override public void onCreate() { super.onCreate(); initSophix(); } private void initSophix() { String appVersion; try { appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { appVersion = "1.0.0"; e.printStackTrace(); } // initialize最好放在attachBaseContext最前面 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(); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
三、生成补丁并上传到控制台
1、进行第一次运行并打包生成apk
为了简单测试,以一个TextView为例,且打包命名为first.apk
public class MainActivity extends AppCompatActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.textView); mTextView.setText("这是第一次运行的,"); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2、进行第二次运行并打包生成apk
这时候我们修改TextView的文字设置,且打包命名为second.apk
3、生成补丁
a 、生成补丁的话需要下载阿里的打补丁工具SophixPatchTool,然后分别选择两次打包生成的apk。
ps:
旧包:<必填> 选择基线包路径(有问题的APK)。
新包:<必填> 选择新包路径(修复过该问题APK)。
日志:打开日志输出窗口。
高级:展开高级选项。
设置:配置其他信息。
Go!:开始生成补丁。
b、打开高级设置是否需要冷启动,本项为默认即可,无需设置:
ps:
强制冷启动:勾选的话强制生成补丁包为需要冷启动才能修复的格式。默认不选的话,工具会根据代码变更情况自动选择即时热替换或者冷启动修复。
不比较资源:打补丁时不比较资源的变化。
不比较SO库:打补丁时不比较SO库的变化。
c、打开设置选项进行签名信息设置:
d、点击Go生成补丁:
e、上传补丁
将生成的补丁文件sophix-patch.jar上传到控制台:
4、调试并发布补丁
上传补丁后,查看补丁详情会发现,补丁状态是等待发布,阿里建议在正式发布前先使用hotfixdebug工具进行本地测试再发布,当然我们可以直接全量发布。1、本地测试
下载hotfixdebug工具安装后,填写包名,点击连接应用,然后扫描补丁详情中的二维码下载补丁。或者将补丁包放到手机sdcard,填写绝对路径也是可以的。
Mode:1 表示扫码模式, Code:12 表示应用当前已经有一个补丁, 所以新补丁不会立刻加载需要等下一次重启加载。(因为我已经下载过一次了)
这时候打开我们装上的first.apk发现并没有变,杀掉进程,重新进入,发现已经是我们想要的内容了。
2、全量发布补丁
选择全量发布,所有安装first.apk的用户就可以得到修复了,点击确认发布即可。
发布之后,重新启动APP,会发现可以内容已经变为我们想要的。(这个过程可能略有延迟)
关于更多具体的发布流程,点击参考
完美实现热修复!
总结
Sophix的优点:1、补丁可以即时生效,不需要应用重启(我测试的过程中是因为本地已经存在了,所以需要重启APP);
2、补丁包同样采用差量技术,生成的PATCH体积小,阿里采用自己的SophixPatchTool进行补丁生成,简单易用;
3、对应用无侵入,几乎无性能损耗;
4、傻瓜式接入。
缺点:
开始收费,不过有免费阈值,关于价格可以点击查看
点击下载Demo
参考资料
阿里云官网 Sophix官方文档
补丁调试
打补丁工具下载
Android热修复技术选型
相关文章推荐
- Android热修复—阿里的新一代热修复技术Sophix
- 阿里Android热修复技术选型——三大流派解析
- Android探索之旅(第二十五篇)腾讯热修复框架Tinker与阿里第三代热修复框架Sophix对比
- 关于Android热修复技术(AndFix—阿里)
- 阿里Android热修复技术选型——三大流派解析
- android--------阿里 Sophix移动热修复
- android热修复-阿里Hotfix最新版(Sophix)
- Android三步集成阿里热修复——Sophix
- 《深入探索Android热修复技术原理》安卓热修复原理宝典出炉,阿里技术大牛联袂推荐
- Sophix-阿里第三代非侵入式热修复
- 【Android开发高级技术】Android 热补丁动态修复框架分析与总结
- Android热修复技术选型——三大流派解析
- Android热修复技术选型——三大流派解析
- android热修复--阿里热修复使用和源码分析
- Android热补丁动态修复技术(一):从Dex分包原理到热补丁
- Android热补丁动态修复技术(一)dex分包原理
- Android热补丁动态修复技术(二):实践
- Android Gradle项目Hotfix热修复技术的接入
- Android热修复技术选型——三大流派解析
- Android 热补丁技术——资源的热修复