作者:小楠總
鏈接:http://www.reibang.com/p/b6d0586aab9f
來源:簡書
著作權歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權,非商業(yè)轉(zhuǎn)載請注明出處火脉。
插件化概述
提到插件化,就不得不提起方法數(shù)超過65535的問題,我們可以通過Dex分包來解決斑响,同時也可以通過使用插件化開發(fā)來解決。插件化的概念就是由宿主APP去加載以及運行插件APP钳榨。
下面是一些插件化的優(yōu)勢:
在一個大的項目里面舰罚,為了明確的分工,往往不同的團隊負責不同的插件APP薛耻,這樣分工更加明確营罢。
各個模塊封裝成不同的插件APK,不同模塊可以單獨編譯饼齿,提高了開發(fā)效率饲漾。
解決了上述的方法數(shù)超過限制的問題。
可以通過上線新的插件來解決線上的BUG缕溉,達到“熱修復”的效果考传。
減小了宿主APK的體積。
下面是插件化開發(fā)的缺點:
插件化開發(fā)的APP不能在Google Play上線倒淫,也就是沒有海外市場伙菊。
綜上所述败玉,如果您的APP不需要支持海外的話,還是可以考慮插件化開發(fā)的镜硕。
各個插件框架比較:
插件化框架對比.png
[1] 獨立插件:一個完整的apk包运翼,可以獨立運行。比如從你的程序跑起淘寶兴枯、QQ血淌,但這加載起來是要鬧哪樣? 非獨立插件:依賴于宿主财剖,宿主是個殼悠夯,插件可使用其資源代碼并分離之以最小化,這才是業(yè)務需要嘛躺坟。 -- “所有不能加載非獨立插件的插件化框架都是耍流氓”沦补。
[2] ACDD加載.so用了Native方法(libdexopt.so),不是Java層咪橙,源碼見dexopt.cpp夕膀。
[3] Service更新頻度低,可預先注冊在宿主的manifest中美侦,如果沒有很好的理由說服我产舞,現(xiàn)不支持。
[4] 要實現(xiàn)宿主菠剩、各個插件資源可互相訪問易猫,需要對他們的資源進行分段處理以避免沖突。
[5] 這些框架修改aapt源碼具壮、重編准颓、覆蓋SDK Manager下載的aapt,我只想說“殺(wan)雞(de)焉(kai)用(xin)牛(jiu)刀(hao)”嘴办。Small使用gradle-small-plugin瞬场,在后期修改二進制文件,實現(xiàn)了PP段分區(qū)涧郊。
[6] 使用public-padding對資源id的TT段進行分區(qū),分開了宿主和插件眼五。但是插件之間無法分段妆艘。
[7] 除了宿主提供一些公共資源與代碼外,我們?nèi)孕璺庋b一些業(yè)務層面的公共庫看幼,這些庫被其他插件所依賴批旺。公共插件打包的目的就是可以單獨更新公共庫插件,并且相關插件不需要動到诵姜。
[8] AppCompat: Android Studio默認添加的主題包汽煮,Google主推的Metrial Design包也依賴于此。大勢所趨。
[9] 聯(lián)調(diào)插件:使用Android Studio調(diào)試宿主時暇赤,可直接在插件代碼中添加斷點調(diào)試心例。
在學習插件化的時候,需要掌握Android系統(tǒng)的一些Framework層面的知識以及一些編程相關的知識鞋囊,其中包括:
Binder機制
Android系統(tǒng)止后、APP、Activity等四大組件的啟動流程
APK安裝過程
Android資源的加載過程
Hook機制
面向接口(抽象)編程
面向切面編程
等等
相關的參考資料有:
《Android開發(fā)藝術探索》
《Android源碼與設計模式》
寫給Android App開發(fā)人員看的Android底層知識:http://www.cnblogs.com/Jax/p/6864103.html
Small主頁:https://github.com/wequick/Small
Small使用介紹:http://www.reibang.com/p/7990714d10cb
作者:小楠總鏈接:http://www.reibang.com/p/b6d0586aab9f來源:簡書著作權歸作者所有溜腐。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權译株,非商業(yè)轉(zhuǎn)載請注明出處。