插件化學(xué)習(xí)概要

Android插件化:從入門到放棄

知乎DroidPlugin
weishu_DroidPlugin
第一種是動(dòng)態(tài)替換,也就是Hook。可以在不同層次進(jìn)行Hook,從而動(dòng)態(tài)替換也細(xì)分為若干小流派。可以直接在Activity里做Hook,重寫getAsset的幾個(gè)方法,從而使用自己的ResourceManager和AssetPath;也可以在更抽象的層面,也就是在startActivity方法的位置做Hook,涉及的類包括ActivityThread、Instrumentation等;最高層次則是在AMS上做修改,也就是張勇的解決方案,這里需要修改的類非常多,AMS、PMS等都需要改動(dòng)。總之,在越抽象的層次上做Hook,需要做的改動(dòng)就越大,但好處就是更加靈活了。沒(méi)有哪一個(gè)方法更好,一切看你自己的選擇。

第二種是靜態(tài)代理,這是任玉剛的框架采取的思路。寫一個(gè)PluginActivity繼承自Activity基類,把Activity基類里面涉及生命周期的方法全都重寫一遍,插件中的Activity是沒(méi)有生命周期的,所以要讓插件中的Activity都繼承自PluginActivity,這樣就有生命周期了。

第三種是Dex合并,Dex合并就是Android熱修復(fù)的思想。剛才說(shuō)到了兩個(gè)項(xiàng)目——AndFix和Nuwa,它們的思想是相同的。原生Apk自帶的Dex是通過(guò)PathClassLoader來(lái)加載的,而插件Dex則是通過(guò)DexClassLoader來(lái)加載的。但有一個(gè)順序問(wèn)題,是由Davlik的機(jī)制決定的,如果宿主Dex和插件Dex都有一個(gè)相同命名空間的類的方法,那么先加載哪個(gè)Dex,哪個(gè)Dex中的這個(gè)類的方法將會(huì)占山為王,后面其他同名方法都替換了。所以,AndFix熱修復(fù)就是優(yōu)先加載插件包中的Dex,從而實(shí)現(xiàn)熱修復(fù)。由于熱修復(fù)的插件包通常只包括一個(gè)類的方法,體量很小,和正常的插件不是一個(gè)數(shù)量級(jí)的,所以只稱為熱修復(fù)補(bǔ)丁包,而不是插件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,132評(píng)論 25 708
  • 最近幾年移動(dòng)開(kāi)發(fā)業(yè)界興起了「 插件化技術(shù) 」的旋風(fēng),各個(gè)大廠都推出了自己的插件化框架,各種開(kāi)源框架都評(píng)價(jià)自身功能優(yōu)...
    斜杠時(shí)光閱讀 4,001評(píng)論 1 36
  • 是時(shí)候來(lái)一波Android插件化了 是時(shí)候來(lái)一波Android插件化了前言Android開(kāi)發(fā)演進(jìn)模塊化介紹插件化介...
    流水不腐小夏閱讀 4,811評(píng)論 3 51
  • 引言 先簡(jiǎn)單介紹一下Android插件化。很早之前已經(jīng)有公司在研究這項(xiàng)技術(shù),淘寶做得比較早,但淘寶的這項(xiàng)技術(shù)一直是...
    流水潺湲閱讀 11,706評(píng)論 8 149
  • 我沒(méi)來(lái)大學(xué)前,便時(shí)常幻想自己的大學(xué)生活應(yīng)該怎么度過(guò),但有一件事是非常肯定的,那就是堅(jiān)持每天鍛煉,而跑步,是我最喜歡...
    刺眼柔光閱讀 258評(píng)論 0 1