安卓熱修復(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)系作者
  • 序言:七十年代末节视,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子假栓,更是在濱河造成了極大的恐慌寻行,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾荆,死亡現(xiàn)場離奇詭異拌蜘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棋凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拦坠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剩岳,你說我怎么就攤上這事贞滨。” “怎么了拍棕?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵晓铆,是天一觀的道長。 經(jīng)常有香客問我绰播,道長骄噪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任蠢箩,我火速辦了婚禮链蕊,結(jié)果婚禮上事甜,老公的妹妹穿的比我還像新娘。我一直安慰自己滔韵,他們只是感情好逻谦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陪蜻,像睡著了一般邦马。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宴卖,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天滋将,我揣著相機(jī)與錄音,去河邊找鬼症昏。 笑死随闽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的齿兔。 我是一名探鬼主播橱脸,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼础米,長吁一口氣:“原來是場噩夢啊……” “哼分苇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屁桑,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤医寿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蘑斧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靖秩,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年竖瘾,在試婚紗的時候發(fā)現(xiàn)自己被綠了沟突。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡捕传,死狀恐怖惠拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庸论,我是刑警寧澤职辅,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站聂示,受9級特大地震影響域携,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鱼喉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一秀鞭、第九天 我趴在偏房一處隱蔽的房頂上張望趋观。 院中可真熱鬧,春花似錦锋边、人聲如沸拆内。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽麸恍。三九已至,卻和暖如春搀矫,著一層夾襖步出監(jiān)牢的瞬間抹沪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工瓤球, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留融欧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓卦羡,卻偏偏與公主長得像噪馏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绿饵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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

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