最近,我们的应用出了一个兼容性的小bug,但是解决这个bug的新版本却发布了快一个月,这其中有种种问题导致新的版本发布不断拖后,为了解决快速解决线上bug这个问题,查阅了一下资料,什么androidfix,还有什么其他的,这个就不啰嗦了,大家可以参考这个文章了解一下。
过了一个G20,偶尔逛了一下阿里百川,发现百川发布的一个sdk,于是怀抱着期待来到这里分享一下使用阿里百川的hotfix解决方案中的一些梗。
首先分享一下阿里百川hotfix解决方案,这个sdk是基于andfix方案的一个扩展,对于andfix进行一些优化,极大的方便了我们的使用,如果顺利的话可能几个小时就可以解决热修补的问题,当然先关机型的不支持也再所难免,谁让android这么开放呢!
目前这个SDK还在公测中,或许会有一些bug,但是总比自己费力的构造要好的多,所以,果断选择。
SDK指南如下:阿里百川hotfix
首先,你要成为阿里百川的开发者,成为开发者以后创建你的应用,即可实现后续集成步骤。
Android studio 集成过程中,需要注意阿里系的UTDID这个东西,经常使用友盟或者阿里的东西都知道,这个是个梗。
在添加依赖过程中,使用gradle的同学们,你可以直接在app目录下的build.gradle 文件添加
(这里一定要注意是app目录下的哦)
repositories {
maven {
url "http://repo.baichuan-android.taobao.com/content/groups/public/"
}
}
然后就要说一个梗了,官方的介绍是这样的
然而事实并不是你注释了compile utdid 的语句就能解决的,如果只compile hotfix,还是会自动依赖utdid,正确的姿势是这样的
compile ('com.alibaba.sdk.android.plugins:alisdk-hotfix:1.0.0.3'){
// exclude module:"alisdk-utdid"
transitive false
}
//这里exclude 这一句和transitive这一句可以二选一
姿势正确给个满分!
然后你按照官网的要求配置Manifest节点和权限就可以初始化了
配置appsecret和rsasecret
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="your-app-secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="your-rsa-secret" />
添加权限
<! -- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<! -- 存储读写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
下一步,就是在application 中自定义了
这里我将官方的代码一气呵成,不明白看注释。
//初始化
HotFixManager hotFixManager=HotFixManager.getInstance().initialize(application,appVersion,appId, newPatchListener);
/*
application: Application上下文context
appVersion: 应用的版本号
appId: 百川上应用的唯一标识。如何获取请查询获取SDK配置信息
newPatchListener: 新patch的回调接口,若不执行任何动作,可为null
*/
//请求最新的patch
hotFixManager.queryNewHotPatch();
//注意:下面这个部分在oncreate外面
NewPatchListener mNewPatchListener = new NewPatchListener() {
@Override
public void handlePatch(int patchVersion) {
// TODO do something
Toast.makeText(MainApplication.this, "请重启应用更新补丁", Toast.LENGTH_SHORT).show();
}
};
/*如果客户端已经有一个patch包在运行,则下一个patch不会立即生效,需要重启应用生效。所以此时需要进行处理,比如提醒用户重启应用或者开发者进行后台手动杀进程重启等操作。
*/
混淆设置如下:
#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 class com.ta.utdid2.device.**{*;}
-keep class com.taobao.hotfix.HotFixManager{
public *;
}
到了这里,你已经完成了所有的集成工作。下面就要看怎么制作补丁了,以前使用andfix的同学可以滤过了。
首先,你要确定你的JDk版本,JDK版本在1.7以上才会正确使用哦。
这里,mac用户打开你的终端,WIN用户敲开你的CMD工具。OK let`s go.
关于生成PATCH补丁的问题,需要大家细心细心,因为目前的补丁生成确实是不是很方便。另外一定要保证输出路径是空的,因为有可能会删除该路径文件哦
执行的命令如下:
java -jar alisdk-hotfix-android-pack-tools.jar PATCH srcAPK fixedAPK outPatch signInfo outLog
/*srcAPK:填写本地的原始APK(有问题的APK)的本地路径,如果文件找不到会报错
fixedAPK:已经修复过该问题的APK
outPatch:输出patch的路径
signInfo:本地的签名配置属性文件,可选,不输入或者不正确则不做签名
outLog:输出日志的目录,可以不填写,默认为控制台输出
*/
这里是官方的一些解释:但是,为了你能够快速顺利的完成PATCH,请尽量完整参数,如果报错说什么参数
Exception in thread “main” java.lang.reflect.InvocationTargetException
at ···
大部分情况路径问题或者是签名文件的路径问题,比如路径多了个空格,或者左斜杠和右斜杠的问题等等,都要注意细心检查咯。另外要告诉大家,尽量不要将输出文件的地址(srcAPK fixedAPK)和输入文件的地址(outPatch )做成同一个路径进行处理,否则运行错误可能导致目录文件丢失哦。
签名配置文件为XXXXXXX.keyinfo,
store.file=yourpath
store.password=yourpassword
key.alias=yourkeyalias
key.password=yourkeypassword
工具异常说明
异常提示 说明
SRC APK FILE IS NOT FOUND
旧的APK没有找到,最大的可能是填写的路径不对
FIXED APK FILE IS NOT FOUND
修复了BUG的APK没有找到,最大可能是填写的路径不对
PATCH OUTPUT PATH IS NOT FOUND
生成PATCH的工作目录不存在
WORKING PATCH MUST BE A DIFFERENT PATH WITH APK
WORKING目录必须一个全新存在且没有文件的目录,里边放APK或者PATCH 工具会被在完成工作后清除
有问题可以留言交流哦。