在Android 高階技術(shù)中蝶怔,動態(tài)化算是一個(gè)方向奶浦,而在動態(tài)化中最知名的就是插件化相關(guān)技術(shù)了。
插件化目前在國內(nèi)基本是所有大廠的標(biāo)配踢星,學(xué)習(xí)性價(jià)比非常高澳叉,但很多人沒有真正地動手去實(shí)踐過,根本不了解其中有多少問題斩狱,會牽涉到多少技術(shù)細(xì)節(jié)耳高,那么我們?nèi)绾握莆詹寮@門高階技術(shù)呢?
首先就要對于Framework有著比較深的了解所踊,因?yàn)椴寮歇?dú)立的業(yè)務(wù),包含獨(dú)立頁面與功能概荷,那么這些 Activity(頁面) 并未在宿主中注冊秕岛,怎么能夠啟動呢?
要想能夠繞過系統(tǒng)的限制误证,來啟動「不存在的」Activity继薛,首先你要對系統(tǒng)的檢測機(jī)制極為熟悉,只有知道的防御方式才能創(chuàng)造攻擊技巧一擊破之愈捅,所以你需要對 Activity的整體啟動流程極為熟悉遏考。
其次你還需要清楚類加載機(jī)制:
- 插件中如何訪問宿主中的類呢?
- 宿主如何訪問插件中的類呢蓝谨?
- 插件與插件中的類要不要支持支持訪問呢灌具?
這些問題都需要你對類的雙親委派機(jī)制極其熟悉,然后巧妙的自定義修改流程實(shí)現(xiàn)譬巫。
最后咖楣,就是資源了:
- 是否要支持資源訪問宿主呢?如果插件使用了宿主的資源id芦昔,宿主編譯過程中資源id發(fā)生變化怎么辦呢诱贿?
- 如何保證插件的資源和宿主的資源id不沖突呢?
- 系統(tǒng)是如何加載資源的咕缎?啟動階段如何合并插件與宿主資源呢珠十?
這些要求你對系統(tǒng)如何加載資源,aapt對資源的處理都要有一定的了解凭豪。
到這里焙蹭,我們已經(jīng)具備了了解一個(gè)插件化框架的基礎(chǔ)知識了。
以360 RePlugin為例墅诡,我們可以帶著問題去剖析它
看看 Replugin 對于組件是如何支持的壳嚎?對于資源是如何支持的桐智?對于插件與宿主的通信是如何支持的?
去拆解它的每個(gè)能力烟馅,結(jié)合自己前面的認(rèn)知说庭,驗(yàn)證自己的理解,這個(gè)階段還能發(fā)現(xiàn)很多的技術(shù)技巧郑趁。
當(dāng)我們拆解完一個(gè)插件化的框架時(shí)刊驴,就已經(jīng)可以說對插件化的原理基本掌握了。
然后我們就可以直接上手實(shí)踐寡润,因?yàn)閷?shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)捆憎,很多時(shí)候我們苦背原理,面試過程中一被問到:
- 了解過插件化開發(fā)嗎梭纹?
- 能說說插件化開發(fā)的幾種實(shí)現(xiàn)思路嘛躲惰?
- 插件化開發(fā)中插件的Activity有幾種啟動方法?
- 插件化開發(fā)中插件之間如何進(jìn)行組件通信变抽?
- 插件的混淆如何解決础拨?
- 插件化開發(fā)的資源沖突問題會存在嗎?如何解決绍载?
- 在項(xiàng)目中一個(gè)已有模塊诡宗,你是如何收斂成為插件的呢?需要做哪些準(zhǔn)備呢击儡?
諸如此類的層層深挖塔沃,一下子就慌了,所以我們需要手動去實(shí)踐插件化的打包阳谍、下發(fā)(扔到 sdcard加載)蛀柴,去通過具體的實(shí)踐感受整個(gè)流程,加深對原理的理解边坤。
直到可以拋開別人的代碼名扛,借助Framework源碼,自己去實(shí)現(xiàn)插件化的核心邏輯:
從自己啟動一個(gè)不存在的 Activity 開始茧痒,到對所有核心功能的模擬肮韧,這個(gè)階段相信讓你對原理有進(jìn)一步的認(rèn)知,你需要了解到各個(gè)版本系統(tǒng)源碼的差異旺订,如何繞過 hidden api的限制等等弄企。