結合動態加載系列文章的分析,如今開始設計並開發一個Android的插件化框架,命名爲Frontia。Frontia有「前端」的意思,寓意着Android插件能像前端開發那樣動態發版,同時,這一詞出自Macross動畫系列,有「繁星」的意思,「咱們的征途是星辰大海 KIRA!!(<ゝω·)☆」。前端
Frontia是一個Android的插件化框架(基於ClassLoader的動態加載技術),相比其餘開源項目,Frontia 的特色是擴展性強,更加專一於插件的下載、更新、安裝、管理,以及插件和宿主之間的交互。在深刻介紹Frontia以前,咱們先想一想開發一個插件化框架須要考慮的問題有哪些。android
如今的插件化需求有許多花樣,首先,有的只須要將一些特定的類(或者接口的實現類)插件化,好比一些遊戲的SDK,須要把登陸功能和支付功能的實現插件化,這樣SDK就能實現動態升級。其次,有一些業務須要將so庫給作成插件化,由於一些so庫須要同時內置多個CPU類型(x86/arm64等)的版本,因此會佔用很是可觀的體積,若是這些so庫並非核心的業務,徹底能夠作成插件,等到須要的時候再動態加載。再則,也有一些相對獨立的業務須要獨立升級,而不但願隨着APP一塊兒發版。好比「遊戲廣場」這樣的一個業務,APP只提供一個入口啓動遊戲廣場,啓動後接下來就無論了,這樣的業務能夠作成插件,插件能夠動態升級(遊戲廣場能夠自由設計本身的界面,甚至增長新的頁面),也能夠在多個APP之間使用同一插件業務(許多APP都有遊戲廣場的推廣業務)。git
考慮到種種需求,咱們的插件有時只須要加載一些普通的類,有時候須要加載res資源,有時候須要加載so庫,有時候須要加載新的組件類(Activity、Service等)甚至調用宿主APP的某些功能(好比獲取用戶帳號信息)。所以,咱們的插件化框架在處理插件加載的具體過程時,應該可以靈活地擴展,以知足以上以及未來的各類插件需求。github
除了處理插件的加載問題外,插件化框架還須要處理插件的更新問題,要否則插件化開發就沒有意義了。加載插件前,咱們須要從服務器下載插件,或者判斷是否須要從服務器下載新的插件版本,下載新版本插件失敗的時候,咱們有又須要判斷本地是否有可用的舊版本。所以,插件化框架須要提供一個完善的插件更新策略,以從服務器的插件版本列表和本地的緩存插件版本列表中,挑選出最佳的插件版本(目標插件)。緩存
當咱們插件的某個版本出現嚴重問題的時候,咱們但願全部的下載過這個版本的插件的APP都要拋棄這個插件,因此插件化框架須要有「及時吊銷」功能。當咱們插件的最新版本更新了某些重要的功能,咱們但願全部的APP都馬上升級到這個插件版本,若是下載最新版本插件失敗,須要從新下載或者直接拋棄插件,而不能使用舊版本的插件,也就是說框架須要「強制升級」功能。安全
同一個版本的插件只須要下載一次就能夠了,不能重複下載。插件化框架須要將下載下來的插件須要存放到指定的目錄(咱們能夠把這個過程看成是「安裝插件」),以便於知道當前APP已經安裝了哪些插件,以及這些插件有哪些版本,這樣咱們才能夠判斷需不須要從服務器下載新版本的插件。服務器
同時,存放在本地文件系統上的插件是不安全的,可能被其餘人惡意修改,但插件被加載進宿主APP後,它就是APP程序的一部分,能夠訪問APP的全部內存數據,插件化框架還須要提供對本地已安裝插件的安全校驗功能。框架
上面談到的問題大體能夠歸類成插件的更新、安裝以及加載問題,這些都是插件化框架應該解決的基本問題。固然除了這些問題以外,在將插件化開發引入實際生產的項目中的時候,還有一些問題不得不考慮,好比在開發插件的時候如何快捷地調試和構建插件,當插件出現BUG的時候如何快速定位問題(由於一個插件的BUG多是由「具體的設備型號 + 具體的宿主APP版本號 + 具體的插件版本號」致使的,這也是插件化開發的詬病,儘可能不要吧頻繁變更的業務插件化),如何作好數據上報統計以評估插件的工做效果,固然,必不可少的,咱們還須要一個可靠的服務器來託管咱們插件(理想的情景是,咱們調試完把代碼推到構建系統,構建系統構建完把插件入庫並把插件的版本信息上傳到服務器,服務器更新新插件版本的可用信息,整個過程不須要手動操做)。工具
相似以前談到的Android動態加載技術須要解決的兩個主要問題,插件化開發投入生產須要解決的問題大體可概括以下:動畫
插件的更新、安裝、加載策略;
插件的安全性校驗;
插件與宿主的通信(互調)方式,甚至插件間互相調用的方式;
插件調試和構建的方法;
出現BUG時定位問題的方法;
插件數據統計;
插件託管的服務器(插件的持續集成);
一言以蔽之,插件化開發不只僅須要解決一個開發框架的問題,從總體上來看更像是須要解決一個開發平臺的問題,除了解決代碼的問題(粗體部分),還需解決生產工具或者效率的問題。
Frontia項目致力於解決以上問題,最後,放上項目的地址:android-frontia 。