android插件框架机制的选择,Android插件开发初探——基础篇
Android插件開發初探
對于Android的插件化其實已經討論已久了,但是市面上還沒有非常靠譜成熟的插件框架供我們使用。這里我們就嘗試性的對比一下Java中,我們使用插件化該是一個怎么樣的流程,且我們如何將此流程移植到Android框架上去使用。很多代碼都是內部資料,不喜勿噴,謝謝~
為什么要插件化?
功能越來越多
代碼、安裝包越來越大
小的更新也需要重新發布
更新頻繁,安裝成本太大
用戶無法選擇性加載需要的模塊
……
插件化的好處
主安裝包較小
強制模塊化,降低耦合度
減少整體更新的次數
插件可單獨靜默更新
用戶可以有所選擇
……
插件化的要求
沒有獨立運行的入口
主應用控制,下載、安裝、刪除、靜默升級、打開和關閉
主應用和插件資源共享
安裝包的組成
需要安裝的插件
對比一個安裝包的組成,我們要處理的東西也就是很多:
主應用可以以Intent方式啟動具體的插件,同時帶入Map類型參數或者json串參數
使用相同的android:sharedUserId,資源數據共享
根據sharedUserId來查找插件
queryIntentActivities查找符合這個action的所有activity(或其它)即插件
query方式可以獲得插件的路徑以及實現接口類的類名
通過檢索sharedUserId能夠得到路徑卻無法獲得到類名
通常可以使用一個描述文件(xml、json)描述插件結構
createPackageContext()
getResourcesForApplication()
動態加載普通類
- Java 可以用 ClassLoader 動態加載.jar 中的Class文件,android可以嗎?
- PathClassLoader
- DexClassLoader
接口類
package com.plug;
public interface InterfacePlug {
public String function_01();
public int function_02(int a,int b);
}
實現類
import com.plug.InterfacePlug;
public class PlugImpl implements InterfacePlug{
@Override
public String function_01() {
return null;
}
@Override
public int function_02(int a, int b) {
return a+b;
}
}
主應用類
package com.host;
public class MyhostActivity extends Activity {
public void useDexClassLoader() {
DexClassLoader cDexClassLoader =
new DexClassLoader("/mnt/sdcard/Myplugdex.jar", "/data/data/com.host", null, this.getClass()
.getClassLoader());
try {
Class> class1 = cDexClassLoader.loadClass("com.plug.PlugImpl");
InterfacePlug interfacePlug = (InterfacePlug) class1.newInstance();
int ret = interfacePlug.function_02(12, 13);
tv.setText(" return value :" + ret);
} catch (Exception e) {
}
}
}
導出插件包時只能導出實現類,否則會出現
Classref in pre-verified class resolvedtounexpected implementation
重復定義錯誤
當然,安裝包的解析與插件安裝遠不止于類文件的加載,我們還需要:
不是普通類怎么辦?
系統組件如何接收回調?
如何加載資源?
PackageInfo處理?
Resources的處理?
Assets的處理?
動態加載系統組件和資源
PluginLib
PluginHost
PluginTest
我們一個簡單的插件框架就如下圖所示:
主應用列出安裝的Plugins,點擊啟動對應的PluginActivity
當然,我們也可以根據此簡單的機制來完成一個完整的插件系統。
可以基本完整實現一個Activity
可以繼續增加其他組件的插件,完成更多的功能(Service,Receiver,ContentProvider,Application?)
此插件機制的缺點
Manifest中注冊的信息由系統控制,因此插件需要權限信息需要預先注冊在主程序中。
目前實現有一定的限制,如插件宿主的相互調用、插件間的相互調用
Github上的插件框架,基于Fragment的開源插件框架
/*
* @author zhoushengtao(周圣韜)
* @since 2015年1月27日 上午14:02:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流學習QQ群:341989536
* @私人QQ:445914891
/
總結
以上是生活随笔為你收集整理的android插件框架机制的选择,Android插件开发初探——基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android触摸外部关闭键盘,如何隐藏
- 下一篇: android 内嵌地图,Android