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要麻煩一些,請看流程圖:
這個插件框架還有很多不足,我們還在繼續完善。