插件化開(kāi)發(fā)小結(jié)

引言

先簡(jiǎn)單介紹一下Android插件化。很早之前已經(jīng)有公司在研究這項(xiàng)技術(shù),淘寶做得比較早,但淘寶的這項(xiàng)技術(shù)一直是保密的。直到2015年才陸續(xù)出現(xiàn)很多框架,Android插件化分成很多技術(shù)流派,實(shí)現(xiàn)的方式都不太一樣。


發(fā)展歷史

首先,要記住2012年這個(gè)時(shí)間點(diǎn)。2012年的時(shí)候,就有人做插件化技術(shù),是大眾點(diǎn)評(píng)的屠毅敏,他推出了AndroidDynamicLoader框架,用Fragment來(lái)實(shí)現(xiàn)。大眾點(diǎn)評(píng)是國(guó)內(nèi)做App比較早的公司,他們積累了很多的經(jīng)驗(yàn),尤其是插件化技術(shù) 。通過(guò)動(dòng)態(tài)加載不同的Fragement,把想換的頁(yè)面都換掉。我們也是在這個(gè)項(xiàng)目中第一次看到了如何通過(guò)addAssetPath來(lái)讀取插件中的資源。

2013年,出現(xiàn)了23Code。23Code提供了一個(gè)殼,在這個(gè)殼里可以動(dòng)態(tài)下載插件,然后動(dòng)態(tài)運(yùn)行。可以在殼外編寫(xiě)各種各樣的控件,放在這個(gè)框架下去運(yùn)行。這就是Android插件化技術(shù)。這個(gè)項(xiàng)目的作者和開(kāi)源地址,目前不是很清楚。

2014年初,大家也許看過(guò)一個(gè)視頻,阿里一位員工做了一次技術(shù)分享,專門講淘寶的Altas技術(shù),以及這項(xiàng)技術(shù)的大方向。但是很多技術(shù)細(xì)節(jié)沒(méi)有分享。

然后是任玉剛的里程碑式的項(xiàng)目。2014年底,玉剛發(fā)布了一個(gè)Android插件化項(xiàng)目,起名為dynamic-load-apk,這跟后續(xù)介紹的很多插件化項(xiàng)目都不太一樣。它沒(méi)有Hook太多的系統(tǒng)底層方法,而是從上層,即App應(yīng)用層解決問(wèn)題,創(chuàng)建一個(gè)繼承自Activity的ProxyActivity類,然后讓插件中的所有Activity都繼承自ProxyActivity,并重寫(xiě)Activity所有的方法。之所以說(shuō)這個(gè)項(xiàng)目是里程碑式的,是因?yàn)樵?015年之前業(yè)界沒(méi)有太多資料可以參考。

2015年4月,一個(gè)新框架推出來(lái),叫OpenAltas,后來(lái)改名為ACDD。這個(gè)框架參考了淘寶App的很多經(jīng)驗(yàn),主要就是Hook的思想,同時(shí),還首次提出來(lái)通過(guò)擴(kuò)展AAPT來(lái)解決插件與宿主的資源id沖突的問(wèn)題。

2015年8月,張勇發(fā)布DroidPlugin。這是Android插件化中第二個(gè)里程碑式的項(xiàng)目,這個(gè)項(xiàng)目太牛了,能把任意的App都加載到宿主里。可以基于這個(gè)框架寫(xiě)一個(gè)宿主App,然后就可以把別人寫(xiě)的App都當(dāng)作插件來(lái)加載。這個(gè)框架的功能的確很強(qiáng)大,但強(qiáng)大的代價(jià)就是要改寫(xiě)很多Android系統(tǒng)的底層代碼,更別提這哥們還比較懶,沒(méi)有制訂任何說(shuō)明文檔,導(dǎo)致技術(shù)人員掌握這個(gè)框架不太容易。

再之后就是百花齊放的時(shí)代了,GitHub上有很多插件化框架,但這些框架影響都不大,我們這里就略過(guò)了。

接下來(lái)登場(chǎng)的是熱修復(fù)技術(shù)。2015年5月,iOS推出了JSPatch,JSPatch通過(guò)Runtime的機(jī)制,能迅速修復(fù)線上App任何一個(gè)類的任何一個(gè)方法。而當(dāng)時(shí)的Android系統(tǒng)沒(méi)有能迅速替換的方式。于是,在2015年9月,有人找到了實(shí)現(xiàn)迅速替換的途徑,就是Andfix,后面會(huì)講它的原理。

2015年10月,大眾點(diǎn)評(píng)的賈吉鑫做了一個(gè)項(xiàng)目,起名為Nuwa(女?huà)z),主要思路跟Andfix差不多,都是解決Android的修復(fù)問(wèn)題,能修復(fù)線上的任何一個(gè)方法。可惜后來(lái)沒(méi)有繼續(xù)維護(hù)。

2015年底,仍然是Android插件化框架,福建的林廣亮提出了一個(gè)新機(jī)制——Small框架,這個(gè)機(jī)制不太一樣的地方就是,通過(guò)腳本的方式來(lái)解決資源沖突的問(wèn)題。

2015 年 8 月,DroidPlugin 是 360 手機(jī)助手實(shí)現(xiàn)的一種插件化框架,它可以直接運(yùn)行第三方的獨(dú)立 APK 文件,完全不需要對(duì) APK 進(jìn)行修改或安裝。一種新的插件機(jī)制,一種免安裝的運(yùn)行機(jī)制,是一個(gè)沙箱(但是不完全的沙箱。就是對(duì)于使用者來(lái)說(shuō),并不知道他會(huì)把 apk 怎么樣), 是模塊化的基礎(chǔ)。

2017年 6 月 ,VirtualAPK 是滴滴開(kāi)源的一套插件化框架,支持幾乎所有的 Android 特性,四大組件方面。

2017 年 7 月,RePlugin是一套完整的、穩(wěn)定的、適合全面使用的,占坑類插件化方案,由360手機(jī)衛(wèi)士的RePlugin Team研發(fā),也是業(yè)內(nèi)首個(gè)提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。


基礎(chǔ)

介紹完Android插件化的歷史,接下來(lái)講一講Android插件化需要的Android系統(tǒng)底層知識(shí)。在座的基本都是做Android開(kāi)發(fā)出身,或許有一半到三分之一是資深的,還有的只做了一兩年,希望對(duì)插件化有更深的認(rèn)識(shí)。要想完全明白插件化技術(shù),首先需要了解Android系統(tǒng)的底層實(shí)現(xiàn)。

首先,做Android系統(tǒng)原代碼的人應(yīng)該非常熟悉Binder,如果沒(méi)有它真的寸步難行。Binder涉及兩層技術(shù)。你可以認(rèn)為它是一個(gè)中介者模式,在客戶端和服務(wù)器端之間,Binder就起到中介的作用,這是我這段時(shí)間對(duì)Binder的思考。要實(shí)現(xiàn)四大組件的插件化,就需要在Binder上做修改。Binder服務(wù)端的內(nèi)容沒(méi)辦法修改,只能改客戶端的代碼。四大組件每個(gè)組件的客戶端都不太一樣,這個(gè)需要大家自己去發(fā)現(xiàn),時(shí)間關(guān)系,這里就不多說(shuō)了。

學(xué)習(xí)Binder的最好方式就是AIDL。你可以讀到很多關(guān)于AIDL的資料,通過(guò)制訂一個(gè)aidl文件自動(dòng)生成一個(gè)Java類,研究一下這個(gè)Java類的每個(gè)方法和變量,然后再反過(guò)來(lái)看四大組件,其實(shí)都是跟AIDL差不多的方式。

其次,是App打包的流程。代碼寫(xiě)完了,執(zhí)行一次打包操作,中途經(jīng)歷了資源打包、dex生成、簽名等過(guò)程。其中最重要的就是資源的打包,即AAPT這一步,如果宿主和插件的資源id沖突,一種解決辦法就是在這里做修改。

第三,App在手機(jī)上的安裝流程也很重要。熟悉安裝流程不僅對(duì)插件化有幫助,在遇到安裝bug的時(shí)候也非常重要。手機(jī)安裝App的時(shí)候,經(jīng)常會(huì)有下載異常,提示資源包不能解析,這時(shí)需要知道安裝App的這段代碼在什么地方,這只是第一步。第二步需要知道,App下載到本地后,具體要做哪些事情。手機(jī)有些目錄不能訪問(wèn),App下載到本地之后,放到哪個(gè)目錄下,然后會(huì)生成哪些文件。插件化有個(gè)增量更新的概念,如何下載一個(gè)增量包,從本地具體哪個(gè)位置取出一個(gè)包,這個(gè)包的具體命名規(guī)則是什么,等等。這些細(xì)節(jié)都必須要清楚明白。

第四,是App的啟動(dòng)流程。Activity啟動(dòng)有幾種方式?一種是寫(xiě)一個(gè)startActivity,第二種是點(diǎn)擊手機(jī)App,通過(guò)手機(jī)系統(tǒng)里的Launcher機(jī)制,啟動(dòng)App里默認(rèn)的Activity。通常,App開(kāi)發(fā)人員喜聞樂(lè)見(jiàn)的方式是第二種。那么第一種方式的啟動(dòng)原理是什么呢?另外,啟動(dòng)的時(shí)候,main函數(shù)在哪里?這個(gè)main函數(shù)的位置很重要,我們可以對(duì)它所在的類做修改,從而實(shí)現(xiàn)插件化。

第五點(diǎn)更重要,做Android插件化需要控制兩個(gè)地方。首先是插件Dex的加載,如何把插件Dex中的類加載到內(nèi)存?另外是資源加載的問(wèn)題。插件可能是apk也可能是so格式,不管哪一種,都不會(huì)生成R.id,從而沒(méi)辦法使用。這個(gè)問(wèn)題有好幾種解決方案。一種是是重寫(xiě)Context的getAsset、getResource之類的方法,偷換概念,讓插件讀取插件里的資源,但缺點(diǎn)就是宿主和插件的資源id會(huì)沖突,需要重寫(xiě)AAPT。另一種是重寫(xiě)AMS中保存的插件列表,從而讓宿主和插件分別去加載各自的資源而不會(huì)沖突。第三種方法,就是打包后,執(zhí)行一個(gè)腳本,修改生成包中資源id。

第六點(diǎn),在實(shí)施插件化后,如何解決不同插件的開(kāi)發(fā)人員的工作區(qū)問(wèn)題。比如,插件1和插件2,需要分別下載哪些代碼,如何獨(dú)立運(yùn)行?就像機(jī)票和火車票,如何只運(yùn)行自己的插件,而不運(yùn)行別人的插件?這是協(xié)同工作的問(wèn)題。火車票和機(jī)票,這兩個(gè)Android團(tuán)隊(duì)的各自工作區(qū)是不一樣的,這時(shí)候就要用到Gradle腳本了,每個(gè)項(xiàng)目分別有各自的倉(cāng)庫(kù),有各自不同的打包腳本,只需要把自己的插件跟宿主項(xiàng)目一起打包運(yùn)行起來(lái),而不用引入其他插件,還有更厲害的是,也可以把自己的插件當(dāng)作一個(gè)App來(lái)打包并運(yùn)行。

上面介紹了插件化的入門知識(shí),一共六點(diǎn),每一點(diǎn)都需要花大量時(shí)間去理解。否則,在面對(duì)插件化項(xiàng)目的時(shí)候,很多地方你會(huì)一頭霧水。而只要理解了這六點(diǎn)核心,一切可迎刃而解。

類庫(kù)

1.DroidPlugin
是360手機(jī)助手在Android系統(tǒng)上實(shí)現(xiàn)了一種新的插件機(jī)制
2.Android-Plugin-Framework
此項(xiàng)目是Android插件開(kāi)發(fā)框架完整源碼及示例。用來(lái)通過(guò)動(dòng)態(tài)加載的方式在宿主程序中運(yùn)行插件APK。
3.Small
世界那么大,組件那么小。Small,做最輕巧的跨平臺(tái)插件化框架。里面有很詳細(xì)的文檔
4.dynamic-load-apk
Android 使用動(dòng)態(tài)加載框架DL進(jìn)行插件化開(kāi)發(fā)
5.AndroidDynamicLoader
Android 動(dòng)態(tài)加載框架,他不是用代理 Activity 的方式實(shí)現(xiàn)而是用 Fragment 以及 Schema 的方式實(shí)現(xiàn)
6.DynamicAPK
實(shí)現(xiàn)Android App多apk插件化和動(dòng)態(tài)加載,支持資源分包和熱修復(fù).攜程App的插件化和動(dòng)態(tài)加載框架.
7.ACDD
非代理Android動(dòng)態(tài)部署框架
8.android-pluginmgr
不需要插件規(guī)范的apk動(dòng)態(tài)加載框架。
9. VirtualAPK
VirtualAPK是滴滴出行自研的一款優(yōu)秀的插件化框架。
10.android-pluginmgr
不需要插件規(guī)范的apk動(dòng)態(tài)加載框架。
11.RePlugin
RePlugin是一套完整的、穩(wěn)定的、適合全面使用的,占坑類插件化方案,由360手機(jī)衛(wèi)士的RePlugin Team研發(fā),也是業(yè)內(nèi)首個(gè)提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。

主流框架

在 Android 中實(shí)現(xiàn)插件化框架,需要解決的問(wèn)題主要如下:

資源和代碼的加載
Android 生命周期的管理和組件的注冊(cè)
宿主 APK 和插件 APK 資源引用的沖突解決
下面分析幾個(gè)目前主流的開(kāi)源框架,看看每個(gè)框架具體實(shí)現(xiàn)思路和優(yōu)缺點(diǎn)。


DL 動(dòng)態(tài)加載框架 ( 2014 年底)

GItHub:https://github.com/singwhatiwanna/dynamic-load-apk

DL支持的功能

1、plugin無(wú)需安裝即可由宿主調(diào)起。

2、支持用R訪問(wèn)plugin資源

3、plugin支持Activity和FragmentActivity(未來(lái)還將支持其他組件)

4、基本無(wú)反射調(diào)用

5、插件安裝后仍可獨(dú)立運(yùn)行從而便于調(diào)試

6、支持3種plugin對(duì)host的調(diào)用模式:
(1)無(wú)調(diào)用(但仍然可以用反射調(diào)用)。
(2)部分調(diào)用,host可公開(kāi)部分接口供plugin調(diào)用。 這前兩種模式適用于plugin開(kāi)發(fā)者無(wú)法獲得host代碼的情況。
(3)完全調(diào)用,plugin可以完全調(diào)用host內(nèi)容。這種模式適用于plugin開(kāi)發(fā)者能獲得host代碼的情況。

7、只需引入DL的一個(gè)jar包即可高效開(kāi)發(fā)插件,DL的工作過(guò)程對(duì)開(kāi)發(fā)者完全透明

8、支持android2.x版本

DL框架原理

動(dòng)態(tài)加載主要有兩個(gè)需要解決的復(fù)雜問(wèn)題:資源的訪問(wèn)和activity生命周期的管理,除此之外,還有很多坑爹的小問(wèn)題,而DL框架很好地解決了這些問(wèn)題。需要說(shuō)明的一點(diǎn)是,我們不可能調(diào)起任何一個(gè)未安裝的apk,這在技術(shù)上是很難實(shí)現(xiàn)的,我們調(diào)起的apk必須受某種規(guī)范的約束,只有在這種約束下開(kāi)發(fā)的apk,我們才能將其調(diào)起。


DroidPlugin ( 2015 年 8 月)

Github:https://github.com/DroidPluginTeam/DroidPlugin

DroidPlugin 是 360 手機(jī)助手實(shí)現(xiàn)的一種插件化框架,它可以直接運(yùn)行第三方的獨(dú)立 APK 文件,完全不需要對(duì) APK 進(jìn)行修改或安裝。一種新的插件機(jī)制,一種免安裝的運(yùn)行機(jī)制,是一個(gè)沙箱(但是不完全的沙箱。就是對(duì)于使用者來(lái)說(shuō),并不知道他會(huì)把 apk 怎么樣), 是模塊化的基礎(chǔ)。

DroidPlugin 插件機(jī)制 :它可以在無(wú)需安裝、修改的情況下運(yùn)行APK文件,此機(jī)制對(duì)改進(jìn)大型APP的架構(gòu),實(shí)現(xiàn)多團(tuán)隊(duì)協(xié)作開(kāi)發(fā)具有一定的好處。

項(xiàng)目新地址:DroidPlugin

定義:

HOST程序:插件的宿主。

插件:免安裝運(yùn)行的APK

限制和缺陷:

  1. 無(wú)法在插件中發(fā)送具有自定義資源的Notification,例如:
    a. 帶自定義RemoteLayout的Notification
    b. 圖標(biāo)通過(guò)R.drawable.XXX指定的通知(插件系統(tǒng)會(huì)自動(dòng)將其轉(zhuǎn)化為Bitmap)
  2. 無(wú)法在插件中注冊(cè)一些具有特殊Intent Filter的ServiceActivityBroadcastReceiverContentProvider等組件以供Android系統(tǒng)、已經(jīng)安裝的其他APP調(diào)用。
  3. 缺乏對(duì)Native層的Hook,對(duì)某些帶native代碼的apk支持不好,可能無(wú)法運(yùn)行。比如一部分游戲無(wú)法當(dāng)作插件運(yùn)行。

特點(diǎn):

  1. 支持Androd 2.3以上系統(tǒng)
  2. 插件APK完全不需做任何修改,可以獨(dú)立安裝運(yùn)行、也可以做插件運(yùn)行。要以插件模式運(yùn)行某個(gè)APK,你無(wú)需重新編譯、無(wú)需知道其源碼。
  3. 插件的四大組件完全不需要在Host程序中注冊(cè),支持Service、Activity、BroadcastReceiver、ContentProvider四大組件
  4. 插件之間、Host程序與插件之間會(huì)互相認(rèn)為對(duì)方已經(jīng)"安裝"在系統(tǒng)上了。
  5. API低侵入性:極少的API。HOST程序只是需要一行代碼即可集成Droid Plugin
  6. 超強(qiáng)隔離:插件之間、插件與Host之間完全的代碼級(jí)別的隔離:不能互相調(diào)用對(duì)方的代碼。通訊只能使用Android系統(tǒng)級(jí)別的通訊方法。
  7. 支持所有系統(tǒng)API
  8. 資源完全隔離:插件之間、與Host之間實(shí)現(xiàn)了資源完全隔離,不會(huì)出現(xiàn)資源竄用的情況。
  9. 實(shí)現(xiàn)了進(jìn)程管理,插件的空進(jìn)程會(huì)被及時(shí)回收,占用內(nèi)存低。
  10. 插件的靜態(tài)廣播會(huì)被當(dāng)作動(dòng)態(tài)處理,如果插件沒(méi)有運(yùn)行(即沒(méi)有插件進(jìn)程運(yùn)行),其靜態(tài)廣播也永遠(yuǎn)不會(huì)被觸發(fā)。

Small ( 2015 年底)

Github:https://github.com/wequick/Small
官網(wǎng):http://code.wequick.net/Small
Small 是一種實(shí)現(xiàn)輕巧的跨平臺(tái)插件化框架,基于“輕量、透明、極小化、跨平臺(tái)”的理念

優(yōu)點(diǎn)如下:

1.所有插件支持內(nèi)置宿主包中。
2.插件的編碼和資源文件的使用與普通開(kāi)發(fā)應(yīng)用沒(méi)有差別。
3.通過(guò)設(shè)定 URI ,宿主以及 Native 應(yīng)用插件,Web 插件,在線網(wǎng)頁(yè)等能夠方便進(jìn)行通信。
4.支持 Android 、 iOS 、和 Html5 ,三者可以通過(guò)同一套 Javascript 接口實(shí)現(xiàn)通信。

缺點(diǎn)如下:

暫不支持 Service 的動(dòng)態(tài)注冊(cè),不過(guò)這個(gè)可以通過(guò)將 Service 預(yù)先注冊(cè)在宿主的 AndroidManifest.xml 文件中進(jìn)行規(guī)避,因?yàn)?Service 的更新頻率通常非常低。


VirtualAPK (2017年 6 月 )

VirtualAPK 是滴滴開(kāi)源的一套插件化框架,支持幾乎所有的 Android 特性,四大組件方面。

原理:

VirtualAPK 對(duì)插件沒(méi)有額外的約束,原生的 apk 即可作為插件。插件工程編譯生成 apk后,即可通過(guò)宿主 App 加載,每個(gè)插件 apk 被加載后,都會(huì)在宿主中創(chuàng)建一個(gè)單獨(dú)的 LoadedPlugin 對(duì)象。如下圖所示,通過(guò)這些 LoadedPlugin 對(duì)象,VirtualAPK 就可以管理插件并賦予插件新的意義,使其可以像手機(jī)中安裝過(guò)的 App 一樣運(yùn)行。

  • 合并宿主和插件的ClassLoader 需要注意的是,插件中的類不可以和宿主重復(fù)
  • 合并插件和宿主的資源 重設(shè)插件資源的 packageId,將插件資源和宿主資源合并
  • 去除插件包對(duì)宿主的引用 構(gòu)建時(shí)通過(guò) Gradle 插件去除插件對(duì)宿主的代碼以及資源的引用

特性如下:

四大組件均不需要在宿主manifest中預(yù)注冊(cè),每個(gè)組件都有完整的生命周期。

1.Activity:支持顯示和隱式調(diào)用,支持Activity的theme和LaunchMode,支持透明主題;
2.Service:支持顯示和隱式調(diào)用,支持Service的start、stop、bind和unbind,并支持跨進(jìn)程bind插件中的Service;
3.Receiver:支持靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)的Receiver;
4.ContentProvider:支持provider的所有操作,包括CRUD和call方法等,支持跨進(jìn)程訪問(wèn)插件中的Provider。
5.自定義View:支持自定義 View,支持自定義屬性和style,支持動(dòng)畫(huà);
6.PendingIntent:支持PendingIntent以及和其相關(guān)的Alarm、Notification和AppWidget;
7.支持插件Application以及插件manifest中的meta-data;
8.支持插件中的so。

優(yōu)秀的兼容性

  • 兼容市面上幾乎所有的Android手機(jī),這一點(diǎn)已經(jīng)在滴滴出行客戶端中得到驗(yàn)證。
  • 資源方面適配小米、Vivo、Nubia 等,對(duì)未知機(jī)型采用自適應(yīng)適配方案。
  • 極少的 Binder Hook,目前僅僅 hook了兩個(gè)Binder:AMS和IContentProvider,hook 過(guò)程做了充分的兼容性適配。
  • 插件運(yùn)行邏輯和宿主隔離,確保框架的任何問(wèn)題都不會(huì)影響宿主的正常運(yùn)行。

RePlugin (2017 年 7 月)

GitHub:https://github.com/Qihoo360/RePlugin
RePlugin是一套完整的、穩(wěn)定的、適合全面使用的,占坑類插件化方案,由360手機(jī)衛(wèi)士的RePlugin Team研發(fā),也是業(yè)內(nèi)首個(gè)提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。

其主要優(yōu)勢(shì)有:

  • 極其靈活:主程序無(wú)需升級(jí)(無(wú)需在Manifest中預(yù)埋組件),即可支持新增的四大組件,甚至全新的插件
  • 非常穩(wěn)定:Hook點(diǎn)僅有一處(ClassLoader),無(wú)任何Binder Hook!如此可做到其崩潰率僅為“萬(wàn)分之一”,并完美兼容市面上近乎所有的Android ROM
  • 特性豐富:支持近乎所有在“單品”開(kāi)發(fā)時(shí)的特性。包括靜態(tài)Receiver、Task-Affinity坑位、自定義Theme、進(jìn)程坑位、AppCompat、DataBinding等
  • 易于集成:無(wú)論插件還是主程序,只需“數(shù)行”就能完成接入
  • 管理成熟:擁有成熟穩(wěn)定的“插件管理方案”,支持插件安裝、升級(jí)、卸載、版本管理,甚至包括進(jìn)程通訊、協(xié)議版本、安全校驗(yàn)等
  • 數(shù)億支撐:有360手機(jī)衛(wèi)士龐大的數(shù)億用戶做支撐,三年多的殘酷驗(yàn)證,確保App用到的方案是最穩(wěn)定、最適合使用的

截止2017年6月底,RePlugin的:

特性 描述
插件數(shù) 103(核心57個(gè))
插件占應(yīng)用比 高達(dá)83%
年發(fā)版次數(shù) 高達(dá)596次(工作日均2次)
崩潰率 萬(wàn)分之一(0.01%),極低
時(shí)間 2014年應(yīng)用,3年驗(yàn)證

目前360公司幾乎所有的億級(jí)用戶量的APP,以及多款主流第三方APP,都采用了RePlugin方案。

有關(guān)RePlugin的詳細(xì)介紹,請(qǐng)點(diǎn)擊這里閱讀《RePlugin 官方 WiKi》

特性

特性 描述
組件 四大組件(含靜態(tài)Receiver)
升級(jí)無(wú)需改主程序Manifest 完美支持
Android特性 支持近乎所有(包括SO庫(kù)等)
TaskAffinity & 多進(jìn)程 支持(坑位方案)**
插件類型 支持自帶插件(自識(shí)別)、外置插件**
插件間耦合 支持Binder、Class Loader、資源等
進(jìn)程間通訊 支持同步、異步、Binder、廣播等
自定義Theme & AppComat 支持
DataBinding 支持
安全校驗(yàn) 支持
資源方案 獨(dú)立資源 + Context傳遞(相對(duì)穩(wěn)定)
Android 版本 API Level 9+ (2.3及以上)

參考文章

APK動(dòng)態(tài)加載框架(DL)解析
Android插件化從入門到放棄-最強(qiáng)合集
包建強(qiáng)的無(wú)線技術(shù)空間,寫(xiě)給Android App 開(kāi)發(fā)人員看的 Android 底層知識(shí) 置頂8篇
有關(guān)Android插件化思考
Android插件化原理解析
Android插件化:從入門到放棄
Android博客周刊專題之-插件化開(kāi)發(fā)

最后編輯于
?著作權(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ù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,996評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,316評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,406評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,128評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,524評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,759評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,310評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,065評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,249評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,479評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,909評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,140評(píng)論 1 290
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,984評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,228評(píng)論 2 375

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,687評(píng)論 25 708
  • 最近幾年移動(dòng)開(kāi)發(fā)業(yè)界興起了「 插件化技術(shù) 」的旋風(fēng),各個(gè)大廠都推出了自己的插件化框架,各種開(kāi)源框架都評(píng)價(jià)自身功能優(yōu)...
    斜杠時(shí)光閱讀 3,989評(píng)論 1 36
  • 曾經(jīng)喝過(guò)的最辣的毒雞湯 人生最大的落差莫過(guò)于配不上自己的野心,也辜負(fù)了所有的苦難 周一上班再喝一碗,頓時(shí)神清氣爽,...
    eileen01閱讀 189評(píng)論 1 1
  • 常聽(tīng)說(shuō)‘順為凡,逆為仙,一切全在顛倒顛‘,這五千言‘道德經(jīng)’豈不就是‘德道徑’,為學(xué)日增,為道日損,損之又損,幾近...
    德道徑閱讀 484評(píng)論 2 1
  • 夏天冗長(zhǎng)的下午帶我閉上了雙眼,閉上雙眼才能看見(jiàn)銀河。 在那里不需要空氣也沒(méi)有灰塵,我依然能看得清自己的身影,像是...
    Esus4閱讀 628評(píng)論 0 1