提取android.policy.jar和framework-res.apk。
1.反编译框架,找一个重启图标,命名为ic_power_recovery.png,放到framework-res.apk\res\drawable-hdpi
再添加字符,打开values/strings.xml,添加:<string name="reboot_recovery">Recovery</string>
再打开values-zh-rCN/strings.xml,添加:<string name="reboot_recovery">恢复模式</string>
2.把生成的目录索引resources.arsc文件拖到apk原文件,新加的ic_power_recovery.png也拖进去,不用管什么压缩方式必须选储存,到这里已完成对framework-res.apk的修改。最后回编译框架,再反编译提取ID。
3.打开android.policy.jar把dex文件提取出来,反编译,打开com\android\internal\policy\impl\GlobalActions.smali
#找到:
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 #图标ID [原ID:0x01080030,它自动把0x后的0去掉了]
const v3, 0x104012f #文字ID
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
#这里调用了GlobalActions$2,搜索字符id知道它是就是关机事件。
再搜索,也会找到调用GlobalActions$3(数值可能不同,是重启事件)。
那么仿照关机事件的写法,在重启事件后面加入下面的代码:(这样选项的位置才会如图所示)(注意图片和字符的id对应)。
iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList;
new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$8;
const v2, 0x108069a
const v3, 0x1040519
invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$8;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z
#复制GlobalActions$2.smali,重命名为GlobalActions$8.smali(如果原来就存在8就改成9,而且还需要改上面那段代码以此类推),打开这个smali,把文本内"$2"全部替换成“$8”,并在const/4 v1, 0x1后追加以下代码并注释掉原有的那行。
const-string p0, "recovery"
invoke-static {v0, p0, v1}, Lcom/android/internal/app/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V
#invoke-static {v0, v1}, Lcom/android/internal/app/ShutdownThread;->shutdown(Landroid/content/Context;Z)V
就像如图所示:
4.接下来回编译classes.dex,覆盖回android.policy.jar,这样就完成了