Android热修复

来源:互联网 发布:app开发用什么软件 编辑:程序博客网 时间:2024/04/30 11:51

AndFix

Github:https://github.com/alibaba/AndFix


Android上集成:

1.AndroidManifest中添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

2.把Java层的代码引入到你的工程,配置Ndk开发环境并把jni Native代码添加进来(见附件或gitHub自行下载)。

eclipse:

 将lib包(AndFix-master)添加到自己的工程

android studio:
maven dependency:
<dependency>
<groupId>com.alipay.euler</groupId>
<artifactId>andfix</artifactId>
<version>0.3.1</version>
<type>aar</type>
</dependency>

or gradle dependency:
dependencies {
compile 'com.alipay,euler:andfix:0.3.1@aar'
}


3.建议在自定义Application中初始化,为了更早的修复应用中的bug。

public void onCreate() {
super.onCreate();
// 初始化patch管理类
mPatchManager = new PatchManager(this);
// 初始化patch版本
try {
//注意每次appversion变更都会导致data/packagename/files/apatch_opt目录下所有补丁被删除(注1)
//如果appversion没有改变,则会加载data/packagename/files/apatch_opt目录下已有的所有补丁。
mPatchManager.init(getPackageManager().getPackageInfo(getPackageName(), 0).versionName);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
// 加载已经添加到PatchManager中的patch
mPatchManager.loadPatch();
}

4.如果有新的补丁需要修复,下载完成后,进行以下操作

   String patchFileString = saveFile.getAbsolutePath();
try {
//指定补丁路径,补丁会立即生效
mPatchManager.addPatch(patchFileString);
} catch (IOException e) {
e.printStackTrace();
}


注1:这个patchFileString路径表示的.aptch文件在被加载过一次后会被AndFix框架复制到data/packagename/files/apatch_opt目录下,所以sdcard中的补丁用过一次就可删除(也可不删,无影响,框架已做判断,同一个补丁只复制一次)。

注2:如果本地保存了多个补丁,那么AndFix会按照补丁生成的时间顺序加载补丁,具体是根据.apatch文件中的PATCH.MF的字段Created-Time,并且每个补丁的名字不可相同,因为补丁文件在文件名字相同的情况下,框架会直接去加载data/packagename/files/apatch_opt这个目录下的文件,所以不同的补丁一定要使用不同的名字

5.当你的apk需要做一个版本升级时,需要把之前patch文件的删除,需要进行以下操作

    //删除所有已加载的apatch文件
mPatchManager.removeAllPatch()

6.代码混淆

    -keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}
-keep class com.alipay.euler.andfix.** { *; }


patch文件的生成

使用工具:apkpatch-1.0.3 (附件解压后的tools目录中)

 
原理:根据两个apk包,生成一个差异文件,就是所谓的补丁文件即.apatch文件(由移动开发人员生成提供给后端用以下载)。

命令:apkpatch.bat -f new.apk -t old.apk -o output1 -k debug.keystore -p android -a androiddebugkey -e android
-f <new.apk> :新版本
   -t <old.apk> : 旧版本
   -o <output> : 输出目录
   -k <keystore>: 打包所用的keystore
   -p <password>: keystore的密码
   -a <alias>: keystore 用户别名
   -e <alias password>: keystore 用户别名密码


客户端请求服务器接口(api),服务器根据用户传递的数据分析是否有需要修复的bug。 
如果有bug需要修复,就下载服务器指定的.apatch文件的链接,下载完后及时加载并修复,使用addpatch(path)方法,补丁会立即生效。


注意:AndFix是无法添加类和字段的,其中部分手机(部分小米,华为)不能实现热更新


参考:http://blog.csdn.net/qxs965266509/article/details/49802429


我的demo中补丁不能立即生效,必须要app重启才可以生效,不知道为什么,本人比较懒,没有着手解决这个问题,有知道的朋友说一身哈!


0 0
原创粉丝点击