日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android插件框架机制的选择,Android插件开发初探——基础篇

發(fā)布時間:2025/3/19 Android 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android插件框架机制的选择,Android插件开发初探——基础篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android插件開發(fā)初探

對于Android的插件化其實已經(jīng)討論已久了,但是市面上還沒有非常靠譜成熟的插件框架供我們使用。這里我們就嘗試性的對比一下Java中,我們使用插件化該是一個怎么樣的流程,且我們?nèi)绾螌⒋肆鞒桃浦驳紸ndroid框架上去使用。很多代碼都是內(nèi)部資料,不喜勿噴,謝謝~

為什么要插件化?

功能越來越多

代碼、安裝包越來越大

小的更新也需要重新發(fā)布

更新頻繁,安裝成本太大

用戶無法選擇性加載需要的模塊

……

插件化的好處

主安裝包較小

強制模塊化,降低耦合度

減少整體更新的次數(shù)

插件可單獨靜默更新

用戶可以有所選擇

……

插件化的要求

沒有獨立運行的入口

主應(yīng)用控制,下載、安裝、刪除、靜默升級、打開和關(guān)閉

主應(yīng)用和插件資源共享

安裝包的組成

需要安裝的插件

對比一個安裝包的組成,我們要處理的東西也就是很多:

主應(yīng)用可以以Intent方式啟動具體的插件,同時帶入Map類型參數(shù)或者json串參數(shù)

使用相同的android:sharedUserId,資源數(shù)據(jù)共享

根據(jù)sharedUserId來查找插件

queryIntentActivities查找符合這個action的所有activity(或其它)即插件

query方式可以獲得插件的路徑以及實現(xiàn)接口類的類名

通過檢索sharedUserId能夠得到路徑卻無法獲得到類名

通常可以使用一個描述文件(xml、json)描述插件結(jié)構(gòu)

createPackageContext()

getResourcesForApplication()

動態(tài)加載普通類

- Java 可以用 ClassLoader 動態(tài)加載.jar 中的Class文件,android可以嗎?

- PathClassLoader

- DexClassLoader

接口類

package com.plug;

public interface InterfacePlug {

public String function_01();

public int function_02(int a,int b);

}

實現(xiàn)類

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;

}

}

主應(yīng)用類

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) {

}

}

}

導(dǎo)出插件包時只能導(dǎo)出實現(xiàn)類,否則會出現(xiàn)

Classref in pre-verified class resolvedtounexpected implementation

重復(fù)定義錯誤

當然,安裝包的解析與插件安裝遠不止于類文件的加載,我們還需要:

不是普通類怎么辦?

系統(tǒng)組件如何接收回調(diào)?

如何加載資源?

PackageInfo處理?

Resources的處理?

Assets的處理?

動態(tài)加載系統(tǒng)組件和資源

PluginLib

PluginHost

PluginTest

我們一個簡單的插件框架就如下圖所示:

主應(yīng)用列出安裝的Plugins,點擊啟動對應(yīng)的PluginActivity

當然,我們也可以根據(jù)此簡單的機制來完成一個完整的插件系統(tǒng)。

可以基本完整實現(xiàn)一個Activity

可以繼續(xù)增加其他組件的插件,完成更多的功能(Service,Receiver,ContentProvider,Application?)

此插件機制的缺點

Manifest中注冊的信息由系統(tǒng)控制,因此插件需要權(quán)限信息需要預(yù)先注冊在主程序中。

目前實現(xiàn)有一定的限制,如插件宿主的相互調(diào)用、插件間的相互調(diào)用

Github上的插件框架,基于Fragment的開源插件框架

/*

* @author zhoushengtao(周圣韜)

* @since 2015年1月27日 上午14:02:22

* @weixin stchou_zst

* @blog http://blog.csdn.net/yzzst

* @交流學習QQ群:341989536

* @私人QQ:445914891

/

總結(jié)

以上是生活随笔為你收集整理的android插件框架机制的选择,Android插件开发初探——基础篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。