插件化研究之資源沖突

最近在研究Android應(yīng)用的插件化開(kāi)發(fā), 插件化都是在解決以下幾個(gè)問(wèn)題:

本章我們來(lái)研究最后一個(gè)問(wèn)題:資源共享與沖突。在《Android應(yīng)用程序插件化研究之AssertManager》中,我們實(shí)現(xiàn)了加載插件apk中資源問(wèn)題,實(shí)際上我們是單獨(dú)創(chuàng)建了用于訪問(wèn)插件資源的AssertManager和Resource對(duì)象,即,插件獨(dú)立使用一個(gè)資源管理器,這樣插件宿主之間無(wú)法共享資源。

資源共享

如果需要宿主、插件之間使用同一套資源管理器,那么我們需要將插件的資源路徑添加到宿主的AssetManager中。

我們知道,apk包括代碼和資源,在apk編譯過(guò)程中,dex工具將代碼打包成.dex文件,資源文件會(huì)由aapt工具生成對(duì)應(yīng)的ID,aapt在打包的時(shí)候組織成resources.arsc文件(詳細(xì)參考: Android應(yīng)用程序資源的編譯和打包過(guò)程分析),resources.arsc文件是用來(lái)描述資源ID和資源位置配置信息,從18個(gè)維度描述了一個(gè)資源ID的配置信息(語(yǔ)言、分辨率等),就是資源ID和資源的索引表。資源的ID生成是有規(guī)則的,規(guī)則:0xPPTTNNNN,由8位16進(jìn)制組成,其中:
PP段:表示資源的包空間:0x01表示系統(tǒng)資源空間,0x7f表示應(yīng)用資源空間。
TT段:表示資源類(lèi)型。
NNNN段:4個(gè)16進(jìn)制表示資源id,一個(gè)apk中同一類(lèi)型資源從0000開(kāi)始遞增。
例如:

nt anim pop_dialog_in 0x7f040000
int anim pop_dialog_out 0x7f040001
int anim slide_left_in 0x7f040002
int anim slide_left_out 0x7f040003
int anim slide_right_in 0x7f040004
int anim slide_right_out 0x7f040005
int anim update_loading_progressbar_anim 0x7f040006
int array indicator_tab_icon 0x7f050001
int array indicator_tab_titlt 0x7f050000

現(xiàn)在問(wèn)題來(lái)了,宿主apk和插件apk是獨(dú)立編譯出來(lái)的兩個(gè)獨(dú)立的apk,那么其中就有資源ID相同的情況出現(xiàn),從而產(chǎn)生資源ID沖突。如何解決這個(gè)問(wèn)題?看了一些開(kāi)源框架,解決的辦法就是修改資源ID的PP段,大體有兩種做法:

修改aapt源碼,定制aapt工具編譯期間修改PP段。

DynamicAPK的做法就是如此,定制aapt,替換google的原始aapt,在編譯的時(shí)候可以傳入?yún)?shù)修改PP段:例如傳入0x05編譯得到的資源的PP段就是0x05。個(gè)人覺(jué)得這個(gè)做法不是太靈活,入侵了原有的開(kāi)發(fā)編譯流程,不好維護(hù)。

修改aapt的產(chǎn)物,即,編譯后期重新整理插件Apk的資源,編排ID。

前面說(shuō)過(guò)apk編譯之后會(huì)生成ID以及對(duì)應(yīng)的索引表resorce.arsc,那么我們能不能后期修改相關(guān)ID及索引表呢?答案是肯定的,個(gè)人比較贊同這種思路,不用入侵原有編譯流程。

結(jié)尾

插件系列文章到此結(jié)束了,如果你從第一章開(kāi)始看到此處,你應(yīng)該明白插件化要解決的問(wèn)題、實(shí)現(xiàn)的思路、要掌握的技術(shù),如果你理解完這5篇文章,你應(yīng)該有能力寫(xiě)出一個(gè)簡(jiǎn)單的插件方案了。文章重在點(diǎn)明思路,實(shí)踐才是最重要的,關(guān)于實(shí)踐我們要做的還有很多很多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容