热更新已经成为我们各大APP必备功能之一。当我们刚上线就发现一个小小的显示问题,但不得不改时;当我们需要修改一处UI,其他业务未动时;当我们需要增加一个方法,修改一个逻辑,但改动不大时,往往我们是不想再打包发版的。因为不断地下载更新包,不断地让用户安装应用,尤其是ToC的应用,会增加用户的反感。这个时候热更新就显得很有必要了。这里我们要介绍的是Sophix方案。Sophix方案是阿里的在线方案,只要我们能够接入外网,就可以使用该方案。当然,该方案如果用户数量多的话,需要支付相关费用,具体费用可以上官方网站查看,这里我们只提供相关的接入方式。
1.首先我们要加入阿里的maven仓库
在项目的build.gradle中
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
2.接着在app的build.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.2.17'
......
}
3.接着添加相关的权限
<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.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.配置Application
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
@Keep
@SophixEntry(MyRealApplication.class)
static class RealApplicationStub {}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果需要使用MultiDex,需要在此处调用。
// MultiDex.install(this);
initSophix();
}
private void initSophix() {
String appVersion = "1.0.0";
try {
appVersion = this.getPackageManager()
.getPackageInfo(this.getPackageName(), 0)
.versionName;
} catch (Exception e) {
}
final SophixManager instance = SophixManager.getInstance();
instance.setContext(this)
.setAppVersion(appVersion)
.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();
}
}
MyRealApplication是我们原有的Application
6.混淆文件添加如下
#基线包使用,生成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.**{*;}
-dontwarn com.alibaba.sdk.android.utils.**
#防止inline
-dontoptimize
-keepclassmembers class com.hao.hotfix.MyRealApplication {
public <init>();
}
-keep class com.hao.hotfix.SophixStubApplication$RealApplicationStub
7.清单文件中配置Application
android:name=".SophixStubApplication"
8.查询并加载补丁
SophixManager.getInstance().queryAndLoadNewPatch();
这样我们APP里的内容就好了。下面我们说明一下补丁包的生成。
9.生成补丁
https://help.aliyun.com/document_detail/53247.html?spm=a2c4g.11186623.6.557.2f3a6ee0hxzT0k
该地址是补丁包生成工具的下载地址,可以下载自己电脑对应系统的补丁包生成工具。
注意,这里的包需要是正式签名包。补丁生成工具中要设置签名的内容。
10.添加应用。
- 首先要先登录阿里云的官网
- 用公司提供的账号登录。就是淘宝账号即可。
- 点击右上角的控制台
- 从搜索框搜索移动热修复,并点击下拉框中的控制台入口的移动热修复
- 如果没有工作空间则创建一个。或者根据公司要求选择已有的工作空间。
- 进入工作空间,添加应用,需要应用的包名。
- 添加应用,并根据要求添加相应的代码和文件。注意我们之前添加过的不要重复添加。
- 添加好应用后,点击左侧的移动热修复标签
- 上方下拉框选择好我们刚刚添加的应用。
- 点击应用信息,可以获取到我们应用的app key等数据,填写到我们代码中,参考第4步。
- 然后点击左侧补丁管理,点击添加应用,并输入我们当前要进行热修复的版本名VersionName
- 然后选择对应版本上传补丁
- 之后我们打开应用稍后片刻,杀死应用重新进入后,会发现应用已经更新。
这里我要提示一点,我们在阿里云上添加补丁的版本一定要和我们现在要热更新的版本号一致,否则无法更新下来。
小伙伴们有问题可以给我留言,我在这里等你们交流学习心得。
最后我提供一下我的Gradle相关版本配置
classpath "com.android.tools.build:gradle:4.0.0"
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip