前言
動態(tài)加載系列文章
Android 動態(tài)加載(一) - 基礎(chǔ)篇(一)
Android 動態(tài)加載(二) - 基礎(chǔ)篇(二)
Android 動態(tài)加載(三) - 類的加載流程源碼分析
Android 動態(tài)加載(四) - 簡單demo實(shí)現(xiàn)
Android 動態(tài)加載(五) - 借尸還魂之代理Activity模式
Android 動態(tài)加載(六) - 360開源框架DroidPlugin的使用介紹
1. 概述
基于上節(jié)課我們分析的Activity的啟動流程后,那么這節(jié)課我們就來分析下類的加載流程,流程圖如下:
2. 分析
舉個(gè)例子:比如從MainActivity跳轉(zhuǎn)到TestActivity拾枣,那么就針對于這樣一個(gè)具體的場景亭珍,就來分析下這個(gè)找類的過程挎挖,即就是類的加載流程:
繼承關(guān)系:PathClassLoader --> BaseDexClassLoader --> ClassLoader
1>: 首先會找 PathClassLoader绑雄,然后找BaseDexClassLoader唧取,然后找ClassLoader铅鲤;
2>: 然后在 ClassLoader中有一個(gè) findClass()方法,但是子類 BaseDexClassLoader覆蓋了父類的 findClass()方法枫弟,所以就調(diào)用的是 子類 BaseDexClassLoader的findClass()方法邢享;
3>: 子類的 BaseDexClassLoader中的findClass()方法如下:
發(fā)現(xiàn)里邊調(diào)用的是 pathList.findClass()方法,這個(gè)pathList就是 DexPathList類淡诗;
4>: 然后調(diào)用 DexPathList類中的 findClass()骇塘,方法如下:
分析上圖findClass()方法可知:
DexPathList中的 findClass()方法其實(shí)是 使用for循環(huán)遍歷 dexElements數(shù)組伊履,如果找到了 class就返回class給 第一步的 PathClassLoader,然后PathClassLoader獲取到這個(gè)class通過反射創(chuàng)建對象款违,即就是 (Activity)cl.loadClass(className).newInstance()唐瀑;
以上就是 類的加載流程,根據(jù)這個(gè)流程我們可以來實(shí)現(xiàn)我們自己的一套熱修復(fù)功能奠货,那么下節(jié)課我們就來看下 如何通過這個(gè)流程來實(shí)現(xiàn)我們的熱修復(fù)介褥。