一、修改framework-res.apk
1、反編譯後添加三張圖片到res\drawable-hdpi\目錄下。
2、打開res\values\strings.xml,在最下面添加:
<string name="reboot">Reboot</string>
<string name="recovery">Recovery</string>
<string name="bootloader">Bootloader</string>
3、打開res\values-zh-rCN\strings.xml,在最下面添加:
<string name="reboot">重啓手機</string>
<string name="recovery">恢復模式</string>
<string name="bootloader">工程模式</string>
4、重新編譯framework-res爲framework-res-new.apk,解出resources.arsc以不壓縮的形式替換到原版framework-res.apk中,然後將三張圖片加入到相應位置。
二、修改android.policy.jar
1、打開com\android\internal\policy\impl\GlobalActions.smali文件,在
.method private createDialog()Landroid/app/AlertDialog;
範圍內(電源選項)查找
[Lcom/android/internal/policy/impl/GlobalActions$Action;
找到後修改爲:
const/4 v0, 0x4
new-array v0, v0, [Lcom/android/internal/policy/impl/GlobalActions$Action;
注:0x4表示電源選項中有4個菜單,可修改爲自己需要的條目數量。
2、
const/4 v1, 0x0
new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$4;
const v3,0x1080030# 所對應的圖標
const v4,0x104011a# 所對應的文字
invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$4;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
aput-object v2, v0, v1
此爲一個完整的菜單命令。一般有多個,可改變它們的順序、亦可增加或刪減。
注:0x1080030在framework-res\res\values\public.xml中所對應的數值爲:0x01080030。
一般修改的話複製關機的那條命令修改,修改的地方爲上面代碼紅色部分。
3、這段代碼最後總的結尾爲:
invoke-static {v0}, Lcom/google/android/collect/Lists;->newArrayList([Ljava/lang/Object;)Ljava/util/ArrayList;
move-result-object v0
iput-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList;
所以添加命令的時候一定要注意加在上一個代碼的aput-object v2, v0, v1後面和總結尾的前面。
4、將GlobalActions$4.smali(關機所對應的那個文件)複製三份,分別命名爲:GlobalActions$8.smali、
GlobalActions$9.smali、GlobalActions$10.smali(命名規則是:GlobalActions$xx.smali,“xx-1”爲最後一個數
字)。
5、以修改GlobalActions$8.smali爲例說明:
(1)打開後替換GlobalActions$4爲GlobalActions$8,一共三處。
(2)找到:
invoke-static {v0, v1}, Lcom/android/internal/app/ShutdownThread;->shutdown(Landroid/content/Context;Z)V
修改爲: (重啓)
const-string v2, "now"
invoke-static {v0, v2, v1}, Lcom/android/internal/app/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V
修改爲: (重啓到recovery)
const-string v2, "recovery"
invoke-static {v0, v2, v1}, Lcom/android/internal/app/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V
修改爲: (重啓到bootloader)
const-string v2, "bootloader"
invoke-static {v0, v2, v1}, Lcom/android/internal/app/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V