?如果一个App上线之后发现有重大bug需要紧急修复,那么通常做法是需要修改bug,然后重新打包发布,这样效率会比较低;但是有了热修复,就省事多了,下面就阿里的热修复集成使用做下说明记录,还是比较简单的,主要是对官网的内容做一个整合,看起来更方便一些。
1、首先是要去阿里云官网注册一个账号,然后进入移动研发平台EMAS?创建一个工作空间。之后进入空间按照提示添加应用。
2、上面内容填写完后点击下方的创建应用,进入下面的页面下载配置文件?
下面这个是配置文件的内容,其中status有1和0,1代表开通,0代表不开通,这里只使用热修复功能,所以只把第一个hotfix_service的status设置为1,其他的不用的都设置为0。?
?
??
?
?3、应用配置
?4、需要增加一个SophixStubApplication继承SophixApplication,此类不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。AndroidManifest中设置application为此类,而SophixEntry中设为原先Application类。注意原先Application里不需要再重复初始化Sophix,并且需要避免混淆原先Application类。
import android.content.Context;
import android.util.Log;
import androidx.annotation.Keep;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
/**
* Created by WJY.
* Date: 2021-11-05
* Time: 15:10
* Description: 阿里云 热修复
* Sophix入口类,专门用于初始化Sophix,不应包含任何业务逻辑。
* 此类必须继承自SophixApplication,onCreate方法不需要实现。
* 此类不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。
* AndroidManifest中设置application为此类,而SophixEntry中设为原先Application类。
* 注意原先Application里不需要再重复初始化Sophix,并且需要避免混淆原先Application类。
* 如有其它自定义改造,请咨询官方后妥善处理。
*/
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
@Keep
@SophixEntry(MyApplication.class)
static class RealApplicationStub {
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果需要使用MultiDex,需要在此处调用。
// MultiDex.install(this);
initSophix();
}
private void initSophix() {
String appVersion = "0.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();
}
}
<application
android:name=".application.SophixStubApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
?
5、AndroidManifest文件配置SDK参数(这一步要有,官网上只有在继承SDK的情况下才写了这个配置,如果不配置这个,会失败的:CODE_QUERY_BROKEN = 35;//请求完整性校验失败异常)
<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密钥" />
6、拉取补丁是非常简单的,只有一行代码(放在Application或者App启动页吧,或者自己来决定放在一个合适的地方):
SophixManager.getInstance().queryAndLoadNewPatch();
7、混淆配置:
#基线包使用,生成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.example.hotfixtext.MyApplication {
public <init>();
}
后面就是补丁的生成以及上传了,使用打包工具生成补丁包
打包工具下载地址(windows版本打包工具下载地址):
http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_windows.zip
?
?
?
?
?
?上传补丁:
?
?
?上传后可以测试一下是否好用,之后再发布,
补丁调试工具下载地址:
http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/hotfix_debug_tool-release.apk?spm=a2c4g.11186623.0.0.d8b62c8faBCJ5I&file=hotfix_debug_tool-release.apk
?到这就完成了热更新,在不影响用户使用的过程中不知不觉就把app中的bug给修改了。
|