Andoid

HotFix 阿里百川热修复接入笔记

2017-05-27  本文已影响0人  Haraway

1.使用文档链接:

http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.nBrUzS&treeId=234&articleId=105461&docType=1

2,创建应用

创建应用.png

3.代码部分配置

3.1 清单文件

<!-- Hotfix配置 -->
       <meta-data
           android:name="com.taobao.android.hotfix.IDSECRET"
           android:value="xxx" />
       <meta-data
           android:name="com.taobao.android.hotfix.APPSECRET"
           android:value="xxx" />
       <meta-data
           android:name="com.taobao.android.hotfix.RSASECRET"
           android:value="xxx" />

3.2 gradle 的配置
gradle远程仓库依赖, 打开项目找到app的build.gradle文件,添加如下配置:
添加maven仓库地址:

repositories {
 maven {
   url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
 }
}

添加gradle坐标版本依赖:

dependencies {
  compile 'com.taobao.android:alisdk-hotfix:2.0.9'
}

3.3 application 里面初始化


   /**
    * mode: 补丁模式, 0:正常请求模式 1:扫码模式 2:本地补丁模式
    * code: 补丁加载状态码, 详情查看PatchStatusCode类说明
    * info: 补丁加载详细说明, 详情查看PatchStatusCode类说明
    * handlePatchVersion: 当前处理的补丁版本号, 0:无 -1:本地补丁 其它:后台补丁
    * <p>
    * <p>
    * code 0: 准备开始拉取最新补丁
    * code: 1 补丁加载成功
    * code: 2 sdk初始化失败 加了setUnsupportedModel
    * code: 6 服务端没有最新可用的补丁
    * code: 8 补丁下载失败
    * code: 9 补丁下载成功
    * code: 11 RSASECRET错误,官网中的密钥是否正确请检查
    * code: 12 当前应用已经存在一个旧补丁, 应用重启尝试加载新补丁
    * code: 13 补丁加载失败, 导致的原因很多种, 比如UnsatisfiedLinkError等异常, 此时应该严格检查logcat异常日志
    * code: 14 找不到任何可加载的补丁文件 一种情况是确实没有,一种情况是需要考虑补丁文件可能放在sdcard等外部存储器中,sdk22以上版本机器需要6.0权限。
    * code: 16 APPSECRET错误,官网中的密钥是否正确请检查
    * code: 18 一键清除补丁
    * code: 19 连续两次queryAndLoadNewPatch()方法调用不能短于3s
    * errorCode:-101 异常
    * <p>
    */
   private void initHotfix() {
       String appVersion;
       try {
           appVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
           Log.i(TAG, "appVersion==" + appVersion);
       } catch (Exception e) {
           appVersion = "x.x";
       }

       SophixManager.getInstance().setContext(this)
               .setClearPreVerify(LibCoreApp.class)//过滤掉初始化不必要的父类,保证在application下初始化
               .setClearPreVerify(LibExtApp.class)
               .setClearPreVerify(WXApp.class)
               .setClearPreVerify(GlobalApp.class)
               .setAppVersion(appVersion)
//                .setUnsupportedModel("2014501", android.os.Build.VERSION_CODES.KITKAT)//无法支持修复的机型加入黑名单
//                .setAesKey(null)
               .setAesKey("2017042020170426")//16位任意数加密
//                .setEnableDebug(true) // 调试的时候可以打开,过滤sophix看日志,绕过密码签名检验。
               .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                   @Override
                   public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
//                      String msg = new StringBuilder("").append("Mode:").append(mode)
//                              .append(" Code:").append(code)
//                              .append(" Info:").append(info)
//                              .append(" HandlePatchVersion:").append(handlePatchVersion).toString();
//                      if (msgDisplayListener != null) {
//                          Log.i(TAG, "handle chenji-- " + code);
//                          msgDisplayListener.handle(msg, code);
//                      } else {
//                          mCode = code;
//                          Log.i(TAG, " chenji-- " + code);
//                          cacheMsg.append("\n").append(msg);
//                      }

//                        // 补丁加载回调通知
//                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
//                            // 表明补丁加载成功
//                            Log.i(TAG, "表明补丁加载成功");
//                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
//                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
//                            Log.i(TAG, "新补丁生效需要重启");
////                            android.os.Process.killProcess(android.os.Process.myPid());
//                            // 建议: 用户可以监听进入后台事件, 然后应用自杀
//                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
//                            // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
//                            Log.i(TAG, "内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载");
//                            // SophixManager.getInstance().cleanPatches();
//                        } else {
//                            Log.i(TAG, "其它错误信息, 查看PatchStatus类说明");
//                            // 其它错误信息, 查看PatchStatus类说明
//                        }
                       Log.d(TAG, "\n Mode: " + mode + "\n Code: " + code + ", Info: " + info + "\n HandlePatchVersion: " + handlePatchVersion);
                   }
               }).initialize();
   }
SophixManager.getInstance().queryAndLoadNewPatch();

4.测试流程: 本地二维码测试--灰度发布测试--全量发布。注意:测试的时候需要过滤GlobalApp来查看log,对应的code等信息是否正常回调。

5.打补丁工具(打包工具)设置: http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.2SFQp9&treeId=234&articleId=105517&docType=1

如果代码改动比较大必须勾上强制冷启动,改动小可以不勾选代表是热启动修复。
如果没有修改资源文件就勾上不比较资源
如果没有so文件修改就勾上。

6. 注意: 线上补丁包最大支持5M

问题修复: 有问题就重启App,最好是等1~2分钟。

7. 操作流程:

修复bug1准备:基准包 新包1 补丁1 ,线上发布:补丁1;
操作:将基准包下载到手机,开启后首页调用查询请求补丁包,收到 code 0 开始拉取补丁包, code 9 下载补丁包成功, code 12 重启app ,重启app后返回 code 1 加载补丁1成功。

修复bug2 准备:基准包 新包2 补丁2 ,线上发布:补丁2,;
操作:在原来修复bug1后的app的基础上进行,首先,重启app,开启后首页会调用查询请求补丁包,收到 code 0 开始拉取补丁包, code 9 下载补丁包成功, code 12 表示需要重启app ,重启app后返回 code 1 加载补丁2成功。

上一篇下一篇

猜你喜欢

热点阅读