使用阿里百川HotFix

前言:首先要弄懂HotFix是干嘛的,不然就别向下看了。这里仅仅根据官方文档的代码书写,亲测可用,不做理论指导。


Android Studio集成:

    添加maven仓库地址:

  1. repositories {
  2.    maven {
  3.        url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
  4.    }
  5. }

    添加gradle坐标版本依赖:

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

    权限说明:

  1. <! -- 网络权限 -->
  2. <uses-permission android:name="android.permission.INTERNET" />
  3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  5. <! -- 外部存储读权限 -->
  6. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    配置AndroidManifest文件:

  1. <meta-data
  2. android:name="com.taobao.android.hotfix.IDSECRET"
  3. android:value="App ID" />
  4. <meta-data
  5. android:name="com.taobao.android.hotfix.APPSECRET"
  6. android:value="App Secret" />
  7. <meta-data
  8. android:name="com.taobao.android.hotfix.RSASECRET"
  9. android:value="RSA密钥" />

    混淆配置:

  1. #基线包使用,生成mapping.txt
  2. -printmapping mapping.txt
  3. #生成的mapping.txt在app/buidl/outputs/mapping/release路径下,移动到/app路径下
  4.  
  5. #修复后的项目使用,保证混淆结果一致
  6. #-applymapping mapping.txt
  7.  
  8. #hotfix
  9. -keep class com.taobao.sophix.**{*;}
  10. -keep class com.ta.utdid2.device.**{*;}

    SDK接口配置:

  1. package xin.ceet.com.tencentdemo;
  2.  
  3. import android.app.Application;
  4.  
  5. import com.taobao.sophix.PatchStatus;
  6. import com.taobao.sophix.SophixManager;
  7. import com.taobao.sophix.listener.PatchLoadStatusListener;
  8.  
  9. /**
  10.  * Created by asus on 2017/7/5.
  11.  */
  12.  
  13. public class MyApplication extends Application {
  14.     private String appVersion = "1.0.0";
  15.     @Override
  16.     public void onCreate() {
  17.         super.onCreate();
  18.         SophixManager.getInstance().setContext(this)
  19.                 .setAppVersion(appVersion)
  20.                 .setAesKey(null)
  21.                 .setEnableDebug(true)
  22.                 .setPatchLoadStatusStub(new PatchLoadStatusListener() {
  23.                     @Override
  24.                     public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
  25.                         // 补丁加载回调通知
  26.                         if (code == PatchStatus.CODE_LOAD_SUCCESS) {
  27.                             // 表明补丁加载成功
  28.                         } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
  29.                             // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
  30.                             // 建议: 用户可以监听进入后台事件, 然后应用自杀
  31.                         } else if (code == PatchStatus.CODE_LOAD_FAIL) {
  32.                             // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
  33.                             // SophixManager.getInstance().cleanPatches();
  34.                         } else {
  35.                             // 其它错误信息, 查看PatchStatus类说明
  36.                         }
  37.                     }
  38.                 }).initialize();
  39.         SophixManager.getInstance().queryAndLoadNewPatch();
  40.     }
  41.  
  42. }

    版本说明:

  1. 说明一:patch是针对客户端具体某个版本的,patch和具体版本绑定
  2.  
  3. eg. 应用当前版本号是1.1.0, 那么只能在后台查询到1.1.0版本对应发布的补丁, 而查询不到之前1.0.0旧版本发布的补丁.
  4. 说明二:针对某个具体版本发布的新补丁, 必须包含所有的bugfix, 而不能依赖补丁递增修复的方式, 因为应用仅可能加载一个补丁
  5.  
  6. eg. 针对1.0.0版本在后台发布了一个补丁版本号为1的补丁修复了bug1, 然后发现此时针对这个版本补丁1修复的不完全, 代码还有bug2, 在后台重新发布一个补丁版本号为2的补丁, 那么此时补丁2就必须同时包含bug1bug2的修复才行, 而不是只包含bug2的修复(bug1就没被修复了)

    

原文地址:https://www.cnblogs.com/ceet/p/7121107.html