第一步
添加字符串
首先反編譯framework-res.apk
打開values\strings.xml,然後在裡面加上
- <string name="reboot_recovery">Recovery</string>
- <string name="reboot_download">Download</string>
- <string name="reboot">Reboot</string>
保存,關閉
第二步
打開values\public.xml,分配剛剛加上去的字符串id
具體做法是,翻到文件最後,查看最後一個字符串的id,假設為10403c2,搜索10403c3,看看是否已經有此id了,沒有的話,添加代碼
- <public type="string" name="reboot_recovery" id="0x010403c3" />
- <public type="string" name="reboot_download" id="0x010403c4" />
- <public type="string" name="reboot" id="0x010403c5" />
如果有,可以繼續搜10403c4······
第三步
現在可以在圖片資源文件夾(res\drawable-hdpi,res\drawable-mdpi,res\drawable-ldpi)加上自己喜歡的圖標了
為了方便,以下規定圖標名字為reboot.png recovery.png download.png
實際上,大家可以自己命名圖標名字
然後
為剛剛加上的圖標和剛剛分配的id連接起來
打開values\public.xml,繼續添加代碼
- <public type="drawable" name="reboot" id="0x010803aa" />
- <public type="drawable" name="recovery" id="0x010803ab" />
- <public type="drawable" name="download" id="0x010803ac" />
保存,關閉
現在framework-res.apk文件弄好了,剩下的編譯就不用多說了
接下來弄另外一個文件framework.jar
目的是使關機選項有作用,能重啟
反編譯framework.jar(方法自己百度)
打開com\android\internal\app\ShutdownThread.smali
在第37行添加代碼
- .field public static mReboot:I
然後,轉到第1463行,注意,此行前一個代碼應該是"invoke-static {}, Landroid/os/Power;->shutdown()V"
在此行添加代碼
- sget v1, Lcom/android/internal/app/ShutdownThread;->mReboot:I
- const/4 v2, 0x1
- if-eq v1, v2, :reboot
- const/4 v2, 0x2
- if-eq v1, v2, :rebootRecovery
- const/4 v2, 0x3
- if-eq v1, v2, :rebootDownload
然後在1477行
- .line 531
- invoke-static {}, Landroid/os/Power;->shutdown()V
- .line 532
- return-void
繼續添加代碼
- :reboot
- const-string v4, "now"
- invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V
- return-void
- :rebootRecovery
- const-string v4, "recovery"
- invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V
- return-void
- :rebootDownload
- const-string v4, "download"
- invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V
- return-void
保存,關閉
之後將framework.jar編譯回來(方法百度)
接下來我們要在電源菜單中添加選項
反編譯android.policy.jar
打開com\android\internal\policy\impl\GlobalActions.smali
第一件事就是將數組長度增加3
方法是將第431行的代碼
- const/4 v0, 0x3
- new-array v0, v0, [Lcom/android/internal/policy/impl/GlobalActions$Action;
改為
- const/4 v0, 0x6
- new-array v0, v0, [Lcom/android/internal/policy/impl/GlobalActions$Action;
然後,在第457行,也就是在 aput-object v2, v0, v1 之後
添加代碼
- const/4 v1, 0x3
- new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$7;
- const v3, 0x10803aa # reboot icon resource id
- const v4, 0x10403c5 # reboot string resource id
- invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$7;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
- aput-object v2, v0, v1
- const/4 v1, 0x4
- new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$8;
- const v3, 0x10803ab # recovery icon resource id
- const v4, 0x10403c3 # recovery string resource id
- invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$8;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
- aput-object v2, v0, v1
- const/4 v1, 0x5
- new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$9;
- const v3, 0x10803ac # download icon resource id
- const v4, 0x10403c4 # download string resource id
- invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$9;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
- aput-object v2, v0, v1
確保id與剛剛在framework-res.apk中添加的id名稱一致
保存,關閉
接下來確保你添加的重啟選項可用
復制GlobalActions$3.smali 並且重命名為GlobalActions$7.smali
打開GlobalActions$7.smali 替換所有GlobalActions$3.smali 的實例
然後轉到52行,52行前面的代碼應該是
"invoke-static {v0, v1}, Lcom/android/internal/app/ShutdownThread;->shutdown(Landroid/content/Context;Z)V"
添加代碼
- const/4 v2, 0x1
- sput v2, Lcom/android/internal/app/ShutdownThread;->mReboot:I
保存,關閉
接下來
復制GlobalActions$3.smali 並命名為GlobalActions$9.smali
打開GlobalActions$9.smali 替換所有GlobalActions$3.smali 實例
同樣轉到第52行,52行前面應該是"invoke-static {v0, v1}, Lcom/android/internal/app/ShutdownThread;->shutdown(Landroid/content/Context;Z)V
添加代碼
- const/4 v2, 0x3
- sput v2, Lcom/android/internal/app/ShutdownThread;->mReboot:I
保存,關閉
將android.policy.jar編譯回來
ok,試試效果吧