Android R文件生成規則及項目集成第三方aar包須要注意的事項

在Android中資源的使用幾乎無處不在,layout、string、drawable、raw、style、theme等等都是。
這些資源會在編譯過程當中被打包進APK中(res文件夾)或者被打包成獨立的資源APK包(好比framework-res.apk)。
可是這些資源都會被賦予 獨一無二的ID即資源索引來方便系統訪問。
這些資源索引由Android的工具AAPT(Android Asset Packing Tool)生成的八位十六進制整數型。
中間 02 所在位置值表明資源ID對應的資源的類型,分別是:
02:drawable
03:layout
04:values
05:xml
06:raw
07:color
08:menu
分配resource id的主要邏輯實現是在framework/base/tools/aapt/Resource.cpp 和 ResourceTable.cpp。
如今以Demo爲例
資源ID 是一個32bit的數字,格式是PPTTNNNN , PP表明資源所屬的包(package) ,TT表明資源的類型(type),NNNN表明這個類型下面的資源的名稱。 對於應用程序的資源來講,PP的取值是0×77。
TT 和NNNN 的取值是由AAPT工具隨意指定的–基本上每一種新的資源類型的數字都是從上一個數字累加的(從1開始);而每個新的資源條目也是從數字1開始向上累加的。
注意的是,AAPT在每一次編譯的時候不會去保存上一次生成的資源ID標示,每當/res目錄發生變化的時候,AAPT可能會去從新給資源指定ID號,而後從新生成一個R.java文件。所以,在作開發的時候,你不該該在程序中將資源ID持久化保存到文件或者數據庫。而資源ID在每一次編譯後都有可能變化。
一旦資源被編譯成二進制文件的時候,AAPT會生成R.java 文件和「resources.arsc」文件,「R.java」用於代碼的編譯,而」resources.arsc」則包含了所有的資源名稱、資源ID和資源的內容(對於單獨文件類型的資源,這個內容表明的是這個文件在其.apk 文件中的路徑信息)。這樣就把運行環境中的資源ID 和具體的資源對應起來了。

對於集成第三方aar包,首先得明白一點,打出來的aar包中是不帶R文件的,aar中的資源文件是隨着主工程的編譯而生成的,例如項目A引用了兩個aar,分別爲resOne和resTwo,當項目編譯完後,R文件的目錄結構如圖所示:
這兩個R文件中放的就是resOne和resTwo兩個lib的資源文件ID,測試過程當中,將兩個moudle中activity的layout名稱統一命名爲main_activity_one,那麼在R中文件中資源ID都爲


當喚起其中一個activity時,就會報


標識資源文件ID已經生成了一次,當啓動某個acitity時,主端會去找另一個相同資源ID的layout,從而致使其中的控件沒法找到。
  1. 項目中資源ID名字在相同的資源類型中不能命名相同
  2. 集成進來的第三方aar資源文件,命名不能相同
  3. 項目中禁止命名和系統資源名稱相同的資源
相關文章
相關標籤/搜索