【ROM修改教程】添加高級電源重啓菜單(安卓4.0.4官方ROM)

【ROM修改教程】添加高級電源重啓菜單(安卓4.0.4官方ROM)

準備工做:
電腦上安裝好JDK、下載smali和baksmali、下載apktools、要修改的ROM、adb工具(可選)
注:因爲本教程面向的對象爲有必定ROM修改基礎的兄弟,因此對於如何使用電腦,如何使用CMD以及上述工具的具體用法等等都不在本貼的討論範圍內,本文將僅講述如何添加高級重啓菜單

一、從要修改的ROM中提取出如下文件
/system/framework/framework-res.apk
/system/framework/android.policy.jar
二、反編譯修改framework-res.apk,加入須要的圖片以及字符串等資源。
2.一、反編譯framework-res.apk
CMD中執行命令
> java -jar apktool.jar d -s framework-res.apk framework-res


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.三、加入所需的圖片
本方法將用到一張圖片,顯示在所加入的菜單上。
由於i88的分辨率爲800×480,因此我將兩張圖片放入framework-res_apk\res\drawable-hdpi之中
圖片的名字爲(可自定義,注意上下一致便可)
ic_power_recovery.png(此處用到的圖片分辨率爲:48×48)

2.四、爲所加入的字符及圖片指定資源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
對應記下ID一、ID二、
      <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.五、打包並完成對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
相關文章
相關標籤/搜索