"我正在参加「启航方案」"
这是我的第4篇文章
一、阿里云热修正Sophix的介绍
1.1、首要看一下市场上热修正方案的比较,如下图 原文:help.aliyun.com/document_de…
1.2、收费情况 原文:help.aliyun.com/document_de…
二、接入指南
2.1、预备
- 预备好阿里云账号
- 进行身份实名认证
-
移动研发渠道EMAS,进行项目创立,创立后会生成一个
aliyun-emas-services.json 文件
,里边包含了热修正sdk接入时所需的密钥,很重要
2.2、EMAS渠道的增加流程如下:
2.2.1、增加运用
生成运用的key信息文件,假如主张按需接入所需功用,没必要也不安全,按下图将文件放入到app中
下图的红框中的增加sdk也是,增加emas渠道中的所有功用,主张按需接入某个功用(如:热修),另外该插件在Android gradle 7
之上会报错
2.3、热修正接入 原文:help.aliyun.com/document_de…
留意点如下:
- 运用
gradle plugin版别高于4.2时
,可能会自动敞开资源优化。敞开资源优化后,资源名称被混杂,会导致补丁东西在生成补丁时一向卡在”开端构建补丁…..”,无法正常解析apk包。解决方案:在gradle.properties 中新增android.enableResourceOptimizations=false,
从头生成基线包和修正包,然后再生成补丁。 - 密钥的运用引荐在
SophixStubApplication 中初始化
,而不是在AndroidManifest文件中装备
- 运用android studio打包生成apk时,要封闭instant run。
- queryAndLoadNewPatch办法用来恳求控制台发布的补丁包,会涉及设备信息读取,所以有必要在用户赞同隐私协议之后调用。另外用户可根据事务情况,酌情考虑是否翻开此开关。
- 但不可放在attachBaseContext中,不然无网络权限,主张放在主进程用户赞同隐私协议之后的任意时间。
接入流程步骤如下:
增加工程依靠
1. Android Studio集成办法
gradle长途库房依靠, 翻开项目找到App的build.gradle文件,增加如下装备:
增加Maven库房地址:
****
```
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
```
2.增加gradle坐标版别依靠:
android {
......
defaultConfig {
applicationId "com.xxx.xxx" //包名
......
ndk {
//挑选要增加的对应cpu类型的.so库。
//热修正支持五种
abiFilters 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'x86', 'x86_64'
}
......
}
......
}
dependencies {
......
compile 'com.aliyun.ams:alicloud-android-hotfix:3.3.5'
......
}
3.增加运用权限
Sophix SDK运用到以下权限,运用Maven依靠或许aar依靠能够不用装备。具体装备在AndroidManifest.xml中。
<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"/>
4.装备AndroidManifest文件,
也能够不用装备(直接在SophixStubApplication,文件中初始化装备即可(引荐在SophixStubApplication中装备))
,在 移动研发渠道EMAS,进行项目创立,创立后会生成一个aliyun-emas-services.json 文件
,里边包含了热修正sdk接入时所需的密钥
在AndroidManifest.xml
中间的application
节点下增加如下装备:
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密钥" />
5. 混杂装备,按需装备
```
#基线包运用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/build/outputs/mapping/release途径下,移动到/app途径下
#修正后的项目运用,确保混杂成果共同
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#避免inline
-dontoptimize
```
**
**重要**
敞开混杂时,生成修正包要运用旧包的mapping文件以确保混杂成果共同。
初始化
6. 初始化
初始化的调用应该尽可能的早,有必要在Application.attachBaseContext()
的最开端(在super.attachBaseContext之后,假如有Multidex,也需求在Multidex.install之后)进行SDK初始化操作,初始化之前不能用到其他自定义类,不然极有可能导致崩溃。而查询服务器是否有可用补丁的操作能够在后面的任意当地。不主张在Application.onCreate()
中初始化,由于假如带有ContentProvider,就会使得Sophix初始化机遇太迟从而引发问题。
Sophix最新版别引入了新的初始化办法。
本来的初始化办法仍然能够运用。只是新办法能够供给更全面的功用修正支持,将会带来以下长处:
- 初始化与运用原先事务代码完全阻隔,使得原先真实的Application能够修正,而且减少了补丁预加载时间等等。
- 新办法能够更完美地兼容Android 8.0今后版别。
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
String appVersion = "0.0.0";
// 此处SophixEntry应指定真实的Application,而且确保RealApplicationStub类名不被混杂。
@SophixEntry(MyApplication.class)
static class RealApplicationStub {
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
initSophix();
}
private void initSophix() {
try {
appVersion = this.getPackageManager()
.getPackageInfo(this.getPackageName(), 0)
.versionName;
} catch (Exception e) {
}
final SophixManager instance = SophixManager.getInstance();
List<String> tags = new ArrayList<>();
///todo 构建正式包之前需求修正为:
///tags.add("production");
tags.add("test"); //这个值便是,你进行灰度包热修时,要填写的tag
for (String tag : tags) {
Log.e(TAG, "sophix tag:" + tag);
}
instance.setContext(this)
.setAppVersion(appVersion)
.setEnableDebug(false)
.setEnableFullLog()
.setTags(tags)
.setSecretMetaData("你自己的hotfix.idSecret",
"你自己的emas.appSecret",
"你自己的hotfix.rsaSecret")
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
Log.e(TAG, "sophix handlePatchVersion:" + handlePatchVersion + " /code:" + code + " /info:" + info);
if (code == PatchStatus.CODE_LOAD_SUCCESS) {
///重启后会装载补丁会调用该办法
Log.e(TAG, "sophix load patch " + handlePatchVersion + " success!" + info);
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
///补丁加载成功会调用该办法
// 假如需求在后台重启,主张此处用SharePreference保存状况。
Log.e(TAG, "sophix preload patch success. restart app to make effect. handlePatchVersion:" + handlePatchVersion);
Intent intent = new Intent();
intent.putExtra("message", "祝贺你,成功接收到发送的播送" + PatchStatus.CODE_LOAD_RELAUNCH);
intent.setAction("可运用重启播送重启");
sendBroadcast(intent);
}
}
}).initialize();
}
}
7.最后,需求把AndroidManifest里边的application改为这个新增的SophixStubApplication类:
<application
android:name="com.my.pkg.SophixStubApplication"
... ...>
... ...
这样便完成了新办法的初始化接入改造。
三、热修正打差量包流程 热修控制台地址:emas.console.aliyun.com/service/dev…
3.1、找到热修界面增加运用
如下图:留意运用版别有必要与你的versionName
共同,不然会导致后续下发查找不到差量包
3.2、打差量包 原文:help.aliyun.com/document_de…
- 预备好SophixPatchTool_windows打包东西各版别打包东西如下:
- Mac版别打包东西下载
- Windows版别打包东西下载
- Linux版别打包东西地址
- 打一个release的包
- 再第2步的release包的根底上修正一些内容,在打一个release包
- 利用东西开端打包,如下图
留意: 每次热修差量包的生成的根底包便是你前次发版后的包,并不是说你在进行第三次热修时,用第二次的热修包,作为基准包
问题包:1.0-querelease-2022-12-07.apk,修正包:1.0-release-2022-12-07.apk
翻开东西:
挑选两个包填充
挑选设置填好keystore
挑选高档,默许如下图,强制冷启动便是补丁包下发后有必要重启,主张勾选强制冷启动,为何:看下面解释
Sophix何时走即时生效热修正,何时走冷启动修正?
原文:help.aliyun.com/document_de…
装备完成后点击Go开端打差量包
成功
sophix-patch.jar 便是打出的差量包
四、上传补丁-发布
4.1、增加你的运用版别,然后上传补丁
4.2、发布补丁 原文:help.aliyun.com/document_de…
上传后点击发布如下图
下载[hotfixdebug]东西验证你的补丁包是否成功
,调试流程原文如下链接:help.aliyun.com/document_de…
调试没问题后点击上图的新建发布
发布的话:有全量,灰度两种,灰度的话
,需求设置指定标签tag
,便是你的运用app中Sophix所装备的,如下图:(引荐是全量)
4.3、发布成功后在app中调用查询补丁办法SophixManager.getInstance().queryAndLoadNewPatch()
后续将回调PatchLoadStatusListener
如下图
顺次出现热修状况码如下:状况码意义:help.aliyun.com/document_de…
上图加载成功后提示需求重启后热修生效
五、测验用例
1. 修正一个toast文案,然后修正成功。
2. 修正一张图片,增加一张新的图片进行展示,增加点击效果,增加一个新的类生成提示文案(mipmap-hdpi、drawable-xhdpi、drawable、都增加图片)
drawable-xhdpi 中新增热修图片增加可能会存在问题:如下,然后按要求在drawable 中增加后,热修成功。help.aliyun.com/document_de…
3. 增加assets文件,热修成功。
4. 四大组件不行
,由于需求在AndroidManifest.xml文件中装备,热修的时候运用的话会报找不到的,需求注册反常,如下图
5. 删去测验4中的组件跳转流程,热修测验成功,
6. 删去测验2中增加的xml中的代码与相关资源,热修测验成功
留意: 1.热修包存在的话,每杀死app,初始化进来都会走
onLoad办法的回调
code == PatchStatus.CODE_LOAD_SUCCESS
2.同一个热修包,设置不同的tag,然后点击下发的话都会下发一次
3.铲除热修包后,之前发布的版别都无效了,再次查询加载,都查不到了,只能之后在这个版别从头发布
SophixManager.getInstance().cleanPatches()