含義:能夠簡單理解爲將一個app分爲多個小的app,其中有一個爲宿主app。java
解決的主要問題:代碼加載、資源加載。app
插件的方式:apk安裝,apk不安裝,dex包框架
插件化的優勢:函數
1) 模塊解耦,應用程序擴展性強學習
2) 解除單個dex函數不能超過 65535的限制spa
3) 動態升級,下載更新節省流量插件
4) 高效開發(編譯速度更快)代理
插件化的缺點:對象
1) 增長了主應用程序的邏輯難度生命週期
2) 技術有難度,目前一些成熟的框架都是閉源的
插件化開發—動態加載技術加載已安裝和未安裝的apk
動態加載技術就是使用類加載器加載相應的apk、dex、jar(必須含有dex文件),再經過反射得到該apk、dex、jar內部的資源(class、圖片、color等等)進而供宿主app使用。
代碼加載:
類的加載可使用Java的ClassLoader機制,還須要組件生命週期管理。
資源加載:
用AssetManager的隱藏方法addAssetPath。
插件化必備基礎:
要想實現加載外部dex文件(即插件)來實現熱部署,那麼必然要把其中的class文件加載到內存中。
其中涉及到兩種ClassLoader:DexClassLoader和PathClassLoader。而DexClassLoader能夠加載外部的jar,dex等文件,正是咱們須要的。
由於插件apk與宿主apk不在一個apk內,那麼一些類的訪問必然要經過反射進行獲取。因此瞭解反射對插件化的學習是必須的。
res裏的每個資源都會在R.java裏生成一個對應的Integer類型的id,APP啓動時會先把R.java註冊到當前的上下文環境,咱們在代碼裏以R文件的方式使用資源時正是經過使用這些id訪問res資源,然而插件的R.java並無註冊到當前的上下文環境,因此插件的res資源也就沒法經過id使用了。
查看源碼,經過「addAssetPath」方法從新生成一個新的Resource對象來保存插件中的資源,避免衝突。
插件化實現的過程主要靠欺上瞞下,坑蒙拐騙來實現。想一想雖然加載進來了Activity等組件,但也僅僅是最爲一個對象而存在,並無在AndroidManifest中註冊,沒有生命週期的回調,並不能實現咱們想要的效果。所以不管是dynamic_load_apk經過代理activity來操控插件activity的方式,仍是DroidPlugin經過hook activity啓動過程來啓動插件activity的方式,都是對代理模式的應用。