安卓熱修復(fù)-multidex的使用

當(dāng)程序出現(xiàn)一些小Bug需要緊急修復(fù)的時候,又不希望用戶感知,可以使用熱修復(fù)的方式快速修復(fù)Bug。

原理:實(shí)現(xiàn)多分包,將修復(fù)Bug的dex包放到加載路徑的最前面。

在eclipse的安卓編譯使用的ant構(gòu)建配置文件,文件位置:

android-sdk\tools\ant\build.xml

在eclipse中實(shí)現(xiàn)多分包的方式,可以使用自定義ant構(gòu)建的配置文件。

本文的重點(diǎn)使用android-studio實(shí)現(xiàn)熱修復(fù):

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);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,353評論 25 708
  • 今天接女兒回家的路上,女兒跟我說 語文作業(yè)做完了。 我還夸她做得好。 回家后女兒開始寫數(shù)學(xué)作業(yè),我給她檢...
    金慧恩媽媽閱讀 183評論 0 1
  • 幸福路人春風(fēng)20170915第104天 不要去刻意討好所有人,一是根本做不到,二是顯得太假。有人愛你便有人恨你,標(biāo)...
    春風(fēng)7861閱讀 105評論 0 0
  • 上一章 “靈瞳·第四段·第二層·開!”杰明說著打開了門。可是門里什么都沒有。 “不要裝了,”杰明叫了一聲。“幻,現(xiàn)...
    安納森閱讀 200評論 0 5
  • 七絕 冬日陽光 暖暖冬陽沐帽檐,輕柔猶似玉風(fēng)拈。 閑庭信步溫馨度,相伴依人楚楚纖。 ~老財(cái)神 2017年10...
    老財(cái)神閱讀 662評論 1 2