美文网首页
安卓热修复-multidex的使用

安卓热修复-multidex的使用

作者: czins | 来源:发表于2017-02-20 02:21 被阅读72次

当程序出现一些小Bug需要紧急修复的时候,又不希望用户感知,可以使用热修复的方式快速修复Bug。

原理:实现多分包,将修复Bug的dex包放到加载路径的最前面。

在eclipse的安卓编译使用的ant构建配置文件,文件位置:

android-sdk\tools\ant\build.xml

在eclipse中实现多分包的方式,可以使用自定义ant构建的配置文件。

本文的重点使用android-studio实现热修复:

android classloader浅析

android multidex的使用

直接上代码:

public class DexPatcher {

    public static final String PATCH_DEX_PATH = "patch_dex";

    public static final String PATCH_DEX = "patch.dex";

    public static final String DEX_FILE_EXTENSION = ".dex";

    private static final String DEX_ELEMENTS = "dexElements";

    private static final String PATH_LIST = "pathList";

    private static final String PATH_LIST_CLASS = "dalvik.system.DexPathList";

    private static final String OPTIMIZED_PATH = "optimized";

    private static final String BASE_DEX_CLASSLOADER_CLASS = "dalvik.system.BaseDexClassLoader";

    public static void patch(Context context) {
        try {
            File patchDexDir = context.getDir(PATCH_DEX_PATH, Context.MODE_PRIVATE);
            File optimizedFile = new File(patchDexDir, OPTIMIZED_PATH);
            if (!optimizedFile.exists()) {
                optimizedFile.mkdirs();
            }
            for (File file : patchDexDir.listFiles()) {
                if (file.getName().endsWith(DEX_FILE_EXTENSION)) {
                    DexClassLoader dexClassLoader = new DexClassLoader(file.getAbsolutePath(), optimizedFile.getAbsolutePath(), null, context.getClassLoader());
                    Object primaryElements = getDexElements(context.getClassLoader());
                    Object dexElements = getDexElements(dexClassLoader);
                    Object combineElements = combineDexElements(primaryElements, dexElements);
                    setFieldValue(getPathList(context.getClassLoader()), DEX_ELEMENTS, combineElements);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static Object combineDexElements(Object primaryElements, Object dexElements) {
        Class<?> cls = primaryElements.getClass().getComponentType();
        int ll = Array.getLength(dexElements);
        int tl = ll + Array.getLength(primaryElements);
        Object combineElements = Array.newInstance(cls, tl);
        for (int i = 0; i < tl; i++) {
            if (i < ll) {
                Array.set(combineElements, i, Array.get(dexElements, i));
            } else {
                Array.set(combineElements, i, Array.get(primaryElements, i - ll));
            }
        }
        return combineElements;
    }

    private static Object getDexElements(Object clsLoader) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        return getFieldValue(getPathList(clsLoader), Class.forName(PATH_LIST_CLASS), DEX_ELEMENTS);
    }

    private static Object getPathList(Object clsLoader) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        return getFieldValue(clsLoader, Class.forName(BASE_DEX_CLASSLOADER_CLASS), PATH_LIST);
    }

    private static Object getFieldValue(Object object, Class<?> cls, String fieldName) throws NoSuchFieldException, IllegalAccessException {
        Field field = cls.getDeclaredField(fieldName);
        field.setAccessible(true);
        return field.get(object);
    }

    private static void setFieldValue(Object object, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Field field = object.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(object, value);
    }
}

相关文章

  • 安卓热修复-multidex的使用

    当程序出现一些小Bug需要紧急修复的时候,又不希望用户感知,可以使用热修复的方式快速修复Bug。 原理:实现多分包...

  • 热修复实现原理(一)

    热修复实现原理——MultiDex 一、 MultiDex 1、MultiDex 产生背景 当Android系统安...

  • 热修复笔记

    Android热修复技术原理详解(最新最全版本) Android 热修复 -- 实现原理 (QQ空间)安卓App热...

  • 热修复

    业界首部安卓热修复宝典出炉,阿里技术大牛联袂推荐 下载地址: 深入理解Android热修复技术原理

  • 安卓类加载机制

    热修复、插件化很多技术都是基于安卓类加载机制实现,所以对安卓类加载机制了解很有必要

  • 阿里云移动热修复初窥(1013)

    写在前面 关于安卓热修复技术选型可以参考这篇文章,这里主要记录阿里移动热修复的接入流程。 开始接入 移动热修复现有...

  • 安卓多分包-multidex的使用

    当每个dex包超过65535个方法的时候,程序在运行时会报:NoClassDefFoundError 1 在bui...

  • NDK--andfix热修复之art虚拟机

    在so插件化原理,hook技术实现andfix热修复中,只实现了dalvik虚拟机中的热修复,安卓5.0后,谷歌彻...

  • 安卓代码修复框架Patch(1)

    安卓代码修复框架Patch 只支持程序重启修复,不支持热修复 代码原理 1.主要通过反正把原来dexElement...

  • 腾讯面试热修复连环炮:热修复是什么?有接触过tinker吗?ti

    热修复是什么 答:热修复无疑是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bu...

网友评论

      本文标题:安卓热修复-multidex的使用

      本文链接:https://www.haomeiwen.com/subject/nfymuttx.html