一、android的pulibc.xml文件
如果你用 apktoool 反編譯過 apk 就知道,反編譯后res/values 下有一個 public.xml 文件,內容如圖
這個東西有什么用呢?
先從如何使用資源 ID 開始,在開發中我們通常使用 Resources.getXXX(resid) 來獲取某個資源,傳入的是 ID 這個 ID 定義在 R.XXX 類里面,R 類是編譯器自動生成的,打開看知道
其實資源 ID 就是一個常量,對我們引用了某個ID,編譯成 APK 之后,這個ID的值就固定了,
而 apktool 在重新打包 apk 的時候會對資源重新編譯 (編譯成 resources.arsc 你有zip打開 apk 看得到),編譯資源的時候自然需要對所有資源ID進行重新編排(這是一個隨機過程)試想假設原包里面 drawable/a.png id=0x7f020003 那么重新編排資源ID后就可能是 0x7f020004 又假設原包 0x7f020004 對應圖片 b.png,那你重新打包后的 apk 當顯示 a.png 的時候就會替換成 b.png,這還好不會出錯,倘若生成的一個 id 原包不存在,那會導致程序崩潰的!
所以 public.xml 的作用就是把對象資源 ID 寫死!
格式是
<public type="資源類型" name="資源名" id="0x7f080000" />
如果你細心觀察就會發現,id 都是 0x7f 開頭緊接着后面兩位 08 是獨立於每種資源類型的,再后面的編碼就是從 1 開始咯
public.xml 特殊用途:
<public-padding name="my_" end="0x7f02000f" start="0x7f020001" type="drawable" />
public-padding 顧名思義,留間距,為什么要留間距,這就涉及到一個深奧的問題了,可以應用在 主題、apk動態更新 領域,這個我們以后討論
加了這個的效果就是在 R 里多了 my_1 ~ my_15 的資源ID,這些個資源ID空的,你去引用會找不到資源,如圖:
二、在gradle plugin高於1.3.0 的版本上啟用 public.xml 特性
但 android gradle plugin 從1.3.0開始就直接忽略了public.xml ,如何啟動看下面:
Enable 'public.xml' feature on gradle plugin version is higher than 1.3.0, 2.0.0 or later is available for testing.
在gradle plugin 高於1.3.0的版本上啟用public.xml特性,2.0.0以上版本已測試可用
AndroidPublicXmlCompat
-
Copy the public-xml.gradle App module to the next directory.
復制public-xml.gradle到App模塊目錄下
-
Add this line into your App module's build.gradle:
在App模塊的build.gradle 中增加:
apply from: 'public-xml.gradle'
