譯android framework層的資源文件

一、將資源放入 frameworks/base/core/res/res/ 中的相應目錄,假設要添加的資源是 drawable 類型,文件名爲 test(後綴可能爲xml或者png等等),則將文件放入 frameworks/base/core/res/res/drawable*/ 下。java

二、仿照已有的同類型系統資源修改 framework/base/core/res/res/values/public.xml,public.xml中有兩種類型的資源描述,一種是<java-symbol/>系統私有的資源(不對app公開),另外一種是<public />公共資源(能夠在app中訪問)。android

若是要添加的資源是私有的,則加上 <java-symbol type="drawable" name="test" />(不須要id),若是是公共的則先找到最後一個type爲 drawable 的 public 項,4.1.2系統中最後一項爲<public type="drawable" name="dialog_holo_light_frame" id="0x010800b3" />,而後添加一句 <public type="drawable" name="test" id="0x010800b4" />,即id爲最後一個的id+1(爲了不 id 衝突)api

三、在 frameworks/base/core/res/ 中執行mm,編譯後生成framework-res.apk 並會更新com.android.internal.R,該 R 所對應的文件爲 /out/target/common/R/com/android/internal/R.java,能夠在該文件中查看本身的資源是否已經加進去了。(若是mm出錯能夠嘗試先執行一下「touch 資源文件」命令)app

四、若是添加的是公共資源,則還須要在源碼目錄下執行 make update-api 以更新 frameworks/base/api/current.txt 文件。server

五、完成以後須要從新編譯framework,若是單編framework模塊則在源碼根目錄下make -j4 framework,全編make -j4便可。xml

另外,若是要在系統中添加一個新的id,好比爲myid,則上述第一步改成在 frameworks/base/core/res/res/values/ids.xml 中增長一列<item type="id" name="myid" />,以後的步驟都同樣。圖片

六、在編譯資源過程當中可能會遇到一些奇怪的問題,好比有時候許多圖標會顯示錯誤,緣由猜想跟從新編譯資源有關,能夠試着從新編譯services.jar並替換看看.資源

 

舉一個例子:假如我想在WindowManagerService.java中使用一個圖片資源pic.png.順序以下.get

1,將文件pic.png拷貝到位置:frameworks/base/core/res/res/drawable下.源碼

2,在frameworks/base/core/res/res/drawable目錄下執行touch pic.png.

3,進入目錄frameworks/base/core/res/ 執行mm命令, 編譯 framework-res.apk

4,執行完後com.android.internal.R 會新生成一個R.drawable.pic的引用.在程序中使用便可.

5,在目錄frameworks/base/ 下執行mm 編譯 framework.jar.

6,在frameworks/base/services/java/com/android/server 下的WindowManagerService.java中使用com.android.internal.R.drawable.pic,使用完後保存文件.

7,進入目錄frameworks/base/services/java/ 執行mm 編譯  services.jar

8,替換機器上(虛擬機或者真機)的jar apk文件,編譯出的包在out/target/product/xxxx/system/framework下

  adb push framework-res.apk /system/framework/

  adb push services.jar /system/framework/

  adb push framework.jar /system/framework/

  執行命令時注意framework-res.apk 的真實路徑.

9,adb reboot 機器,查看修改結果.大功告成!

 

注:在4.2源碼中,將系統私有資源分離成了單獨的文件symbols.xml,公共資源仍然在public.xml中。

symbols.xml 和 public.xml的做用是同樣的。區別:symbols.xml定義的資源進入到com.android.internal.R.java(私有資源),public.xml定義的資源進入到android.R.java(公有資源),並非嚴格定義,在一個xml文件裏也能夠經過不一樣的標籤來控制資源是公共的仍是私有的。

相關文章
相關標籤/搜索