[原創]Android插件化的一種實現


Android的插件化已經是老生常談的話題了,插件化的好處有很多:解除代碼耦合,插件支持熱插拔,靜默升級,從根本上解決65K屬性和方法的bug等等。

下面給大家介紹一下我們正在用的插件化框架。
本片主要以類圖的方式向大家介紹插件化框架的實現。
下圖是框架的初始化流程:

框架初始化后,就該啟動插件了,下圖是插件的啟動流程:

 

這個步驟主要是初始化插件的運行環境,利用宿主的Context改造成插件的Context。
接下來是插件啟動Activity的流程:

 

該步驟主要是用宿主的Activity包裝插件的Activity。
通過上面的幾個流程圖,我們得知插件框架的基本原理如下:

  • 利用DexClassLoader來實現動態加載插件中的class。
  • 通過反射替換ContextImpl中的mResources,mPackageInfo,並替換插件Activity中的相關屬性,來實現加載插件中的資源文件。
  • 通過WidgetContext和WidgetInstrumentation來攔截startActivity的操作。
  • 通過啟動HostActivity來代替插件Activity,也就是說一個HostActivity對應一個插件Activity。

知道了啟動插件Activity的原理后,我們思考下如何支持啟動插件Service:

  • 由於Android系統中同一個Service只會存在一個實例,這點與Activity不同,所以考慮用框架模擬Android系統來維護插件的Service。Service本質上分為兩種,運行在獨立進程和非獨立進程的,所以宿主應用至少需要啟動兩個Service,用來裝載插件的不同Service。

啟動Service的實現方式和Activity有些不同,下面是框架管理Service的類圖:

 

 

了解了框架支持Service的基本結構,我們看下啟動插件非獨立進程Service的流程:

 

 

啟動獨立進程插件Service要麻煩一些,請看流程圖:

 

 

這個插件框架還有很多不足,我們還在繼續完善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM