插件化的框架很多很多,比如360開源的DroidPlugin, 但是有時候用戶不能接受第三方的庫,尤其是他們<覺得>有風(fēng)險的庫,就不得不自己實現(xiàn)簡單動態(tài)加載方法。
需求
1.提供A和B jar包,B是從服務(wù)器上download下來,可替換
2.A包定義一個接口InterfaceA和實現(xiàn)類InterfaceAImpl,App基于InterfaceA寫業(yè)務(wù)代碼
方案
- A包的InterfaceImpl的構(gòu)造函數(shù)接收B.jar的路徑,并通過DexclassLoader去加載B.jar
- 加載之后,通過findClass和findMethod的方式去調(diào)用B.jar的類和函數(shù)
實際上,InterfaceImpl的任何調(diào)用都是透傳到B.jar的
要解決的問題
主要的問題都集中在UI資源處理上,這是在大多數(shù)插件方案里面要解決的。
布局
布局全部用Java代碼實現(xiàn),復(fù)雜的布局拆分成空間,最大化復(fù)用。字符串資源及多語言
由于沒有ID了,字符串資源是放在xml里面,解析之后放在HashMap,通過Key-Value的方式去選擇顯示。多語言就是根據(jù)機型多個XML。圖片
放在asset下面解壓加載,好在圖片不多。so庫
so庫涉及業(yè)務(wù)的,為了能做到熱更新,放在B.jar的assets目錄下,運行的時候解壓到目錄,然后用System.load加載。這個地方主要要注意的是要根據(jù)CPU類型解壓對應(yīng)的so