Android插件化的一種實現

jopen 9年前發布 | 11K 次閱讀 Android Android開發 移動開發
 

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

下面給大家介紹一下我們正在用的差價化框架。

本片主要以類圖的方式向大家介紹插件話框架的實現。

下圖是框架的初始化流程:

Android插件化的一種實現

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

Android插件化的一種實現

這個步驟主要是初始化插件的運行環境,利用宿主的Context改造成插件的Context。

接下來是插件啟動Activity的流程:

Android插件化的一種實現

該步驟主要是用宿主的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的類圖:

Android插件化的一種實現

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

Android插件化的一種實現

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

Android插件化的一種實現

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!