亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

詳解Android中實現熱更新的原理

2020-04-11 11:00:46
字體:
來源:轉載
供稿:網友

這篇文章就來介紹一下Android中實現熱更新的原理。

一、ClassLoader
我們知道Java在運行時加載對應的類是通過ClassLoader來實現的,ClassLoader本身是一個抽象來,Android中使用PathClassLoader類作為Android的默認的類加載器,PathClassLoader其實實現的就是簡單的從文件系統中加載類文件。PathClassLoade本身繼承自BaseDexClassLoader,BaseDexClassLoader重寫了findClass方法,該方法是ClassLoader的核心。

@Overrideprotected Class> findClass(String name) throws ClassNotFoundException {  List suppressedExceptions = new ArrayList();  Class c = pathList.findClass(name, suppressedExceptions);  if (c == null) {    ClassNotFoundException cnfe = new ClassNotFoundException("Didn't find class /"" + name + "/" on path: " + pathList);    for (Throwable t : suppressedExceptions) {      cnfe.addSuppressed(t);    }    throw cnfe;  }  return c;}

看源碼可知,BaseDexClassLoader將findClass方法委托給了pathList對象的findClass方法,pathList對象是在BaseDexClassLoader的構造函數中new出來的,它的類型是DexPathList??聪翫exPathList.findClass源碼是如何做的:

public Class findClass(String name, List suppressed) {  for (Element element : dexElements) {    DexFile dex = element.dexFile;    if (dex != null) {      Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);      if (clazz != null) {        return clazz;      }    }  }  if (dexElementsSuppressedExceptions != null) {    suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));  }  return null;}

直接就是遍歷dexElements列表,然后通過調用element.dexFile對象上的loadClassBinaryName方法來加載類,如果返回值不是null,就表示加載類成功,會將這個Class對象返回。而dexElements對象是在DexPathList類的構造函數中完成初始化的。

this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions);
makeDexElements所做的事情就是遍歷我們傳遞來的dexPath,然后一次加載每個dex文件。

二、實現
上面分析了Android中的類的加載的流程,可以看出來DexPathList對象中的dexElements列表是類加載的一個核心,一個類如果能被成功加載,那么它的dex一定會出現在dexElements所對應的dex文件中,并且dexElements中出現的順序也很重要,在dexElements前面出現的dex會被優先加載,一旦Class被加載成功,就會立即返回,也就是說,我們的如果想做hotpatch,一定要保證我們的hotpacth dex文件出現在dexElements列表的前面。

要實現熱更新,就需要我們在運行時去更改PathClassLoader.pathList.dexElements,由于這些屬性都是private的,因此需要通過反射來修改。另外,構造我們自己的dex文件所對應的dexElements數組的時候,我們也可以采取一個比較取巧的方式,就是通過構造一個DexClassLoader對象來加載我們的dex文件,并且調用一次dexClassLoader.loadClass(dummyClassName);

方法,這樣,dexClassLoader.pathList.dexElements中,就會包含我們的dex,通過把dexClassLoader.pathList.dexElements插入到系統默認的classLoader.pathList.dexElements列表前面,就可以讓系統優先加載我們的dex中的類,從而可以實現熱更新了。

下面展示一部分代碼

private static synchronized Boolean injectAboveEqualApiLevel14(      String dexPath, String defaultDexOptPath, String nativeLibPath, String dummyClassName) {  Log.i(TAG, "--> injectAboveEqualApiLevel14");  PathClassLoader pathClassLoader = (PathClassLoader) DexInjector.class.getClassLoader();  DexClassLoader dexClassLoader = new DexClassLoader(dexPath, defaultDexOptPath, nativeLibPath, pathClassLoader);  try {    dexClassLoader.loadClass(dummyClassName);    Object dexElements = combineArray(        getDexElements(getPathList(pathClassLoader)),        getDexElements(getPathList(dexClassLoader)));    Object pathList = getPathList(pathClassLoader);    setField(pathList, pathList.getClass(), "dexElements", dexElements);  } catch (Throwable e) {    e.printStackTrace();    return false;  }  Log.i(TAG, "

Android中實現熱更新的原理先為大家介紹到這,大家可以結合平時積累的知識,查閱相關書籍進行深入學習探究,希望大家能夠有所收獲。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品有码在线观看| 九九精品在线视频| 国产精品普通话| 91麻豆国产精品| 欧美另类极品videosbest最新版本| 91香蕉嫩草神马影院在线观看| 成人免费福利视频| 精品久久久久久久久久久久久| 欧美日韩国产第一页| 富二代精品短视频| 国产精品色午夜在线观看| 国产视频久久久久久久| 激情懂色av一区av二区av| 国产丝袜视频一区| 欧美在线一区二区三区四| 38少妇精品导航| 1769国内精品视频在线播放| 亚洲视频欧美视频| 亚洲激情在线观看| 欧美乱妇高清无乱码| xvideos亚洲人网站| 国产成人精品日本亚洲专区61| 在线亚洲午夜片av大片| 亚洲欧美日韩爽爽影院| 亚洲天堂av在线免费观看| 国产在线观看精品一区二区三区| 北条麻妃一区二区三区中文字幕| 国产成人啪精品视频免费网| 疯狂做受xxxx欧美肥白少妇| 91av视频在线播放| 亚洲va电影大全| 26uuu久久噜噜噜噜| 国产成人+综合亚洲+天堂| 日韩美女免费线视频| 欧美性极品xxxx做受| 久久综合九色九九| 久久精品亚洲94久久精品| 一区二区国产精品视频| 美女性感视频久久久| 色哟哟入口国产精品| 欧美日韩一区二区免费在线观看| 日韩av网站电影| 欧美日韩亚洲高清| 国产成+人+综合+亚洲欧洲| 精品国产1区2区| 青青青国产精品一区二区| 国产精品美女www爽爽爽视频| 日韩在线观看免费网站| 久久国产精品影视| 国产脚交av在线一区二区| 亚洲成人黄色在线观看| 国产日韩在线观看av| 国产精品va在线播放我和闺蜜| 欧美另类暴力丝袜| 最近2019年中文视频免费在线观看| 久久夜色精品国产欧美乱| 久久精品视频免费播放| 久久久精品视频在线观看| 欧美三级免费观看| 视频在线观看99| 国产精品久久久久影院日本| 欧美最近摘花xxxx摘花| 国产精品国产自产拍高清av水多| 日本不卡视频在线播放| 国产香蕉精品视频一区二区三区| 成人女保姆的销魂服务| 成人国产亚洲精品a区天堂华泰| 精品视频在线播放色网色视频| 国模精品系列视频| 国产专区欧美专区| 日本一本a高清免费不卡| 日韩风俗一区 二区| 色综合天天狠天天透天天伊人| 国产成+人+综合+亚洲欧洲| 一本色道久久综合狠狠躁篇怎么玩| 国产精品大陆在线观看| 亚洲三级 欧美三级| 亚洲精品美女视频| 欧美在线一级视频| 日本久久久久久| 亚洲a成v人在线观看| 日韩精品极品毛片系列视频| 这里只有精品久久| 精品少妇一区二区30p| 欧美最顶级的aⅴ艳星| 欧美日韩国内自拍| 欧美激情极品视频| 国产精品久久久久久久一区探花| 日韩欧美精品在线观看| 国产成人亚洲综合青青| 亚洲欧美日韩天堂| 亚洲精品日韩久久久| 中文字幕亚洲色图| 亚洲欧美第一页| 国产欧美日韩高清| 国产精品美女免费视频| 日本精品一区二区三区在线| 69久久夜色精品国产7777| 亚洲综合视频1区| 黑人巨大精品欧美一区二区免费| 色综合久久久久久中文网| 欧美日韩国产va另类| 成人写真视频福利网| 国产一区二区丝袜高跟鞋图片| 日韩欧美999| 欧美亚洲成人精品| 亚洲一区二区在线播放| 国产欧美一区二区三区久久| 亚洲肉体裸体xxxx137| 精品无人区太爽高潮在线播放| 日本久久久a级免费| 粗暴蹂躏中文一区二区三区| 久久久天堂国产精品女人| 日韩毛片在线看| 91超碰caoporn97人人| 国产亚洲精品久久久久久牛牛| 97国产精品人人爽人人做| 欧美午夜www高清视频| 欧美黑人狂野猛交老妇| 欧美日韩在线另类| 欧美精品18videos性欧| 日本午夜在线亚洲.国产| 国产精品99久久久久久久久久久久| 欧美专区第一页| 成人有码在线视频| 成人黄色在线免费| 在线播放国产一区中文字幕剧情欧美| 亚洲精品国产精品久久清纯直播| 国内精品久久久| 欧美激情亚洲一区| 亚洲国产欧美一区| 一区二区三区国产在线观看| 日韩av网址在线| 国外成人在线直播| 欧美日韩精品在线| 91社影院在线观看| 黑人巨大精品欧美一区二区三区| 久久九九精品99国产精品| 国产成人啪精品视频免费网| 久久久久久久久久久成人| 欧美精品久久久久久久免费观看| 日韩在线观看高清| 国产精品夫妻激情| 欧美片一区二区三区| 91国产视频在线| 欧美性少妇18aaaa视频| 操人视频在线观看欧美| 久久久久久亚洲精品| 国产精品免费久久久久影院| 欧美成人午夜激情视频| 日韩av在线免费播放| 日韩av免费网站| 欧美日韩国产一区二区| 中文字幕av一区二区三区谷原希美| 97精品伊人久久久大香线蕉| 亚洲理论电影网| 欧美激情亚洲国产| 国模精品视频一区二区三区| 98精品国产高清在线xxxx天堂| 国产精品中文字幕在线| 日本欧美一级片| 国产成人91久久精品| 久久精品国产成人精品| 国产亚洲欧美另类中文|