阿里百川HotFix快速集成

阿里百川HotFix快速集成 ————Andoid Studio 集成方式

阿里百川HotFix虽然是基于Andfix,但用起来发现又比Andfix升级了不少,突破了其开源项目的不少限制,感兴趣也可以对比下其产品和AndFix的开源项目。
阿里百川HotFix地址:http://baichuan.taobao.com/product/hotfix.htm

这是AndFix在GitHub的链接:https://github.com/alibaba/AndFix


   废话不多说,开始集成吧!

Part1 先把准备工作做好

1.1Android Studio 集成方式

gradle远程仓库依赖,注意这里是打开项目找到app的build.gradle文件,添加如下配置:

添加maven仓库地址:

repositories {
   maven {
       url "http://repo.baichuan-android.taobao.com/content/groups/public/"
   }
}
*这里要注意如果已经有一个远程依赖,可以在下面直接添加maven即可;

添加gradle坐标版本依赖:

dependencies {
    compile 'com.alibaba.sdk.android.plugins:alisdk-hotfix:1.3.3'
    compile 'com.alibaba.sdk.android.plugins.jar:alisdk-utdid:0.0.1'
}

这里可能会出现错误utdid类重复异常,此时去掉compile 'com.alibaba.sdk.android.plugins.jar:alisdk-utdid:0.0.1'依赖即可。


这里远程仓库访问失败那么可以选择本地库 这是 HotFix集成的SDK下载链接解压,粘贴到 libs目录下即可。 然后更新模块下的 build.gradle 文件。

repositories {
    ...//这里是以前的
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    compile files('libs/alisdk-utdid-0.0.1.jar')
    compile(name:'alisdk-hotfix-1.3.3', ext:'aar')  
}

1.2权限的说明

AndroidManifest.xml文件里添加hotfix sdk所需要的权限








1.3 配置AndroidManifest文件 ——需要到登陆HotFix后台获取密钥

获取 密钥链接如下图:



AndroidManifest.xml 中间的 application 节点下添加


RSA密钥" />

1.4混淆配置

在proguard-rules.pro中配置如下代码

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native ;
}
-keep class com.alipay.euler.andfix.**{
    *;
}
-keep class com.taobao.hotfix.aidl.**{*;}
-keep class com.ta.utdid2.device.**{*;}
-keep class com.taobao.hotfix.HotFixManager{
    public *;
}

1.5特别申明

检查当前项目结构是否存在jniLibs,如果没有将不需要做任何操作。 如果有就需要添加armeabi-v7a/arm64-v8a目录,请下载SDK地址解压放入。


Part2 SDK接口使用说明

2.1 接入规范

initialize的调用应该尽可能的早. 强烈推荐在 Application.onCreate() 中进行SDk初始化以及查询服务器是否有可用补丁的操作.

public class MainApplication extends Application {
   
public static String appVersion;
  
public static String appId;

@Override
    
public void onCreate() {
    
    super.onCreate();
   
    initApp();//初始化APP
    
    initHotfix();//初始化Hotfix
  
  }
   
 private void initApp() {
  
      this.appId = "*******"; //替换掉自己应用的appId
     
    try {
       
     this.appVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
       
  }
 catch (Exception e) {
       
     this.appVersion = "1.0.0";
     
   }
  
	  }

    /**
     * 建议在Application.onCreate方法中执行initialize和queryNewHotPatch操作, 尽可能早的执行
     */
 
 private void initHotfix() {
     
   HotFixManager.getInstance().initialize(this, appVersion, appId, true, new PatchLoadStatusListener() {
  
	@Override
    
public void onload(int mode, int code, String info, int handlePatchVersion) {
          
      // 补丁加载回调通知
           
     if (code == PatchStatusCode.CODE_SUCCESS_LOAD) {
        
            // TODO: 表明补丁加载成功
        
        } else if (
	code == PatchStatusCode.CODE_ERROR_NEEDRESTART) {
    
 // TODO:  表明新补丁生效需要重启. 业务方可自行实现逻辑, 提示用户或者强制重启, 建议: 用户可以监听进入后台事件, 然后应用自杀
      
          } else {
       
         // TODO: 其它错误信息, 查看PatchStatusCode类说明
     
           }
       
     }
   
   });
      
  HotFixManager.getInstance().queryNewHotPatch();
  
  }

}

千万要记住要在AndroidManifest.xml中实例化Application

2.2新apk和旧apk



为了让我们知道
新apk旧apk不同处,在MainActivity里面添加一个TextView,并设置他的内容为“之前版本”。为了更加明显可以将它的字体设大,字体颜色设置为比较显眼的颜色比如红色

public class MainActivity extends Activity {
    private TextView iv_text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_text=(TextView) findViewById(R.id.main_text);
        String text=("" + "之前版本" + "");
        iv_text.setText(Html.fromHtml(text));
        iv_text.setTextSize(50);
    }
}

如果keystore还未生成,立即生成keystone并且记录下keystore的路径和密码还有别名和别名的密码,以便patch打补丁时用,再把apk签名,取名hotfix_old.apk。如果keystore已经生成直接签名apk。


2.3写新apk

⑴更新MainActivity

public class MainActivity extends Activity {
    private TextView iv_text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_text=(TextView) findViewById(R.id.main_text);
        String text=("" + "新版本" + "");
        iv_text.setText(Html.fromHtml(text));
        iv_text.setTextSize(50);
    }
}

⑵更新build.gradle

把versionCode和versionName+1

代码如图:

阿里百川HotFix快速集成_第1张图片


阿里百川HotFix快速集成_第2张图片


完成后点右上角 Sync now 没报错,然后再签名 apk, 取名 hotfix_new.apk

 

2.4 打补丁包

打开cmd,代码示例如下:
这是官方的示例:
java -jar BCFixPatchTools-1.3.0.jar -c patch -s old.apk -f new.apk -w 
patch-out -k test.keystore -p test123 -a test123 -e test123 -l filterClass.txt
这是我的示例

注意:java -jar BCFixPatchTools-1.3.0.jar注意使用绝对路径而不是相对路径! 查看命令参数帮助java -jar BCFixPatchTools-1.3.0.jar -cmd help

java -jar C:/Users/thinkpad/Desktop/1/hotfixBCFixPatchTools-1.3.0.jar -c patch -s 
C:/Users/thinkpad/Desktop/1/e_old.apk -f C:/Users/thinkpad/Desktop/1/e_new.apk C:/
Users/thinkpad/Desktop/1 -k C:/Users/thinkpad/Desktop/myproject.jks -p 123456 -a 
elsa -e 123456 -l E:/ElsaHotFix/patchtool_demo/filterClass.txt


 参数说明

-c, -cmd: 值为patch: 打补丁命令 值为help: 查看使用说明

-s, -src_apk:填写本地的原始APK(有问题的APK). 必选

-f, -fixed_apk:已经修复过该问题APK. 必选

-w, -wp:输出patch的路径, 最后如果打补丁成功会在wp目录下自动创建的hotfix-working目录生成baichuan-hotfix-patch.jar补丁文件. 必选

-k, -sign_file_url:本地的签名文件的路径,不输入则不做签名. 可选(注意:填你的keystore路径

-p, -sign_file_pass: 证书文件的密码, 可选(注意:填你的keystore密码

-a, -sign_alias: 证书的别名. 可选(注意:填你的keystore别名

-e, -sign_alias_pass: 证书别名的密码. 可选(注意:填你的keystore别名密码

-l, -filterClassFilePath:本地的白名单类列表文件的路径,放进去的类不会再计算patch,文件格式: 一行一个类名. 可选(注意:没有特别不需要patch可不填

正常情况下, hotfix-working目录下将会有baichuan-hotfix-patch-unsigned.jar未签名补丁包和baichuan-hotfix-patch.jar -->签名补丁包 (如果没有,那么补丁签名失败)

如果没加`-sign_file_url`等签名相关参数,那么只会生成`baichuan-hotfix-patch.jar`,此时补丁也是未签名的!


2.5 应用补丁包

2.5.1 安装hotfix_ old.apk, 运行然后TextView显示“之前版本”。


阿里百川HotFix快速集成_第3张图片

2.5.2 安装调试工具,输入你的项目包名如:“com.myhotfix.点击连接应用

阿里百川HotFix快速集成_第4张图片


2.5.3 推送补丁包到本地任何一个目录,比如:adb push C:/Users/thinkpad/Desktop/hotfix/patch-out/hotfix-working/baichuan-hotfix-patch.jar /sdcard/Download。

 

2.5.4 调试工具应用本地补丁按钮上面那个输入框填写:/sdcard/Download/baichuan-hotfix-patch.jar,然后点击应用本地补丁按钮。

显示app connect successful则表示连接app成功!

2.5.5调试工具如果显示"Code:1 Info:load patch success"日志,则表明补丁加载成功.

阿里百川HotFix快速集成_第5张图片

这里列举几个常见的code码说明, 详情查看SDK中PatchStatusCode类说明

  • code: 1 补丁加载成功
  • code: 6 服务端没有最新可用的补丁
  • code: 11 RSASECRET错误,官网中的密钥是否正确请检查
  • code: 12 当前应用已经存在一个旧补丁, 应用重启尝试加载新补丁
  • code: 13 补丁加载失败, 导致的原因很多种, 比如UnsatisfiedLinkError等异常, 此时应该严格检查logcat异常日志
  • code: 16 APPSECRET错误,官网中的密钥是否正确请检查
  • code: 403 签名不匹配,可能是APPID APPSECRET填错,请检测
如果上述都没有可以直接加官方的钉钉群咨询。

2.5.6 切换回原应用, TextView显示“新版本”.补丁生效!

阿里百川HotFix快速集成_第6张图片

测试成功后,如何让所有安装这个apk的用户都更新了apk呢?请看下面文档!


Part3 补丁发布

补丁地址

3.1 在我的应用里创建版本 

阿里百川HotFix快速集成_第7张图片

3.2上传补丁包(补丁描述一下方便以后看是改了什么内容)

阿里百川HotFix快速集成_第8张图片

3.3发布补丁

阿里百川HotFix快速集成_第9张图片

确认全量发布后所有安装了这个apk的用户都会被更新!


本文章参考:
阿里百川HotFix官方文档:   http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.jHO22R&treeId=234&articleId=105457&docType=1
android热修复技术选择——三大流派解析:  http://mp.weixin.qq.com/s/uY5N_PSny7_CHOgUA99UjA
阿里百川HotFix虽然是基于Andfix,但用起来发现又比Andfix升级了不少,突破了其开源项目的不少限制,感兴趣也可以对比下其产品和AndFix的开源项目。

你可能感兴趣的:(阿里百川HotFix快速集成)