您的位置:首页 > 其它

Andfix使用说明

2016-07-07 16:32 363 查看

Andfix使用说明

1Andfix适用范围:

支持Android2.3到6.0+;

支持ARMandX86架构指令集;

支持DalvikandART运行时;

2引入:

a在对应的项目build.gradle文件中的dependencies中加入

“compile'com.alipay.euler:andfix:0.4.0@aar'”

b由于发现远程的aar文件中可能没有引入所有类型cpu所对应的so文件,所以需要下载源码中的libs文件中的so文件,如下所示:

然后将这些so文件加入自己项目所对应的路径下,如下图所示:

然后请尝试打包,如果报错的话,根据提示,将对应重复的so文件删除。如下图所示:

该错误说明在所应用的aar(通过compile'com.alipay.euler:andfix:0.4.0@aar'引入的)文件中,已经存在了x86类型的libandfix.so文件。所以要将自己项目中单独引入的文件删掉。

cb中所述问题是因为远程引入的aar文件没有包含所有类型cpu支持的so文件引起的,如果没有对应手机所使用的so文件,应用将不能使用andfix,甚至会引起应用不能启动的问题。所以一起要把所有so文件全加入,然后在打包出错时删除多余的so文件,这样不会漏掉对所有类型cpu的支持。

3.使用

尽量早得完成patchmanager初始化的过程,推荐在applicationoncreate时,如下:

PatchManagerpatchManager=newPatchManager(this);
StringappVersion="";
try{
appVersion=getPackageManager().getPackageInfo(getPackageName(),0).versionName;
patchManager.init(appVersion);
patchManager.loadPatch();


apatchManager.init(appVersion)中的version——每次appversion变更都会导致所有补丁被删除,如果appversion没有改变,则会加载已经保存的所有补丁。

bpatchManager.loadPatch()要在addPatch之前使用。


c完整的例子

StringAPATCH_PATH="/Dennis.apatch";
StringTAG="PATCH";

PatchManagerpatchManager=newPatchManager(this);
StringappVersion="";
try{
appVersion=getPackageManager().getPackageInfo(getPackageName(),0).versionName;
patchManager.init(appVersion);
patchManager.loadPatch();
//apatch文件的目录
StringpatchFileString=Environment.getExternalStorageDirectory().getAbsolutePath()+APATCH_PATH;
Log.i(TAG,patchFileString);
FileapatchPath=newFile(patchFileString);
if(apatchPath.exists()){
Log.i(TAG,"补丁文件存在");
Toast.makeText(this,"补丁文件存在",Toast.LENGTH_SHORT).show();
try{
//添加apatch文件
patchManager.addPatch(patchFileString);
}catch(IOExceptione){
Log.i(TAG,"打补丁出错了");
e.printStackTrace();
}
}else{
Log.i(TAG,"补丁文件不存在");
}
}catch(PackageManager.NameNotFoundExceptione){
e.printStackTrace();
}

注:补丁文件的名字每次需要不用,如果名字一致,将不能再次打补丁。例子中StringAPATCH_PATH="/Dennis.apatch"写死了,只能示意。

4打补丁

当引入了andfix,想通过打补丁的方式修复bug,打包时需要遵循几点:

原始apk,或者叫发布的apk,或者叫有可能有bug的apk——>

a混淆文件中加入如下

-keepclass*extendsjava.lang.annotation.Annotation
-keepclasseswithmembernamesclass*{
native<methods>;
}
-keepclasscom.alipay.euler.andfix.**{*;}

b打包后,保留apk文件,mapping文件


发现bug后,修改bug,打新的apk包——>

a这个包在打包时,要依赖发布包时生成的mapping文件,即上一步中保留的mapping文件,同时在混淆文件中加入如下代码

-applymappingmapping.txt,其中“mapping.txt”为自己所生成的mapping文件名字。

b将本次生成的apk文件保存


生成不定文件——>

a下载补丁工具apkpatch-1.0.3.zip

b把有bug的apk,没bug的apk,还有keysotre文件放在apkpatch-1.0.3

目录下。

c运行如下命名:

./apkpatch.sh-fNoBug.apk-tBug.apk-oDennis-kkeystore-p111111-a111111-e111111

每个参数含义如下

-f新版本的apk

-t旧版本的apk

-o输出apatch文件的文件夹,可以随意命名

-k打包的keystore文件名

-pkeystore的密码

-akeystore用户别名

-ekeystore用户别名的密码

OK,打补丁成功,把生成的不定文件xx.apatch通过对应的方式,发送到已含bug的手机上即可。



5补充

不支持YunOS

无法添加新类(内部类也不行)和新的字段、新的方法

资源文件无法替换

加载过的补丁会被保存到data/packagename/files/apatch_opt目录下,所以下载过来的补丁用过一次就可以删除了。


Andfixgithub地址https://github.com/alibaba/AndFix

参考博客http://www.jianshu.com/p/479b8c7ec3e3
http://blog.csdn.net/qq_31530015/article/details/51785228

word文档地址http://download.csdn.net/detail/u012909631/9570037
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: