Третье, что нужно сделать - это декомпилировать android.policy.jar командой:
java -jar baksmali.jar -x android.policy.jar -o android.policyНаконец, пришло время непосредственно добавить наши новые пункты в Power Menu. Само меню находится в android.policy.jar
android.policy.jar\com\android\internal\policy\impl\GlobalActions.smali
Первым делом нужно увеличить длину массива в методе createDialog. Ищем строку:
.method private createDialog()Landroid/app/AlertDialog;
немного ниже от неё видим:
const/4 v0, 0x3 (в моем случае это после .line 274), меняем
0x3 на
0x6.
Теперь можно добавить новые пункты меню. Ищем строку:
aput-object v2, v0, v1Их там несколько, после самой последней дописываем код:
const/4 v1, 0x4
new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$7;
const v3, 0x0108048f # id изображения перезагрузки
const v4, 0x0104049c # 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, 0x5
new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$8;
const v3, 0x01080490 # id изображения рекавери
const v4, 0x0104049a # 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, 0x6
new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$9;
const v3, 0x01080491 # id изображения прошивки
const v4, 0x0104049b # 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
Внимательно читаем комментарии в коде, вы должны вписать идентификаторы тех ресурсов, которые вы добавляли в framework-res.apk. В конце комментарии удаляем вместе с решётками.Теперь нужно добавить код, запускаемый нажатием на новые пункты меню.
Делаем три копии GlobalActions$3.smali и переименовываем их по порядку в GlobalActions$7.smali, GlobalActions$8.smali и GlobalActions$9.smali.
Открываем GlobalActions$7.smali, и заменяем все упоминаемые GlobalActions$3 на GlobalActions$7. Аналогично делаем с GlobalActions$8.smali и GlobalActions$9.smali, делая уже замены на ...$8 и ...$9 соответственно.
В GlobalActions$7.smali ищем строку:
invoke-static {v0, v1}, Lcom/android/internal/app/ShutdownThread;->shutdown(Landroid/content/Context;Z)V
и меняем ее на:
const-string p0, "now"
invoke-static {v0, p0, v1}, Lcom/android/internal/app/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V
в GlobalActions$8.smali меняем эту же строчку на:
const-string p0, "recovery"
invoke-static {v0, p0, v1}, Lcom/android/internal/app/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V
в GlobalActions$9.smali аналогично меняем:
const-string p0, "download"
invoke-static {v0, p0, v1}, Lcom/android/internal/app/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V
Собираем jar
java -jar smali.jar android.policy -o classes.dex, полученный classex.dex добавляем в android.policy.jar.
Всё, с android.policy.jar разобрались тоже.