Andfix使用说明

Andfix使用说明

  97人阅读  评论(0)  收藏  举报
  分类:
android(21) 

目录(?)[+]


Andfix使用说明

1 Andfix适用范围:

支持Android 2.3 到 6.0+;

支持 ARM and X86 架构指令集;

支持Dalvik and ART 运行时;

 

 

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文件。所以要将自己项目中单独引入的文件删掉。

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

 

3. 使用

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

 

PatchManager patchManager = new PatchManager(this);
String appVersion = "";
try {
    appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    patchManager.init(appVersion);
    patchManager.loadPatch();
 

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

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

c 完整的例子

String APATCH_PATH = "/Dennis.apatch";
String TAG = "PATCH";
PatchManager patchManager = new PatchManager(this);
String appVersion = "";
try {
    appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    patchManager.init(appVersion);
    patchManager.loadPatch();
    //apatch文件的目录
    String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
    Log.i(TAG, patchFileString);
    File apatchPath = new File(patchFileString);
    if (apatchPath.exists()) {
        Log.i(TAG, "补丁文件存在");
        Toast.makeText(this, "补丁文件存在", Toast.LENGTH_SHORT).show();
        try {
            //添加apatch文件
            patchManager.addPatch(patchFileString);
        } catch (IOException e) {
            Log.i(TAG, "打补丁出错了");
            e.printStackTrace();
        }
    } else {
        Log.i(TAG, "补丁文件不存在");
    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

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

4 打补丁

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

 

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

a 混淆文件中加入如下

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native ;
}
-keep class com.alipay.euler.andfix.** { *; }
b 打包后,保留apk文件,mapping文件
 
发现bug后,修改bug,打新的apk包——>
a 这个包在打包时,要依赖发布包时生成的mapping文件,即上一步中保留的mapping文件,同时在混淆文件中加入如下代码 
-applymapping mapping.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 -f NoBug.apk -t Bug.apk-o Dennis -k keystore -p 111111 -a 111111 -e 111111

每个参数含义如下

-f 新版本的apk 
-t 旧版本的apk 
-o 输出apatch文件的文件夹,可以随意命名 
-k 打包的keystore文件名 
-p keystore的密码 
-a keystore 用户别名 
-e keystore 用户别名的密码

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

5 补充

不支持YunOS

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

源文件无法替

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

 

Andfix github地址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

 

你可能感兴趣的:(Android)