Android插件化初識

含義:能夠簡單理解爲將一個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。

 

插件化必備基礎:

ClassLoader類加載器

要想實現加載外部dex文件(即插件)來實現熱部署,那麼必然要把其中的class文件加載到內存中。

其中涉及到兩種ClassLoader:DexClassLoader和PathClassLoader。而DexClassLoader能夠加載外部的jar,dex等文件,正是咱們須要的。

Java反射

由於插件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的方式,都是對代理模式的應用。

相關文章
相關標籤/搜索