Android开发接入阿里热修复Sophix框架

释放双眼,带上耳机,听听看~!

一:为什么选阿里热修复

二:阿里热修复的原理(Sophix技术概览:https://yq.aliyun.com/articles/103527

三:创建产品及应用(一二三点,都在阿里云官网可以看到)

1.1 找到移动研发平台入口

在阿里云官网,找到:移动研发平台,点击后,进入到移动研发平台官网详情页面

点击后,进入到移动研发平台(Enterprise Mobile Application Studio,简称EMAS)官网详情页面,如下图所示:

1.2 进入管理控制台

如果没有开通服务,点击“立即开通”,用支付宝登入下,用支付宝个人实名认证下

然后开通EMAS服务

如果已经开通,点击“管理控制台”按钮,进入到控制台页面,点击新建产品

1.3 点击产品,进入到单产品服务目录页面

点击移动供热修复,如果没有应用,前先添加应用

写入应用包名和名称

下载aliyun-emas-services.json,并放置到根目录下


1.4 获取SDK配置信息

获取到AppKey和AppSecret

2 SDK快速接入

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

添加maven仓库地址:

allprojects {
repositories {
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
}
}

2.2 添加gradle坐标版本依赖:

implementation('com.aliyun.ams:alicloud-android-hotfix:3.2.8') {
//utdid冲突处理
// exclude(module: 'alicloud-android-utdid')
}

2.3 Sophix SDK使用到以下权限

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

2.4 在AndroidManifest.xml的Application节点下添加如下配置

<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="2*******71" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="2*******8" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="M***Gw />

这个RSASECRET的值,我在控制台没有看到,是在aliyun-emas-services.json里找到的

2.5  混淆配置

#基线包使用,生成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

2.6 在application下添加代码,实现快速接入

public class HotFixApplication extends Application {
private final String TAG = "HotFixApplication";
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//  MultiDex.install(this);
final SophixManager instance = SophixManager.getInstance();
instance.setContext(this)
.setAppVersion(getVersionCode(base))
.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类说明
}
Log.d(TAG, "code=" + code + "   info=" + info + "   handlePatchVersion=" + handlePatchVersion);
}
}).initialize();
}
private String getVersionCode(Context base) {
try {
return String.valueOf(base.getPackageManager().getPackageInfo(base.getPackageName(), 0).versionCode);
} catch (PackageManager.NameNotFoundException e) {
return "";
}
}
@Override
public void onCreate() {
super.onCreate();
SophixManager.getInstance().queryAndLoadNewPatch();
}
}

备注:官方文档地址:https://help.aliyun.com/product/51340.html?spm=a2c4g.11186623.6.540.47e3741ex5bVzq

调试工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/hotfix_debug_tool-release.apk

3 实现热修复功能

我们原始的代码打个包,修改了再打个包(如果是系统版本超过6.0的,要填加手动获取权限的代码,要不然会在加载补丁的时候报没有权限的错误),用sophix热更新补丁工具,生成补丁(这个设置和高级,自己看着配置下)

生成了补丁,先将补丁放到某个文件夹里

用Sophix调试工具加载本地的补丁,测试下热修复(安装的要是旧包,然后通过热修复,达到新包的样子)

这个状态码,官方有文档的,可以自己对照看下,上面的是快速接入,这样接入有个在Android 9.0以上系统会有发生崩溃的风险缺点,最好选择稳健接入方式接入

4 稳健接入

前面的步骤都相同,就混淆文件和application改下

混淆文件添加

   -keepclassmembers class com.my.pkg.MyRealApplication {

   public <init>();

   }

   # 如果不使用android.support.annotation.Keep则需加上此行

   # -keep class com.my.pkg.SophixStubApplication$RealApplicationStub

新增SophixStubApplication文件

public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
@Keep
@SophixEntry(HotFixApplication.class)
static class RealApplicationStub {}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//         如果需要使用MultiDex,需要在此处调用。
//    MultiDex.install(this);
initSophix(base);
}
private void initSophix(Context base) {
final SophixManager instance = SophixManager.getInstance();
instance.setContext(this)
.setAppVersion(getVersionCode(base))
.setSecretMetaData(null, null, null)
.setEnableDebug(true)
.setEnableFullLog()
.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) {
Log.i(TAG, "sophix load patch success!");
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 如果需要在后台重启,建议此处用SharePreference保存状态。
Log.i(TAG, "sophix preload patch success. restart app to make effect.");
}
}
}).initialize();
}
private String getVersionCode(Context base) {
try {
return String.valueOf(base.getPackageManager().getPackageInfo(base.getPackageName(), 0).versionCode);
} catch (PackageManager.NameNotFoundException e) {
return "";
}
}
@Override
public void onCreate() {
super.onCreate();
SophixManager.getInstance().queryAndLoadNewPatch();
}
}
 

将AndroidManifest.xml里的application改为SophixStubApplication

<application
android:name=".SophixStubApplication"

5 发布补丁

上传补丁到后台,发布补丁

点击补丁管理  点击上传补丁

点击操作发布,到发布界面

发布完,查看详情

人已赞赏
Android文章

Android集成阿里消息推送

2021-2-1 18:55:09

Android文章

Android开发友盟多渠道打包和统计

2021-2-1 19:37:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索