开发Android时会遇到突发情况,或者人为失误出现bug,这是只能增加一个版本修复bug.但是,频繁增加版本易引起用户反感,所以热修复技术是有必要的。
hotfix是阿里百川推出的解决线上修复bug的技术
官方地址:https://hotfix.taobao.com/hotfix
那么,怎么使用呢?
首先,登录官方账号注册开发者。开始创建应用,建一个Android版,并开通hotfix后台(官方网上都有介绍),此时能获取appid 、RSA密钥 、App Secret,并下载Android sdk、 demo以及调试工具。
下载地址:http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.0hAQHX&treeId=234&articleId=105517&docType=1
怎么使用呢?
Androidstudio上新建Android项目
AndroidManifest.xml中
01.权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
02 添加hotfix配置
<meta-data
android:name="com.taobao.android.hotfix.APPKEY"
android:value="你的APPKEY" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="你的APPSECRET" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="你的RSASECRET"
appkey 获取在应用管理中
APPSECRET 和RSASECRET 在具体的Android 应用中
03 在根目录 app ->main->新建jniLabs文件夹并把sdk中的arm64-v8a和armeabi-v7a这两个库文件夹放到里面。
04 Module:app中
android {
//添加代码
signingConfigs {
release {
storeFile file("demo.jks")
storePassword "test123"
keyAlias "test123"
keyPassword "test123"
}
debug {
storeFile file("demo.jks")
storePassword "test123"
keyAlias "test123"
keyPassword "test123"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.debug
}
}
}
dependencies {
//添加代码
compile 'com.taobao.android:alisdk-hotfix:1.4.0'
}
05 Project:你的项目名中
//添加代码
allprojects {
repositories {
mavenLocal()
maven {
//百川仓库, ut/utdid
url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
}
mavenCentral()
jcenter()
flatDir {
dirs 'libs'
}
}
}
06 app文件夹下放打包store 本例demo.jks
07 刷新工程项目 点击sync 导入
08 创建application 并声明一下
public class MApplication extends Application {
public static String appVersion;
public static String appId;
@Override
public void onCreate() {
super.onCreate();
initApp();
initHotfix();
//有时候app报错执行太快 不行修复来不及需要延长一下
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void initApp() {
this.appId = "89588-1"; //TODO 替换掉自己应用的appId 还需要替换manifests中的APPKEY、APPSECRET和RSASECRET
try {
this.appVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
} catch (Exception e) {
this.appVersion = "1.0";
}
}
private void initHotfix() {
//此处不再需要调用queryNewHotPatch方法, initialize方法内部会调用queryNewHotPatch方法.
HotFixManager.getInstance().setContext(this)
.setAppVersion(MApplication.appVersion)
.setAppId(MApplication.appId)
.setAesKey(null)
.setSupportHotpatch(true)
.setEnableDebug(true)
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onload(final int mode, final int code, final String info, final int handlePatchVersion) {
// 补丁加载回调通知
if (code == PatchStatusCode.CODE_SUCCESS_LOAD) {
Log.e("LLLL","表明补丁加载成功");
// TODO: 10/24/16 表明补丁加载成功
} else if (code == PatchStatusCode.CODE_ERROR_NEEDRESTART) {
Log.e("LLLL","表明新补丁生效需要重启. 业务方可自行实现逻辑, 提示用户或者强制重启, 建议: 用户可以监听进入后台事件, 然后应用自杀");
// TODO: 10/24/16 表明新补丁生效需要重启. 业务方可自行实现逻辑, 提示用户或者强制重启, 建议: 用户可以监听进入后台事件, 然后应用自杀
} else if (code == PatchStatusCode.CODE_ERROR_INNERENGINEFAIL) {
Log.e("LLLL","内部引擎加载异常, 推荐此时清空本地补丁, 但是不清空本地版本号, 防止失败补丁重复加载");
// 内部引擎加载异常, 推荐此时清空本地补丁, 但是不清空本地版本号, 防止失败补丁重复加载
HotFixManager.getInstance().cleanPatches(false);
} else {
Log.e("LLLL","其它错误信息, 查看PatchStatusCode类说明");
// TODO: 10/25/16 其它错误信息, 查看PatchStatusCode类说明
}
}
}).initialize();
}
}
09 在MainActivity中制造错误,例如显示颜色
tv.setTextColor(Color.parseColor(“##ff00ff”));
此时运行一下是会崩溃的
10 混淆添加
-applymapping mapping.txt
#HotFix
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
-keep class com.alipay.euler.andfix.**{
*;
}
-keep class com.taobao.hotfix.aidl.**{*;}
-keep public class com.alibaba.mtl.log.model.LogField {public *;}
-keep class com.ta.utdid2.device.**{*;}
-keep class com.taobao.hotfix.HotFixManager{
public *;
}
11 打包一下 修改文件名old.apk
12 修改错误代码为
try {
tv.setTextColor(Color.parseColor("##ff00ff"));
} catch (Exception e) {
tv.setTextColor(Color.parseColor("#ff00ff"));
}
再次打包 修改文件名为new.apk
13 在项目下或者别的地方建一个文件夹 例如百川热修复打包工具包
在下面放 没有的从demo中获取即可
其中 patch_out是一个存放生成修复jar的空文件夹
dopatch.sh 代码为
#!/usr/bin/env bash
java -jar BCFixPatchTools-1.3.0.jar -cmd patch -src_apk old.apk -fixed_apk new.apk -wp patch_out -sign_file_url demo.jks -sign_file_pass test123 -sign_alias test123 -sign_alias_pass test123 -filter_class_file classFilter.txt
adb push patch_out/hotfix-working/baichuan-hotfix-patch.jar /sdcard/Download
14 打热修复包
终端中找到百川热修复打包工具包目录(cd命令)
运行 ./dopatch.sh
14 运行 adb install 你的old.apk路径,安装旧的,此时会报错
15 在hotfix后台上传你的jar(在patch_out中)并使用发布使用,此时你原来打开报错的app现在正常了,管理后台也显示推送补丁包成功。
最后附上demo:http://download.csdn.net/detail/lchannel/9748975
如有问题,随时联系我,谢谢。