一種加載插件的方法、裝置和移動(dòng)終端的制作方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體涉及一種加載插件的方法、裝置和移動(dòng)終端。
【背景技術(shù)】
[0002] 目前,Android(安卓)操作系統(tǒng)在移動(dòng)終端領(lǐng)域得到了廣泛的應(yīng)用,大量的手機(jī)、 平板電腦采用Android操作系統(tǒng)。Android操作系統(tǒng)采用Linux內(nèi)核,由于Linux內(nèi)核的安 全機(jī)制,再加上Android操作系統(tǒng)的dalvik的特殊機(jī)制,Android操作系統(tǒng)中的應(yīng)用程序 很難進(jìn)行擴(kuò)展。
[0003] 在Android操作系統(tǒng)下,應(yīng)用程序的apk被安裝到操作系統(tǒng)中后,就很難進(jìn)行擴(kuò) 展。對(duì)應(yīng)用程序中進(jìn)行微小的升級(jí),都需要重新對(duì)代碼進(jìn)行打包,用戶需再次使用新的apk 進(jìn)行安裝,從而使得在Android系統(tǒng)中的應(yīng)用程序不那么靈活。
[0004] 近來出現(xiàn)了插件機(jī)制,將應(yīng)用的功能劃分模塊,每個(gè)模塊對(duì)應(yīng)于一個(gè)插件集中在 一個(gè)apk中。有了這種插件機(jī)制,在對(duì)應(yīng)用程序進(jìn)行拓展或升級(jí)時(shí),只需要改動(dòng)相應(yīng)的插件 即可。
[0005] 目前,Android操作系統(tǒng)下通過DexClassLoader來實(shí)現(xiàn)對(duì)插件的加載。但是,通常 情況下,一個(gè)插件由類、資源等部分組成,插件的資源可包括其界面圖片、背景音樂等內(nèi)容, 而DexClassLoader只能實(shí)現(xiàn)對(duì)插件的類的加載,卻不能實(shí)現(xiàn)對(duì)插件的資源的加載,會(huì)導(dǎo)致 插件加載后顯示錯(cuò)誤、無法完全顯示等問題。
【發(fā)明內(nèi)容】
[0006] 鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上 述問題的一種加載插件的方法、相應(yīng)地裝置和移動(dòng)終端。
[0007] 依據(jù)本發(fā)明的一個(gè)方面,提供一種加載插件的方法,包括:
[0008] 當(dāng)插件被觸發(fā)時(shí),獲取所述插件的資源;
[0009] 新建所述插件的上下文context,并將操作系統(tǒng)預(yù)先為所述插件的主應(yīng)用的分配 的context替換為所述插件的context,其中所述插件的context指向所述插件的資源;
[0010] 所述主應(yīng)用根據(jù)被替換后的context加載所述插件的資源,其中,所述被替換后 的context為所述插件的context。
[0011] 可選地,在獲取所述插件的資源之前,還包括:
[0012] 獲取所述插件的安裝包存檔信息。
[0013] 可選地,所述獲取所述插件的安裝包存檔信息,包括:
[0014] 獲取所述插件的PackageManager對(duì)象;
[0015] 根據(jù)所述PackageManager對(duì)象獲取所述插件的安裝包存檔信息;
[0016] 將所述安裝包存檔信息下的預(yù)設(shè)變量修改為預(yù)設(shè)路徑;
[0017] 其中,所述預(yù)設(shè)路徑為所述插件的存儲(chǔ)路徑。
[0018] 可選地,在新建所述插件的context之前,所述方法還包括:
[0019] 新建所述插件的DexClassLoader類;
[0020] 其中,所述DexClassLoader類用來傳遞所述插件的可執(zhí)行代碼路徑。
[0021] 可選地,所述新建所述插件的上下文context,并將操作系統(tǒng)預(yù)先為所述插件的主 應(yīng)用的分配的context替換為所述插件的context,包括:
[0022] 為所述插件建立繼承自ContextThemeWrapper類的context ;
[0023] 重寫用于加載所述插件的資源和可執(zhí)行代碼的方法函數(shù),在所述重寫后的函數(shù)中 返回所述插件的context。
[0024] 可選地,所述用于加載所述插件的資源和可執(zhí)行代碼的方法函數(shù),包括:
[0025] getClassLoader、getResources 和 getAssets〇
[0026] 可選地,在所述插件被觸發(fā)前或所述插件被觸發(fā)時(shí),所述方法還包括:
[0027] 判斷所述插件是否可用;
[0028] 當(dāng)所述插件不可用時(shí),向服務(wù)器發(fā)送獲取插件列表的請(qǐng)求;其中,所述插件列表中 保存有所述主應(yīng)用所包括的插件的插件名稱、插件版本、插件的數(shù)字摘要值以及插件的下 載地址。
[0029] 接收發(fā)送的所述插件列表;
[0030] 根據(jù)所述插件列表中所述插件的下載地址下載新版本的插件。
[0031] 可選地,所述根據(jù)所述插件列表中所述插件的下載地址下載新版本的插件之后, 所述方法還包括:
[0032] 驗(yàn)證下載得到的新版本的插件的數(shù)字摘要值與插件列表中保存的摘要值是否相 同,當(dāng)相同時(shí),執(zhí)行所述獲取所述插件的資源的步驟。
[0033] 可選地,所述方法還包括;
[0034] 替換操作系統(tǒng)的ClassLoader對(duì)象為所述主應(yīng)用自定義的ClassLoader對(duì)象;
[0035] 其中,所述自定義的ClassLoader對(duì)象用于實(shí)現(xiàn)所述插件的加載。
[0036] 依據(jù)本發(fā)明的另一個(gè)方面,提供一種加載插件的裝置,包括:
[0037] 資源獲取模塊,適于當(dāng)插件被觸發(fā)時(shí),獲取所述插件的資源;
[0038] 第一建立模塊,適于新建所述插件的上下文context,并將操作系統(tǒng)預(yù)先為所述插 件的主應(yīng)用的分配的context替換為所述插件的context,其中所述插件的context指向所 述插件的資源;
[0039] 加載模塊,適于所述主應(yīng)用根據(jù)被替換后的context加載所述插件的資源,其中, 所述被替換后的context為所述插件的context。
[0040] 可選地,所述裝置還包括:
[0041] 信息獲取模塊,適于在獲取所述插件的資源之前,獲取所述插件的安裝包存檔信 息。
[0042] 可選地,所述信息獲取模塊,包括:
[0043] 對(duì)象獲取單元,適于獲取所述插件的PackageManager對(duì)象;
[0044] 信息獲取單元,適于根據(jù)所述PackageManager對(duì)象獲取所述插件的安裝包存檔 信息;
[0045] 變量修改單元,適于將所述安裝包存檔信息下的預(yù)設(shè)變量修改為預(yù)設(shè)路徑;
[0046] 其中,所述預(yù)設(shè)路徑為所述插件的存儲(chǔ)路徑。
[0047] 可選地,所述裝置還包括:
[0048] 第二建立模塊,適于在新建所述插件的context之前,新建所述插件的 DexClassLoader 類;
[0049] 其中,所述DexClassLoader類用來傳遞所述插件的可執(zhí)行代碼路徑。
[0050] 可選地,所述第一建立模塊包括:
[0051 ] 上下文建立單元,適于為所述插件建立繼承自ContextThemeWrapper類的 context ;
[0052] 重寫單元,適于重寫用于加載所述插件的資源和可執(zhí)行代碼的方法函數(shù),在所述 重寫后的函數(shù)中返回所述插件的context。
[0053] 可選地,所述用于加載所述插件的資源和可執(zhí)行代碼的方法函數(shù),包括:
[0054] getClassLoader、getResources 和 getAssets〇
[0055] 可選地,所述裝置還包括:插件下載模塊;
[0056] 所述插件下載模塊包括:
[0057] 可用判斷單元,適于在所述插件被觸發(fā)前或所述插件被觸發(fā)時(shí),判斷所述插件是 否可用;
[0058] 請(qǐng)求發(fā)送單元,適于當(dāng)所述插件不可用時(shí),向服務(wù)器發(fā)送獲取插件列表的請(qǐng)求;其 中,所述插件列表中保存有所述主應(yīng)用所包括的插件的插件名稱、插件版本、插件的數(shù)字摘 要值以及插件的下載地址。
[0059] 列表接收單元,適于接收發(fā)送的所述插件列表;
[0060] 插件下載單元,適于根據(jù)所述插件列表中所述插件的下載地址下載新版本的插 件。
[0061] 可選地,所述裝置還包括:
[0062] 驗(yàn)證模塊,適于在根據(jù)所述插件列表中所述插件的下載地址下載新版本的插件之 后,驗(yàn)證下載得到的新版本的插件的數(shù)字摘要值與插件列表中保存的摘要值是否相同,當(dāng) 相同時(shí),執(zhí)行所述獲取所述插件的資源的步驟。
[0063] 可選地,所述裝置還包括;
[0064] 入口實(shí)現(xiàn)模塊,適于替換操作系統(tǒng)的ClassLoader對(duì)象為所述主應(yīng)用自定義的 ClassLoader 對(duì)象;
[0065] 其中,所述自定義的ClassLoader對(duì)象用于實(shí)現(xiàn)所述插件的加載。
[0066] 依據(jù)本發(fā)明的另一個(gè)方面,提供一種移動(dòng)終端,所述移動(dòng)終端包括:
[0067] 存儲(chǔ)器;
[0068] 一個(gè)或多個(gè)處理器;
[0069] 其中,所述一個(gè)或多個(gè)處理器被配置為執(zhí)行如下方法:
[0070] 當(dāng)插件被觸發(fā)時(shí),獲取所述插件的資源;
[0071] 新建所述插件的上下文context,并將操作系統(tǒng)預(yù)先為所述插件的主應(yīng)用的分配 的context替換為所述插件的context,其中所述插件的context指向所述插件的資源;
[0072] 所述主應(yīng)用根據(jù)被替換后的context加載所述插件的資源,其中,所述被替換后 的context為所述插件的context。
[0073] 本發(fā)明實(shí)施例提供了一種加載插件的方法、裝置和移動(dòng)終端,通過當(dāng)插件被觸發(fā) 時(shí),獲取插件的資源,新建插件的context,并將操作系統(tǒng)預(yù)先為插件的主應(yīng)用的分配的 context替換為插件的context,根據(jù)被替換后的context加載插件的資源,可以解決在 Android原生系統(tǒng)下由于不能獲取插件context導(dǎo)致的不能加載插件的資源的問題,并且 該方法對(duì)系統(tǒng)生成的其他對(duì)象沒有影響,不會(huì)導(dǎo)致兼容性問題,即使系統(tǒng)發(fā)生了演進(jìn),插件 仍然能夠正確加載。
[0074] 上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段, 而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠 更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】。
[0075] 根據(jù)下文結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例的詳細(xì)描述,本領(lǐng)域技術(shù)人員將會(huì)更加明 了本發(fā)明的上述以及其他目的、優(yōu)點(diǎn)和特征。
【附