Android热修复之HotFix初探

开发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 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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值