Small插件化源碼分析--啟動流程

我系蒼王路媚。

這個系列的課程都是時下最熱門的開源框架的源碼分析骡和。

今次為大家?guī)淼氖荢mall的源碼分析

一個源碼代碼量這么大箍鼓,究竟從哪里開始分析才好呢崭参?

最想了解究竟是哪個github的有源碼模塊呢?

歡迎在留言區(qū)款咖,我們共同討論分享的源碼分析何暮。


歡迎瀏覽我之前的文章,有興趣可以參考一下铐殃,可以給個喜歡或者關(guān)注我的文章海洼,謝謝。

[Android]如何做一個崩潰率少于千分之三噶應(yīng)用app(9)-Small插件化

Small插件化源碼分析--啟動流程

Small插件化源碼分析--熱更流程


一.Small的啟動

1.首先了解一下Small的基本情況Small

?基本的使用方法富腊,我在我的[Android]如何做一個崩潰率少于千分之三噶應(yīng)用app(9)-Small插件化這個文件有基礎(chǔ)使用分析坏逢。

2.然后我們需要更深入了解Small的流程的話,你可以看到 github里面有提供DevSample的文件夾赘被,這才是真正源碼存在的地方是整。

你可以到Small最主要的源碼

3.首先分析一下Small的啟動流程

查看一下Application的代碼

Small.java是全部調(diào)用方法的入口,一般聲明為靜態(tài)方法民假。

setBaseUri設(shè)定基本的跳轉(zhuǎn)地址

setWebViewClient設(shè)置網(wǎng)頁的基本回調(diào)

Small.preSetup設(shè)定Small啟動的預(yù)設(shè)置

(1)registerLauncher注冊BundleLauncher到一個List里面

? ? ? ?ActivityLauncher, ApkBundleLauncher,WebBundleLauncher都繼承BundleLauncher抽象類

? ? ? ?ActivityLauncher是Activity的管理類

? ? ? ?這里需要說明一下浮入,Small依然是使用占坑的方式來事先聲明Actvity,這是很多插件化相同的做法

? ? ? ?ApkBundleLauncher是bundle加載的管理類

? ? ? ?WebBundleLauncher應(yīng)該是web頁面的管理類

? (2) ?回調(diào)用Bundle.onCreateLaunchers初始化每一個laucher

? ? ? 這里會調(diào)用ApkBundlesLauncher里面的onCreate函數(shù)

? ? ? 通過getActivityThread反射獲取ActivityThread的對象

? ? ? 反射獲取mInstumentation的屬性對象和再將自定義的InstrumentationWrapper替換掉原來的mInstumentation

? 這里會反射mCallback的對象替換成ActivityThreadHandlerCallback

? ? ? ?獲取App的provider列表

? ? ? ? 保存這些變量用于全局控制


(2)接下來是檢測是不是第一次啟動或者更新羊异,去檢測他的bundle的版本號

(3)然后獲取一些簽名的信息保存到sHostCertificates

4.Application啟動完成后LaunchActivity就是啟動頁就會開始初始化

?在onStart的聲明周期里調(diào)用Small.Setup的方法初始化舵盈,結(jié)束回調(diào)啟動Bundle里面聲明main的類

(1)她會調(diào)用Bundle里面的loaderLaunchableBundles的函數(shù)

? ? ? ? ? ? 然后啟動一個LoadBundleThread的線程加載

? ? ? ? ? ? ? ? ?然后調(diào)用setupLaunchers的函數(shù)啟動之前注冊的launcher的setup函數(shù)

(1)ActivityLauncher setUp是初始化一些已經(jīng)注冊號的Activity,加到sActivityClasses里面

(2)ApkBundleLauncher的setUp是是通過代理替換InvocationHandler球化,有看過Activity啟動的相關(guān)源碼都應(yīng)該知道是同過代理的方式封裝啟動的秽晚,這里面會通過wrapIntent的函數(shù)重新包裝intent替換成占坑的里面的Activity

通過記錄realClazz和sLoaderAcitivities里面匹配封裝intent

(3)WebBundleLauncher的setUp的方法,啟動一個新的android 本身的WebView

在Bundle.setupLaunchers的函數(shù)完成之后才會調(diào)用loadBundles

這里的getPatchManifestFile是獲取bundle.json這個文件

將bundle.json轉(zhuǎn)換成mainfestJson的String字符串

然后繼續(xù)調(diào)用loadBundles的方法

這里會繼續(xù)調(diào)用prepareForLaunch的方法

這里會繼續(xù)調(diào)用preloadBundle的方法來判斷筒愚,然后調(diào)用loadBundle方法

(1)調(diào)用ApkBundleLauncher的loadBundle方法赴蝇,會獲取bundle的包名,來初始化LoadedApk的一些信息

(2)還有AssetBundleLauncher(WebBundleLauncher繼承于它)的loadBundle

判斷是否可以轉(zhuǎn)換為可以調(diào)整的url地址

我們在Bundle.loadBundles的方法往下看,可以看到它會再分發(fā)到各個launcher在啟動加載

它會跳轉(zhuǎn)到ApkBundleLauncher作一些加載資源巢掺,dex和lib的一些操作

(1)這里可以看到它會調(diào)用ReflectAcclerator.mergeResources調(diào)用合并資源

? ? 通過addAssetPaths的方法反射把資源放到newAssetManager里面

? 然后反射資源到resource到mResourcesImpl的代理屬性里面

(2)使用ReflectAcclerator.ExpandDexPathList的方法來合并加載dex的列表

? ? ? ? 這里會通過makeDexElement來返回Elements的數(shù)組

然后通過fillDexPathList的方法來反射一些地址

然后最后通過expandArray的方法句伶,里面通過System.arraycopy的方法來寫入dex的內(nèi)容

(3)加載完resource和dex之后,會再加載lib陆淀,這里會調(diào)用ReflectAcclerator.ExpandNativeLibraryDirectoris的方法

?這里依然是反射一些lib的相關(guān)地址屬性考余,然后調(diào)用expandArray來完成加載

(4)這里還會加載Provider的內(nèi)容,直接就通過反射完成

Small的SetupProvider已經(jīng)在AndroidMainfest里面有聲明了轧苫,所以這里加載只是因為ApkBundleLaucher.onException添加的容錯處理(SetupProvider加載失敗的時候)

寫到這里楚堤,啟動的流程基本就到這里了。

下一節(jié)我這里會介紹Small的更新流程的源碼。

敬請期待I矶衅胀!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酥筝,隨后出現(xiàn)的幾起案子滚躯,更是在濱河造成了極大的恐慌,老刑警劉巖嘿歌,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掸掏,死亡現(xiàn)場離奇詭異,居然都是意外死亡宙帝,警方通過查閱死者的電腦和手機丧凤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茄唐,“玉大人,你說我怎么就攤上這事蝇更』Ρ啵” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵年扩,是天一觀的道長蚁廓。 經(jīng)常有香客問我,道長厨幻,這世上最難降的妖魔是什么相嵌? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮况脆,結(jié)果婚禮上饭宾,老公的妹妹穿的比我還像新娘。我一直安慰自己格了,他們只是感情好看铆,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盛末,像睡著了一般弹惦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悄但,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天棠隐,我揣著相機與錄音,去河邊找鬼檐嚣。 笑死助泽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播报咳,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼侠讯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暑刃?” 一聲冷哼從身側(cè)響起厢漩,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岩臣,沒想到半個月后溜嗜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡架谎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年炸宵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷扣。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡土全,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出会涎,到底是詐尸還是另有隱情裹匙,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布末秃,位于F島的核電站概页,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏练慕。R本人自食惡果不足惜惰匙,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铃将。 院中可真熱鬧项鬼,春花似錦、人聲如沸劲阎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哪工。三九已至奥此,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雁比,已是汗流浹背稚虎。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留偎捎,地道東北人蠢终。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓序攘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寻拂。 傳聞我的和親對象是個殘疾皇子程奠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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