Sophix热更新

  1. 一、基础
  2. 二、代码
    1. 1.添加项目
    2. 2.添加应用配置
    3. 3.添加配置文件
    4. 4.gradle配置
    5. 5.重要的信息
    6. 6.代码
    7. 7.生成补丁
    8. 8.上传补丁

一、基础

这里的Sophix与TinkerPatch方案不同,使用的是指针替换来修改方法的热更新方案。

二、代码

1.添加项目

首先在阿里云中添加产品:
![github] (/img/sophix/0.png)
添加Demo和添加基本信息,添加后就会在面板中显示

2.添加应用配置

点击进入后添加应用配置:
![github] (/img/sophix/1.png)
填写相应的应用信息

3.添加配置文件

这里有一个json的配置文件,是用来管理所有的功能。这里放到app文件夹下。
github
这里可以将其他的都关掉(设置0),将热更新的服务打开(设置1)。

{
"config": {
"emas.appKey":"",
"emas.appSecret":"",
"emas.packageName":"",
"hotfix.idSecret":"",
"hotfix.rsaSecret":"",
"httpdns.accountId":"",
"httpdns.secretKey":""
},
"services": {
"httpdns_service": {
"status": 0,
"version":"1.2.1"
},
"cps_service": {
"status": 0,
"version":"3.1.4"
},
"hotfix_service": {
"status": 1,
"version":"3.2.6"
},
"man_service": {
"status": 0,
"version":"1.2.4"
},
"feedback_service": {
"status": 0,
"version":"3.1.8"
}
},
"use_maven":true,
"proguard_keeplist":""
}

4.gradle配置

最后添加相应sdk
在项目下build.gradle

buildscript {
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
}
dependencies {
// 添加emas-services插件
classpath 'com.aliyun.ams:emas-services:1.0.1'
}
}
allprojects {
repositories {
...
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
}
}
}

在app下build.gradle中

apply plugin: 'com.aliyun.ams.emas-services'

dependencies {
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.3'
}

5.重要的信息

AppKey
AppSecret
RSA
三个中要的数据需要在项目下的AndroidManifest文件下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
...
>
<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="" />

</application>

这里只需要将之前的三个数据复制即可。

6.代码

class xxxApplication extends Application {

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
SophixManager.getInstance().setContext(this)
.setAppVersion(" 这里填入我们需要区分的版本号,多渠道下使用"字母+数字"来加以区别 ")
.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
Intent intent = getPackageManager().getLaunchIntentForPackage(CasApplication.this.getPackageName());
PendingIntent restartIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒钟后重启应用
SophixManager.getInstance().killProcessSafely();
} else {
// 其它错误信息, 查看PatchStatus类说明
}
}
}).initialize();
}

@Override
public void onCreate() {
super.onCreate();

// 这里进行对更新的查询
SophixManager.getInstance().queryAndLoadNewPatch();

}

}

7.生成补丁

这里与Tinker类似但是使用的不同的工具,需要在官方下载 SophixPatchTool 来生成我们需要的补丁,最后上传即可
github

1.选择基础包
2.选择更新包
3.设置中配置Key的基本参数
4.高级配置
5.打包

8.上传补丁

在添加版本时需要注意这里可以就可以进行版本的分渠道区分来,可Tinker类似的使用”字母+数字”的多渠道来加以区别。
github

之后就是上传文件及发布版本即可。
注意的是在每台设备每天只允许免费更新20次,多出次数则会另算价格。