1、將資源放入 frameworks/base/core/res/res/ 中的相應目錄,假設要添加的資源是 drawable 類型,文件名為 test(后綴可能為xml或者png等等),則將文件放入 frameworks/base/core/res/res/drawable*/ 下。
2、仿照已有的同類型系統資源修改 framework/base/core/res/res/values/public.xml,public.xml中有兩種類型的資源描述,一種是<java-symbol/>系統私有的資源(不對app公開),另一種是<public />公共資源(可以在app中訪問)。
如果要添加的資源是私有的,則加上 <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 沖突)
3、在 frameworks/base/core/res/ 中執行mm,編譯后生成framework-res.apk 並會更新com.android.internal.R,該 R 所對應的文件為 /out/target/common/R/com/android/internal/R.java,可以在該文件中查看自己的資源是否已經加進去了。(如果mm出錯可以嘗試先執行一下“touch 資源文件”命令)
4、如果添加的是公共資源,則還需要在源碼目錄下執行 make update-api 以更新 frameworks/base/api/current.txt 文件。
5、完成之后需要重新編譯framework,如果單編framework模塊則在源碼根目錄下make -j4 framework,全編make -j4即可。
另外,如果要在系統中添加一個新的id,比如為myid,則上述第一步改為在 frameworks/base/core/res/res/values/ids.xml 中增加一列<item type="id" name="myid" />,之后的步驟都一樣。
6、在編譯資源過程中可能會遇到一些奇怪的問題,比如有時候許多圖標會顯示錯誤,原因猜測跟重新編譯資源有關,可以試着重新編譯services.jar並替換看看.
舉一個例子:假如我想在WindowManagerService.java中使用一個圖片資源pic.png.順序如下.
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文件里也可以通過不同的標簽來控制資源是公共的還是私有的。