阿里百川HotFix虽然是基于Andfix,但用起来发现又比Andfix升级了不少,突破了其开源项目的不少限制,感兴趣也可以对比下其产品和AndFix的开源项目。
阿里百川HotFix地址:http://baichuan.taobao.com/product/hotfix.htm
这是AndFix在GitHub的链接:https://github.com/alibaba/AndFix
废话不多说,开始集成吧!
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'
依赖即可。
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')
}
在AndroidManifest.xml文件里添加hotfix sdk所需要的权限
RSA密钥" />
-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 *;
}
检查当前项目结构是否存在jniLibs,如果没有将不需要做任何操作。 如果有就需要添加armeabi-v7a/arm64-v8a目录,请下载SDK地址解压放入。
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();
}
}
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。
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);
}
}
把versionCode和versionName都+1
代码如图:
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`,此时补丁也是未签名的!
显示app connect successful则表示连接app成功!
这里列举几个常见的code码说明, 详情查看SDK中PatchStatusCode类说明
测试成功后,如何让所有安装这个apk的用户都更新了apk呢?请看下面文档!
确认全量发布后所有安装了这个apk的用户都会被更新!