Android热修复之HotFix初探

来源:互联网 发布:美国本周经济数据 编辑:程序博客网 时间:2024/05/20 05:59
开发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 获取在应用管理中
图1
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中获取即可
图2
其中 patch_out是一个存放生成修复jar的空文件夹
dopatch.sh 代码为

#!/usr/bin/env bashjava -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.txtadb 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

如有问题,随时联系我,谢谢。

1 0
原创粉丝点击