]另外,還可以首先判斷插件中是否包含插件資源,如果是,則將插件資源的路徑信息注入上述的資源模塊;否則,無(wú)需注入。以Android操作系統(tǒng)為例,插件在編譯打包后形成一個(gè)apk包,如果插件中包含插件資源,則apk包中會(huì)有arse文件。對(duì)于apk包中不包含arse文件的插件,無(wú)需也不能執(zhí)行資源注入。
[0051]對(duì)applicat1n、activity 和 service 基類中的 getResources 接口進(jìn)行重寫(xiě),使getResources接口能夠返回資源模塊中執(zhí)行過(guò)注入后的資源對(duì)象。
[0052]在102中,遍歷插件所引用的資源,依據(jù)資源前綴信息從資源模塊所指向的資源對(duì)象集合中調(diào)用插件所引用的資源。在本發(fā)明實(shí)施例中,由于資源模塊統(tǒng)一維護(hù)有插件資源和容器資源,因此資源模塊所指向的資源對(duì)象集合中既包含容器資源也包含插件資源,插件執(zhí)行過(guò)程中調(diào)用資源時(shí),統(tǒng)一從該資源對(duì)象集合中對(duì)資源進(jìn)行調(diào)用,即對(duì)插件資源和容器資源進(jìn)行的是無(wú)差別調(diào)用,實(shí)現(xiàn)了資源的透明調(diào)用。
[0053]另外,由于資源模塊所指向的資源對(duì)象集合中既包含容器資源也包含插件資源,因此需要對(duì)插件資源和容器資源進(jìn)行區(qū)分,保證插件資源和容器資源的標(biāo)識(shí)唯一。對(duì)于諸如Android操作系統(tǒng)等,其現(xiàn)有機(jī)制是除了系統(tǒng)資源之外的所有應(yīng)用的資源,都統(tǒng)一指定資源標(biāo)識(shí)為0x7f,使得容器資源和插件資源在標(biāo)識(shí)上發(fā)生沖突,即并不能具體區(qū)分是容器資源還是插件資源。針對(duì)這種情況,本發(fā)明實(shí)施例中,在插件源碼中全局的應(yīng)用配置文件(諸如AndroidManifest.xml)中,增加與applicat1n同級(jí)的節(jié)點(diǎn),例如增加節(jié)點(diǎn)〈package-1d android: value = “I” >,該節(jié)點(diǎn)是資源前綴信息,用于對(duì)資源進(jìn)行標(biāo)識(shí)。不同插件對(duì)應(yīng)不同的資源前綴信息,且插件與容器對(duì)應(yīng)不同的資源前綴信息。仍以節(jié)點(diǎn)〈package-1d android:value = “1”>為例,其中值取1,可以代表0x7d,當(dāng)值取2時(shí),可以代表0x7e,諸如此類,依次往后取值來(lái)為資源分配資源前綴信息,不再?gòu)?qiáng)制指定0X7f為除了系統(tǒng)資源之外的其他資源的標(biāo)識(shí)。
[0054]相應(yīng)地,在對(duì)插件進(jìn)行編譯打包的階段,讀取應(yīng)用配置文件中的資源前綴信息,依據(jù)該資源前綴信息對(duì)插件進(jìn)行編譯打包。這樣,在插件加載過(guò)程中,需要加載插件所引用的具體資源時(shí),能夠依據(jù)資源前綴信息從資源模塊所指向的資源對(duì)象集合中查找到對(duì)應(yīng)的資源,并進(jìn)行調(diào)用。
[0055]另外,在對(duì)插件進(jìn)行編譯打包的過(guò)程中,如果確定插件引用容器資源,則可能會(huì)因?yàn)檎也坏劫Y源而無(wú)法編譯通過(guò)。針對(duì)這種情況,在本發(fā)明實(shí)施例中可以在插件源碼中資源路徑下指定依賴包包名。例如,在Android操作系統(tǒng)中,插件源碼以“-1+資源路徑信息”的形式定義資源路徑,在本發(fā)明實(shí)施例中,可以在該路徑下增加一個(gè)參數(shù)“-rely-app-package”來(lái)指定依賴包包名,所謂依賴包就是插件所引用的容器資源包。相應(yīng)地,在對(duì)插件進(jìn)行編譯打包時(shí),根據(jù)插件源碼中的依賴包包名,查找插件所引用的容器資源,從而保證插件所引用的資源都能夠找到,編譯能夠順利進(jìn)行。
[0056]需要說(shuō)明的是,在對(duì)插件進(jìn)行編譯打包的過(guò)程中,插件所引用的資源信息可以從插件的布局文件中獲取。插件所引用的資源類型可以包括但不限于:string(字符串)類、color (顏色)類、xml (可擴(kuò)展標(biāo)記語(yǔ)言)類等。插件所引用的資源可以是自身的插件資源,也可以是容器資源,甚至可以是同一應(yīng)用中其他插件資源。例如,在插件布局文件中存在android: text = “@string/net_error”,其中所引用的資源net_error如果是定義在容器中的,那么就引用了容器資源。
[0057]在對(duì)插件進(jìn)行編譯打包時(shí),除了對(duì)靜態(tài)資源進(jìn)行編譯之外,還會(huì)進(jìn)行java代碼的編譯以生成資源索引文件(即R類文件)。在對(duì)插件資源進(jìn)行編譯打包后,生成插件R類文件,該插件R類文件僅包含插件資源,如果插件的java代碼中引用容器的資源,則無(wú)法編譯通過(guò)。針對(duì)這種情況,在本發(fā)明實(shí)施例中,在對(duì)插件資源進(jìn)行編譯,生成插件R類文件后,將插件R類文件和容器R類文件進(jìn)行合并,這樣插件R類文件中就包含插件資源以及該插件所引用的容器資源的索引,從而保證插件的java代碼能夠正確編譯。
[0058]以上是對(duì)本發(fā)明所提供的方法進(jìn)行的詳細(xì)描述,下面對(duì)本發(fā)明提供的裝置進(jìn)行詳細(xì)描述。
[0059]圖2為本發(fā)明實(shí)施例提供的裝置結(jié)構(gòu)圖,如圖2中所示,該裝置可以包括:資源注入單元01和資源調(diào)用單元02,還可以進(jìn)一步包括第一判斷單元03、第二判斷單元04、前綴讀取單元05、資源查找單元06和文件合并單元07。各組成單元的主要功能如下:
[0060]加載插件時(shí),資源注入單元01負(fù)責(zé)將插件資源的路徑信息注入包含容器資源的路徑信息的資源模塊。
[0061]資源模塊主要用于維護(hù)資源路徑信息,每個(gè)插件在加載時(shí),將自身的插件資源的路徑信息注入資源模塊,該資源模塊中同時(shí)包含容器資源的路徑信息。也就是說(shuō),將插件資源的路徑信息和容器資源的路徑信息進(jìn)行融合,在同一個(gè)資源模塊中維護(hù)。
[0062]具體地,資源注入單元01可以采用但不限于以下兩種方式進(jìn)行資源注入:
[0063]第一種方式:通過(guò)反射調(diào)用機(jī)制,將插件資源的路徑信息添加至容器的資源模塊,該資源模塊包含容器資源的路徑信息。這種方式適用于操作系統(tǒng)的底層支持資源動(dòng)態(tài)添加的情況,諸如Android5.0之后的操作系統(tǒng)。
[0064]第二種方式:創(chuàng)建插件的資源模塊,通過(guò)反射調(diào)用機(jī)制,將插件資源的路徑信息和容器資源的路徑信息添加至插件的資源模塊。這種情況適用于操作系統(tǒng)的底層不支持資源動(dòng)態(tài)添加的情況,諸如Android5.0之前的操作系統(tǒng)。這種范式中創(chuàng)建的資源模塊可以是針對(duì)所有插件統(tǒng)一的資源模塊,即所有插件共享一個(gè)資源模塊。
[0065]更進(jìn)一步地,在資源注入單元01將插件資源的路徑信息注入資源模塊之前,可以由第一判斷單元03判斷上述的資源模塊中是否已經(jīng)存在插件資源的路徑信息,如果否,則觸發(fā)資源注入單元01執(zhí)行將插件資源的路徑信息注入包含容器資源的路徑信息的資源模塊的操作;如果是,則不需要重復(fù)注入。
[0066]更進(jìn)一步地,在資源注入單元01將插件資源的路徑信息注入資源模塊之前,可以由第二判斷單元04判斷插件是否包含插件資源,如果是,則觸發(fā)資源注入單元01執(zhí)行將插件資源的路徑信息注入包含容器資源的路徑信息的資源模塊的操作;否則可以不觸發(fā)或者禁止資源注入單元01執(zhí)行所述注入的處理。
[0067]上述第一判斷單元03和第二判斷單元04可以擇一存在,也可以同時(shí)存在。同時(shí)存在時(shí),可以同時(shí)執(zhí)行判斷的操作,也可以順次執(zhí)行判斷的操作。當(dāng)同時(shí)執(zhí)行判斷的操作時(shí),只有第一判斷單元03和第二判斷單元04的判斷結(jié)果都滿足觸發(fā)資源注入單元04的條件時(shí),才會(huì)觸發(fā)資源注入單元01執(zhí)行資源注入。當(dāng)順次執(zhí)行判斷的操作時(shí),在圖2中以第一判斷單元03和第二判斷單元04順次執(zhí)行判斷操作為例,第一判斷單元03的判斷結(jié)果為否時(shí),第二判斷單元04執(zhí)行判斷,當(dāng)?shù)诙袛鄦卧?4的判斷結(jié)果為是時(shí),才觸發(fā)資源注入單元01執(zhí)行資源注入。
[0068]資源調(diào)用單元02負(fù)責(zé)遍歷插件所引用的資源,依據(jù)資源前綴信息從資源模塊所指向的資源對(duì)象集合中調(diào)用該插件所引用的資源。
[0069]另外,由于資源模塊所指向的資源對(duì)象集合中既包含容器資源也包含插件資源,因此需要對(duì)插件資源和容器資源進(jìn)行區(qū)分,保證插件資源和容器資源的標(biāo)識(shí)唯一。對(duì)于諸如Android操作系統(tǒng)等,其現(xiàn)有機(jī)制是除了系統(tǒng)資源之外的所有應(yīng)用的資源,都統(tǒng)一指定資源標(biāo)識(shí)為0x7f,使得容器資源和插件資源在標(biāo)識(shí)上發(fā)生沖突,即并不能具體區(qū)分是容器資源還是插件資源。本發(fā)明實(shí)施例中,在插件源碼中全局的應(yīng)用配置文件(諸如AndroidManifest.xml)中,增加與applicat1n同級(jí)的節(jié)點(diǎn),例如增加節(jié)點(diǎn)〈package-1dandroid:value =“ 1”>,該節(jié)點(diǎn)是資源前綴信息,用于對(duì)資源進(jìn)行標(biāo)識(shí)。不同插件對(duì)應(yīng)不同的資源前綴