阿里 AndFix 热修复框架简介

阿里AndFix热修复框架简介

热修复原理:

Android的类加载机制

Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexClassLoader

PathClassLoader代码位于libcore\dalvik\src\main\Java\dalvik\system\PathClassLoader.java 
DexClassLoader代码位于libcore\dalvik\src\main\java\dalvik\system\DexClassLoader.java 
BaseDexClassLoader代码位于libcore\dalvik\src\main\java\dalvik\system\BaseDexClassLoader.java

PathClassLoader: 用来加载系统类和应用类

DexClassLoader :  用来加载jar、apk、dex文件.加载jar、apk也是最终抽取里面的Dex文件进行加载

看下PathClassLoader代码

  1. public class PathClassLoader extends BaseDexClassLoader {
  2. public PathClassLoader(String dexPath, ClassLoader parent) {
  3. super(dexPath, null, null, parent);
  4. }
  5. public PathClassLoader(String dexPath, String libraryPath,
  6. ClassLoader parent) {
  7. super(dexPath, null, libraryPath, parent);
  8. }
  9. }

DexClassLoader代码

  1. public class DexClassLoader extends BaseDexClassLoader {
  2. public DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent) {
  3. super(dexPath, new File(optimizedDirectory), libraryPath, parent);
  4. }
  5. }

两个ClassLoader就两三行代码,只是调用了父类的构造函数.

  1. public class BaseDexClassLoader extends ClassLoader {
  2. private final DexPathList pathList;
  3. public BaseDexClassLoader(String dexPath, File optimizedDirectory,
  4. String libraryPath, ClassLoader parent) {
  5. super(parent);
  6. this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
  7. }
  8. @Override
  9. protected Class<?> findClass(String name) throws ClassNotFoundException {
  10. List<Throwable> suppressedExceptions = new ArrayList<Throwable>();
  11. Class c = pathList.findClass(name, suppressedExceptions);
  12. if (c == null) {
  13. ClassNotFoundException cnfe = new ClassNotFoundException("Didn‘t find class \"" + name + "\" on path: " + pathList);
  14. for (Throwable t : suppressedExceptions) {
  15. cnfe.addSuppressed(t);
  16. }
  17. throw cnfe;
  18. }
  19. return c;
  20. }

在BaseDexClassLoader 构造函数中创建一个DexPathList类的实例,这个DexPathList的构造函数会创建一个dexElements 数组

  1. public DexPathList(ClassLoader definingContext, String dexPath, String libraryPath, File optimizedDirectory) {
  2. ...
  3. this.definingContext = definingContext;
  4. ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>();
  5. //创建一个数组
  6. this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions);
  7. ...
  8. }

然后BaseDexClassLoader 重写了findClass方法,调用了pathList.findClass,跳到DexPathList类中.

  1. /* package */final class DexPathList {
  2. ...
  3. public Class findClass(String name, List<Throwable> suppressed) {
  4. //遍历该数组
  5. for (Element element : dexElements) {
  6. //初始化DexFile
  7. DexFile dex = element.dexFile;
  8. if (dex != null) {
  9. //调用DexFile类的loadClassBinaryName方法返回Class实例
  10. Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);
  11. if (clazz != null) {
  12. return clazz;
  13. }
  14. }
  15. }
  16. return null;
  17. }
  18. ...
  19. }

会遍历这个数组,然后初始化DexFile,如果DexFile不为空那么调用DexFile类的loadClassBinaryName方法返回Class实例.

归纳上面的话就是:ClassLoader会遍历这个数组,然后加载这个数组中的dex文件. 
而ClassLoader在加载到正确的类之后,就不会再去加载有Bug的那个类了,我们把这个正确的类放在Dex文件中,让这个Dex文件排在dexElements数组前面即可.


热修复框架AndFix的使用

AndFix:阿里开源的热修复框架AndFix,AndFix是 “Android Hot-Fix”的缩写。它支持Android 2.3到6.0版本,并且支持arm与X86系统架构的设备。完美支持Dalvik与ART的Runtime。AndFix 的补丁文件是以 .apatch 结尾的文件。

我这是用eclipse写的Demo.

1.把AndFix抽取成library依赖的形式

2.新建一个AndFixDemo项目,依赖AndFix这个library

2.1 新建一个MyApplication继承Application

public class MyApplication extends Application {

    private static final String TAG = "MyApplication";

    /**
     * apatch文件
     */
    private static final String APATCH_PATH = "/Dennis.apatch";

    private PatchManager mPatchManager;

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化
        mPatchManager = new PatchManager(this);
        mPatchManager.init("1.0"); // 版本号

        // 加载 apatch
        mPatchManager.loadPatch();

        //apatch文件的目录
        String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
        File apatchPath = new File(patchFileString);

        if (apatchPath.exists()) {
            Log.i(TAG, "补丁文件存在");
            try {
                //添加apatch文件
                mPatchManager.addPatch(patchFileString);
            } catch (IOException e) {
                Log.i(TAG, "打补丁出错了");
                e.printStackTrace();
            }
        } else {
            Log.i(TAG, "补丁文件不存在");
        }

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

实际当中肯定是通过网络接口下载apatch文件,我这里为了方便演示就放在了SD卡根目录

2.2

在MainActivity用一个按钮弹出吐司,上面是有Bug的代码,下面是修正后的代码

分别打包成Bug.apk和NoBug.apk

2.3 . 然后要用到一个生成补丁的工具apkpatch

_MACOSX是给OSX系统用的 
.bat是给window系统用的

我用得是.bat

把之前生成的Bug.apk和NoBug.apk,还有打包所使用的keystore文件放到apkpatch-1.0.3目录下 
打开cmd,进入到apkpatch-1.0.3目录下,输入如下指令

apkpatch.bat -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 用户别名的密码

如果出现add modified …….就表示成功了,去apkpatch-1.0.3目录看下,新增了Dennis目录

我把这个文件改为Dennis.apatch

2.4

手机装上Bug.apk运行起来

然后把Dennis.apatch 放到SD卡根目录,退出app,再进入,按下按钮

最后附上Demo还有apk和apatch 文件

null

时间: 2024-10-18 16:16:41

阿里 AndFix 热修复框架简介的相关文章

阿里SopHix热修复框架

2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker(Bugly sdk也集成Tikner热更新)和阿里最新出品Sophix.它们在原理各有不同,适用场景各异.不过从技术上来说多数热修复框架是基于ClassLoader加载机制.下面是常见热修复框架的比较. 开通热修复服务 读者可以打开Sophix热修复的官网:Sophix官网1.注册阿里云账号,选择移动热修复服务 ,选择之后需要开通此功

Android热修复框架AndFix原理解析及使用

一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分析.正好项目中要使用到.首先这个框架是开源的:https://github.com/alibaba/AndFix 其实在最早的时候我已经分析了阿里的另外一个热修复框架:Dexposed框架,还不了解的同学可以点击这里查看:Dexposed框架原理解析以及使用 当时介绍这个框架的时候发现他的实现原理很

探索安卓热修复框架AndFix的奥秘

虽然阿里的AndFix框架已经出来很长时间了,但是还不了解它的同学依然挺多,接下来就跟着我一起来到AndFix的世界里一起看看,如何达到不用重新安装app就可以修复bug. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app

十分钟教会你使用安卓热修复框架AndFix

腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix.接下来,我会从它的概念.原理.使用方法等为你详细介绍. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app的

走进热修复框架AndFix的世界

关于阿里的开源热修复框架AndFix引起了广泛共鸣,受到了很多人的青睐.那今天就跟随我的步伐来详细了解一下AndFix的详细信息和使用方法. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app的一种解决方案.2.AndFix

热修复框架Tinker的从0到集成之路

热修复框架Tinker的从0到集成之路 转载请标明出处: http://blog.csdn.net/lisdye2/article/details/54411727 本文出自:[Alex_MaHao的博客] 项目中的源码已经共享到github,有需要者请移步[Alex_MaHao的github] 2015年10月,QQ空间提出了热修复方案,一时间热修复风靡Android界,阿里的AndFix,360的插件形式,开源的NUWA等,都分别提出了自己的热修复实现方案,2016年微信推出了自己的热修复框

Andfix热修复框架原理及源码解析-上篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源码解析-上篇 Andfix热修复框架原理及源码解析-下篇 1.不知道如何使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架.通过使用Andfix,其实我们心中会有一个大概的轮廓,它的工作原理,大概就是,所谓的补丁文件,就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异.然后让我们的旧包运行的时候,就加载它,把以前的一些信息替换掉.我们现在就抱着这个大方向去深入源码探个究竟!!首先

Andfix热修复框架原理及源代码解析-上篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源代码解析-上篇 Andfix热修复框架原理及源代码解析-下篇 1.不知道怎样使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架.通过使用Andfix,事实上我们心中会有一个大概的轮廓,它的工作原理,大概就是.所谓的补丁文件.就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异. 然后让我们的旧包执行的时候.就载入它,把曾经的一些信息替换掉. 我们如今就抱着这个慷慨向去深入源代码探个

Andfix热修复原理

一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分析.正好项目中要使用到.首先这个框架是开源的:https://github.com/alibaba/AndFix 其实在最早的时候我已经分析了阿里的另外一个热修复框架:Dexposed框架,还不了解的同学可以点击这里查看:Dexposed框架原理解析以及使用 当时介绍这个框架的时候发现他的实现原理很