android public.xml 用法


一、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

  1. Copy the public-xml.gradle App module to the next directory.

    復制public-xml.gradle到App模塊目錄下

  2. Add this line into your App module's build.gradle:

    在App模塊的build.gradle 中增加:

    apply from: 'public-xml.gradle'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM