【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)
生活随笔
收集整理的這篇文章主要介紹了
【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
準備工作: 電腦上安裝好JDK、下載smali和baksmali、下載apktools、要修改的ROM、adb工具(可選) 注:由于本教程面向的對象為有一定ROM修改基礎的兄弟,所以對于如何使用電腦,如何使用CMD以及上述工具的具體用法等等都不在本貼的討論范圍內,本文將僅講述如何添加高級重啟菜單
1、從要修改的ROM中提取出以下文件 /system/framework/framework-res.apk /system/framework/android.policy.jar 2、反編譯修改framework-res.apk,加入需要的圖片以及字符串等資源。 2.1、反編譯framework-res.apk CMD中執行命令 > java -jar apktool.jar d -s framework-res.apk framework-res
2.2、加入字符資源 英文部分(如需要則添加):使用文本編輯器打開framework-res\res\values\strings.xml,在最后添加所要用的字符串 ???????.... ???????<string name="reboot_recovery">Recovery</string> ??????</resources>
簡體中文部分:使用文本編輯器打開framework-res\res\values-zh-rCN\strings.xml,在最后添加所要用的字符串 ???????.... ???????<string name="reboot_recovery">恢復模式</string> ??????</resources> 2.3、加入所需的圖片 本方法將用到一張圖片,顯示在所加入的菜單上。 因為i88的分辨率為800×480,所以我將兩張圖片放入framework-res_apk\res\drawable-hdpi之中 圖片的名字為(可自定義,注意上下一致即可) ic_power_recovery.png(此處用到的圖片分辨率為:48×48)
2.4、為所加入的字符及圖片指定資源ID(提供兩種方式,任選一種即可。個人推薦第一種) 自動指定方式:完成上述的修改后,CMD執行命令 >java -jar apktool.jar b framework-res framework-res_mod.apk >java -jar apktool.jar d -s framework-res_mod.apk framework-res_mod 復制framework-res_mod\res\values\public.xml,用其來替換framework-res\res\values\public.xml 對應記下ID1、ID2、 ???<public type="string" name="reboot_recovery" id="ID1" /> ??????????<public type="drawable" name="ic_power_recovery" id="ID2" />
手動指定方式: 使用文本編輯器打開D:\PowerMenu\framework-res\res\values\public.xml 搜索<public type="string",找到string段對應的最后一個id號(請確定是最后一個),此處記為String_ID 搜索<public type="drawable",找到drawable段對應的最后一個id號(請確定是最后一個),此處記為Drawable_ID 在文件后添加兩行 ???<public type="string" name="reboot_recovery" id="String_ID+1" /> ???????<public type="drawable" name="ic_power_bootloader" id="Drawable_ID+1" /> ??
根據第一種方法,在這里我獲得的對應ID如下 ???<public type="string" name="reboot_recovery" id="0x010806b6" /> ???????<public type="drawable" name="ic_power_recovery" id="0x010404f8" />
2.5、打包并完成對framework-res.apk的修改 CMD下執行命令 > java -jar apktool.jar b framework-res framework-res_done.apk
使用winra或7z等壓縮工具,從得到的framework-res_done.apk文件中提取出resources.arsc 將resources.arsc替換framework-res.apk中的同名文件,并將ic_power_recovery.png添加到framework-res.apk中的對應位置 res\drawable-hdpi\ic_power_recovery.png 至此,對framework-res.apk的修改就完成了。保存好修改完畢的framework-res.apk。
代碼修改部分
用WinRAR或者7z之類的壓縮工具打開android.policy.jar,從中把classes.dex提取出來。 然后在CMD下執行命令: > java -jar baksmali.jar classes.dex -o android.policy_dex
打開android.policy_dex\com\android\internal\policy\impl\文件夾,找到GlobalActions$打頭的幾個文件,記住最后一個的編號。 比如我這里看到的以GlobalActions$打頭的文件的最后一個是GlobalActions$9.smali。 因為之后我們會創建一個文件,以GlobalActions$開頭。 按本例的情況,會是GlobalActions$10.smali(重啟進入recovery的代碼) 使用文本編輯器打開android.policy_dex\com\android\internal\policy\impl\GlobalActions.smali 搜索:.method private createDialog()。這個函數是用來創建電源菜單的,既然我們是要添加菜單項,那么自然是要對這個函數進行修改。 不保證其他ROM也是一樣的,這個大家在了解添加方法后,自己觀察下就可以判斷的,我找到的是: .method private createDialog()Landroid/app/AlertDialog;
我發現4.0的下面的代碼根本沒辦法直接看出哪 個是關機的代碼,哪 個是重啟的代碼,不過我們可以用逆向追蹤的方法。從創建電源菜單的代碼中一定可以找到一些資源ID,復制這個ID到framework-res\res\values-zh-rCN\public.xml中搜索,很快就可以看到這個ID是做什么的(如 0x10404f2這個是定義的重啟字符串,搜索前先要在前面加個0,就是0x010404f2,public.xml中的ID前面的0在這里被省略了)。這里基本就可以確定GlobalActions$3這個就是調用的重啟方法了。
本例中的情況見下: iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems: Ljava/util/ArrayList;
???new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$2;
???const v2, 0x1080030
???const v3, 0x104013c
???invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$2;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
???invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z
???.line 234
#以上為關機代碼 ???iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems: Ljava/util/ArrayList;
???new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$3;
???const v2, 0x10802f0
???const v3, 0x10404f2
???invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$3;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
???invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z
?.line 252 #此為重啟代碼
不管是正常重啟,還是重啟到recovery,均是進行重啟,只是重啟時的參數不一樣,重啟到Recovery代碼就可以參考正常重啟部分的了。 new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$3;(注意這個,這個是正常重啟用到的執行代碼) 我們把重啟的代碼復制一份插入到上面重啟代碼的下面,也就是 ?.line 252這行的下面,GlobalActions$3.smali重命名為GlobalActions$10.smal。 插入的代碼如下: iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems: Ljava/util/ArrayList;
???new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$10;
???const v2, 0x10806b6
???const v3, 0x10404f8
???invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$10;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
???invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z
對文件GlobalActions.smali的修改到這里就結束了
復制一份android.policy_dex\com\android\internal\policy\impl\GlobalActions$3.smali,重命名為GlobalActions$10.smali 打開GlobalActions$10.smali進行修改 全部GlobalActions$3都修改為GlobalActions$10.smali const-string v1, "null"修改為const-string v1, "recovery" 因為我的只有兩個參數,如果你的有三個參數還要修改一下,紅色標記部分為修改部份,可以直接刪除不要這個參數,保留的話要先在strings.xml中定義。 Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;-><init>(II)V ????II表示兩個參數 .parameter "x0" .parameter "x1" .parameter "x2"(比正常重啟項少一個參數,該參數是每項下方的那個提示文字,這個我的沒有) invoke-direct {p0, p2, p3, p4},? 修改好保存退出,添加重啟到recovery的執行代碼文件就完成了。
保存上面所做的修改,開始進行打包 CMD下執行命令: > java -jar smali.jar android.policy_dex -o classes.dex
然后WinRAR或者7z之類的壓縮工具打開android.policy.jar,使用修改得到classes.dex替換原文件。 OK,到這里,對android.policy.jar的修改也完成了。
最后把修改好的兩個文件替換到手機看看效果吧,怎么換我就不說了 伸手黨看這里I88修改后得到的成品,僅供參考: ??android.policy.zip
總結
以上是生活随笔為你收集整理的【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MTK 快速开机 技术详解
- 下一篇: 介绍一种很棒的wince 如何替换系统声