阿里热修复之Sophix的集成详解
前言
这几天开始接触热修复,体验了一把阿里热修复Sophix的傻瓜式接入。虽说是傻瓜式接入,但实际操作起来还是遇到不少坑,而且Sophix的官方文档有些地方有点难理解,部分图片也跟现在的不一样,所以今天我整理了一下我接入Sophix的过程,希望对大家有所帮助。当然,如果你对热修复并不了解,可以先去了解下Android的热修复,再来看这个文章。
一、Sophix是什么
Sophix提供了一套更加完美的客户端服务端一体的热更新方案,做到了图形界面一键打包、加密传输、签名校验和服务端控制发布与灰度功能,让你用最少的时间实现最强大可靠的全方位热更新。
二、接入步骤
1.AndroidStudio集成
gradle远程仓库依赖, 打开项目找到app的build.gradle文件,添加maven仓库地址:
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
添加gradle坐标版本依赖:
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.2'
2.配置AndroidManifest文件
在AndroidManifest.xml文件中的application节点添加:
将上述value中的值分别改为通过阿里平台HotFix服务申请得到的APP ID、App Secret和RSA密钥(这三个东西是在阿里云平台创建应用后才能看到,可以等注册平台创建应用后,再来填写),出于安全考虑,也可以使用setSecretMetaData这个方法进行设置,后续配置会讲到这个方法。
添加权限:
<! -- 网络权限 -->
<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"/>
3.接入方式
目前,Sophix提供两种接入方式:快速接入 和 稳健接入,这部分大家可以直接点击进去看官方文档,这部分文档还是写得比较详细的,前文提到的setSecretMetaData方法也在快速接入中有详细介绍。由于稳健接入完美地兼容Android 8.0以后版本,且初始化与应用原先业务代码完全隔离,所以我直接使用了稳健接入。
使用稳健接入时要注意不要忘记添加这句代码:
// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();//查询是否有新的补丁
我当时就是直接看了稳健接入的文档,但是这文档并没有这句代码(这句代码在快速接入文档里有),结果导致我所有都配置好之后没有实现热修复功能。这句代码的作用是查询是否有新的补丁,我是放在Application里的onCreate()中。
完成以上步骤后,不出意外的话,接入已经成功。这个时候可以通过看log信息判断是否接入成功,第一个红框是初始化信息,第二、三红框是你调用了queryAndLoadNewPatch()返回的信息。大家可以等注册好阿里云平台创建好应用获取并填写APP ID、App Secret和RSA密钥这三个东西到配置文件后,再来看log信息对不对。
三、注册平台
Sophix热修复是在阿里云移动研发平台上的,他为用户提供一个可视化控制台,用起来比较直观简便。由于官方文档里有部分图片与现在平台呈现的不一致,所以我将创建应用发布补丁等图都截了下来。接下来内容图片有点多,看得懂官方文档的可以跳过这一节。
1.注册账号开通服务
注册就不说了,注册完在产品中找到移动热修复,首次使用要开通服务。
开通服务后,点击添加产品,输入产品名称。
然后进入你添加的产品。
添加应用,输入app名称和包名,包名一定要跟项目的包名一致。
进入刚创建的应用,然后选择左边菜单栏的移动热修复。
点击右上角的应用信息,就可以看到我们初始化时需要用到的三个参数了,把他配置到我们的项目代码中。
点击左上角的功能,然后点击添加版本,这里输入的版本号要跟你项目配置文件中的versionCode一样,比如我的项目中versionCode为1,那我就写1.0。
添加完版本后,就可以开始上传补丁进行热修复了,在上传补丁前,我们要用一个叫SophixPatchTool工具来生成补丁包。
-
Mac版本打包工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_macos.zip
-
Windows版本打包工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_windows.zip
-
Linux版本打包工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_linux.zip
该工具提供了Windows和macOS和Linux版本,Windows下运行SophixPatchTool.exe,macOS下运行SophixPatchTool.app,Linux下(Ubuntu 16.04 64bit最佳)运行SophixPatchTool。并且需要安装Java环境且在JDK7或以上才能正常使用。
我使用的是Windows版本的打包工具,旧包就是存在bug的apk,新包就是更新完bug要进行热修复的包。
设置界面主要是设置补丁输出路径和一些其他配置,我只设置了输出路径。
- 补丁输出路径:<必填> 指定生成补丁之后补丁的存放位置,必须是已存在的目录。
- Key Store Path:<选填>本地的签名文件的路径,不输入则不做签名。
- Key Store Password:<选填>证书文件的密码。
- Key Alias:<选填>Key的别名。
- Key Passwrod:<选填>Key的密码。
- AES Key:<选填>自定义aes秘钥, 必须是16位数字或字母的组合。必须与setAesKey中设置的秘钥一致。
- Filter Class File:<选填>本地的白名单类列表文件的路径,放进去的类不会再计算patch,文件格式: 一行一个类名。
高级里我只去掉强制冷启动,你们也可以不操作这里。
然后就可以点击GO,开始生成补丁了。这里要注意的是,如果你AndroidStudio中开着install run,一定要关闭,不然你生成补丁时他会一直显示正在生成补丁,但是一直不会停止。关闭install run方法为:File->Settings->install run->去掉勾
如果生成补丁前没关install run的话,最好重新生成一下apk包再去生成一个名为sophix-patch的补丁文件。
补丁生成后,我们就可以上传补丁。在之前创建的版本上点击上传补丁,上传成功后,发布状态会变成已就绪。
点击详情,可以看到右上角有个补丁验证,在新建发布前,我们一定要先自己测试下热修复是否成功。这里需要用官方提供的调试工具来测试,具体操作可以看官方的调试补丁章节。
调试无误后,就可以新建发布了,发布主要有两种类型:灰度发布和全量发布,灰度发布可以限定人数。官方要求发布前请严格按照:扫码内测 => 灰度发布 => 全量发布的流程进行,以保证补丁包能够正常在所有Android版本的机型上生效。
选择好发布类型,点击发布后,你的补丁就在服务器上了。此时你关掉你的app(杀掉后台进程)重新打开,你会发现你原来设置的bug已经不存在了,说明热修复成功。
写到这里就结束啦,可能有些地方说的不太清楚,大家有问题可以留言。不过Sophix并不支持修改AndroidManifest.xml文件,不支持添加四大组件,也不能改版本号(改了也不会生效),所以跟我一样想用热修复充当更新app功能的小伙伴可能要动下脑筋咯!
最后附上:Andorid接入常见问题