Sophix Demo-Android热更新

前段时间,苹果禁止了iOS的热修复功能,几个做iOS开发的朋友都苦不堪言,一旦遇到重要更新就需要全量发布,无法进行灰度,这就导致如果更新出现问题,就会变得十分麻烦,影响范围会很广。

庆幸的是Android尚未受到任何影响,目前的Android热更新基本上是采用底层替换或者是类加载,Sophix则把这两者进行了结合, Sophix 3.0也已上线,接入和使用非常简单。

一.控制台申请

登录阿里云控制台开通移动热修复服务,然后创建App。

在控制台找到你刚刚创建的App,点击管理即可查看详细信息

这里的AppId,AppSecret,RSA密钥是后面我们程序中需要用到的。

二.集成

1.Android stuido

Android stuido采用gradle远程仓库依赖, 打开项目找到app的build.gradle文件,添加如下配置:

添加maven仓库地址:

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

添加gradle坐标版本依赖:

1
2
3
4
5
repositories {
maven {
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.0'
}
}

2.eclipse

  • 下载OneSDk.zip,解压出hotfix_core-release.aar文件后再解压这个aar文件
  • 复制解压文件jni目录下的libsophix.so到自己的jni目录下, eclipse jni目录一般指的就是项目libs目录
  • 复制utdid4all-1.1.5.3_proguard.jar和alicloud-android-utils-1.0.3.jar文件到项目libs目录下
  • 重命名classes.jar为sophix.jar并复制到项目libs目录下
  • 合并AndroidManifest.xml文件中的内容到本项目AndroidManifest.xml文件
    (编译期间报utdid类重复异常, 那么步骤2中添加的utdid4all-1.1.5.3_proguard.jar从项目libs目录移除即可)

3.添加权限

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"/>

READ_EXTERNAL_STORAGE权限属于Dangerous Permissions,仅调试工具获取外部补丁需要,不影响线上发布的补丁加载,调试时请自行做好android6.0以上的运行时权限获取。

4.SDK接口接入

必须在Application.attachBaseContext()或者Application.onCreate()的最开始进行SDK初始化操作。

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)
.setSecretMetaData("idSecret","appSecret","rsaSecret")
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(int mode, int code, String info, int handlePatchVersion) {
// 补丁加载回调通知
if (code == PatchStatus.CODE_DOWNLOAD_SUCCESS) {
// 表明补丁加载成功
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 表明新补丁生效需要重启. 开发者可提示用户或者强制重启
} else {
// 其它错误信息, 查看PatchStatus类说明
}
}
}).initialize();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限。
SophixManager.getInstance().queryAndLoadNewPatch();

  • setSecretMetaData(idSecret, appSecret, rsaSecret): 三个参数是在阿里云控制台,移动热修复中申请得到的。

三.Demo测试

1.生成差量补丁

创建应用,添加TextView控件,进行第一次签名打包作为旧版:

1
2
3
4
5
6
7
8
9
10
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.txt);
textView.setText("旧版显示内容");
}
}

然后对代码进行调整,进行第二次打包作为新版:

1
2
3
4
5
6
7
8
9
10
11
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.txt);
textView.setText("我是新版显示内容");
Toast.makeText(this,"补丁更新成功",Toast.LENGTH_LONG).show();
}
}

下载阿里的SophixPatch Tool打补丁工具,在设置中进行补丁的输出路径和其它参数配置,然后生成补丁即可。

2.上传补丁

找到你添加的应用,点击管理,然后添加版本(这里的版本号对应的是当前投入使用的应用版本号,必须一致)。

然后在详情界面上传补丁,这里只是测试就不进行灰度,直接全量发布。

搞定!

四.总结

Sophix相比其它的热更新框架来说,集成很简单,完全是傻瓜式接入,不需要配置各种繁琐的参数。