1. 程式人生 > >修改framework後重新刷入手機

修改framework後重新刷入手機

由於業務需求,需要修改SystemUI,在修改了SystemUI之後出現了各種問題,原本以為只要混滾SystemUI然後重新入到systemUI的根目錄mm一下就行,沒想到刷入到手機沒有任何作用。

經人指點是要把編譯生成的framework-res.apk和framework.jar刪除,然後重新生成,按照我以往邏輯,我只是修改了framework/base目錄下的程式碼,只需要在該目錄下mm一下就可以了,想不到沒有任何作用,遂百度之。然後發現必須先編譯res然後編譯java。具體做法如下:

編譯framework

進入專案根目錄 執行mm命令(原生或高通), 編譯 framework-res.apk

cd frameworks/base/core/res/ 
mm

編譯完後com.android.internal.R中會生成資源的引用。
然後在目錄frameworks/base/ 下執行mm 編譯 framework.jar (原生或高通)

cd ../..
mm

如果 frameworks/base/services 下有修改,則也要編譯
frameworks/base/services/執行mm 編譯 services.jar

cd services
mm

這樣我們就能在生成的檔案裡面找到framework.jar和fram-res.apk以及service.jar,接下來就是把這個push到我們得手機上,使用 adb remount命令。
這個過程中你可能會遇到這樣的錯誤:

adb remount of system failed: Permission denied

解決辦法是

adb root

然後會提示root進入成功:

* daemon not running. starting it now on port 5037 *
* daemon started successfully *
restarting adbd as root
[[email protected] rk3288-5.1]$ adb remount
remount succeeded

接下來執行push指令:

  adb remount

  adb push
framework-res.apk /system/framework/ adb push framework.jar /system/framework/ adb push services.jar /system/framework/ (如果有修改的話)

push成功之後,重啟手機,使用

adb reboot

注意事項

看完了不要跑,這裡還有注意事項:
在開發過程中,尤其是Framework相關開發時,有時候需要重新編譯資原始檔.編譯順序和注意事項如下:
1,資原始檔位置:frameworks/base/core/res
2,編譯後生成的檔案:framework-res.apk 另外com.android.internal.R會更新這個R.java所在目錄為/out/target/common/R/com/android/internal.
3,編譯資源後,必須重新編譯framework.jar.
4,如果在frameworks/base/core/res執行mm是並不重新編譯,請使用toutch ### 命令
“###”代表目錄下的一個檔案.
5,資原始檔要小寫.
6,如果沒有必要,不要編譯資原始檔,可以用其他方式使用資源,比如將資源使用adb push 傳到某個目
錄,程式中直接指定具體目錄.我在編譯資源過程中遇到一些奇怪的問題,比如有時候許多圖示會顯
示錯誤,原因猜測跟重新編譯資源有關,可以試著重新編譯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,在WindowManagerService.java中使用com.android.internal.R.drawable.pic,使用完後儲存檔案.
7,進入目錄frameworks/base/services/java/ 執行mm 編譯 services.jar
8,替換機器上(虛擬機器或者真機)的jar apk檔案.
adb push framework-res.apk /system/framework/
adb push services.jar /system/framework/
adb push framework.jar /system/framework/
執行命令時注意framework-res.apk 的真實路徑.
9,reboot 機器,檢視修改結果.大功告成!