In this tutorial, we will modify 2 files; the framework-res.apk file and android.policy.jar file...
Here for the sake of tutorial, I will refer to ScreenShot resources by blue color lines, Recovery resources by green lines, download resources by orange lines and safe resources by pink lines.. Please download
these resources first.
Smali resources credits to
Robbie Hood for Screen Capture,
tdunham for Download and Recovery smalis, and of course me for Safe mode smali.
A) framework-res.apk
1. Decompile framework-res.apk by APK-Multi Tool
2. Add your desired resources image to res\drawable-xhdpi folder, here they are [
tw_ic_lock_screenshot.png], [
tw_ic_lock_recovery.png], [
tw_ic_lock_download.png] and [
tw_ic_lock_safemode.png].
3. Go to res\values folder and open
strings.xml file and add the following lines at the end before </resources>:
Code:
[COLOR="Blue"] <string name="global_action_screenshot_txt">Take screenshot</string>[/COLOR]
[COLOR="Green"] <string name="global_action_recovery_txt">Recovery Mode</string>[/COLOR]
[COLOR="DarkOrange"] <string name="global_action_download_txt">Download mode</string>[/COLOR]
[COLOR="Magenta"]<string name="global_action_safemode_txt">Reboot to safe mode</string>[/COLOR]
4. Now recompile your framework-res.apk THEN decompile it again; so we can have new generated ids in
public.xml file in res\values folder.
5. In your new decompiled framework-res.apk, go to res\values folder and open
public.xml file and locate the following lines for the added new image resources:
Code:
[COLOR="Blue"]<public type="drawable" name="tw_ic_lock_screenshot" id="0x01080a98" />[/COLOR]
[COLOR="Green"]<public type="drawable" name="tw_ic_lock_recovery" id="0x01080a9a" />[/COLOR]
[COLOR="DarkOrange"]<public type="drawable" name="tw_ic_lock_download" id="0x01080a99" />[/COLOR]
[COLOR="Magenta"]<public type="drawable" name="tw_ic_lock_safemode" id="0x01080a98" />[/COLOR]
and the following lines for the added new strings resources:
Code:
[COLOR="Blue"]<public type="string" name="global_action_screenshot_txt" id="0x01040784" />[/COLOR]
[COLOR="Green"]<public type="string" name="global_action_recovery_txt" id="0x01040785" />[/COLOR]
[COLOR="DarkOrange"]<public type="string" name="global_action_download_txt" id="0x01040786" />[/COLOR]
[COLOR="Magenta"]<public type="string" name="global_action_safemode_txt" id="0x01040785" />[/COLOR]
6. Leave
public.xml file opened and go to the next step..
B) android.policy.jar
1. Backsmali android.policy.jar
2. Navigate to classout\com\android\internal\policy\impl folder and open
GlobalActions.smali.
3. In the [# instance fields] section, add these new lines:
Code:
[COLOR="Blue"].field private mScreenCapture:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
[/COLOR]
[COLOR="Green"].field private mRecovery:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;[/COLOR]
[COLOR="DarkOrange"].field private mDownload:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;[/COLOR]
[COLOR="Magenta"].field private mSafeMode:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;[/COLOR]
4. Search for "
[Lcom/android/internal/policy/impl/GlobalActions$Action;" for power menu arrays and increase the number of arrays (the line above it) to accommodate the total number of new arrays..
Code:
.line 418
const/4 v1, 0x[B][COLOR="Purple"]5 <!--- You need to increase the arrays number here[/COLOR][/B]
new-array v1, v1, [Lcom/android/internal/policy/impl/GlobalActions$Action;
So the line will be:
Code:
.line 418
const/4 v1, 0x[B][COLOR="Purple"]9[/COLOR][/B]
new-array v1, v1, [Lcom/android/internal/policy/impl/GlobalActions$Action;
5. Now we will put listener actions for these added arrays.. so above the newly modified "
const/4 v1, 0x9" add these action lines:
Code:
new-instance [COLOR="Red"]v1[/COLOR], Lcom/android/internal/policy/impl/GlobalActions$99;
const [COLOR="Red"]v2[/COLOR], 0x10808ad
const [COLOR="Red"]v3[/COLOR], 0x1040193
move-object/from16 [COLOR="Red"]v0, p0[/COLOR]
invoke-direct {[COLOR="Red"]v1, v0, v2, v3[/COLOR]}, Lcom/android/internal/policy/impl/GlobalActions$99;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
move-object/from16 [COLOR="Red"]v0, p0[/COLOR]
iput-object [COLOR="Red"]v1, v0[/COLOR], Lcom/android/internal/policy/impl/GlobalActions;->mRestart:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
.line 416
invoke-direct/range {p0 .. p0}, Lcom/android/internal/policy/impl/GlobalActions;->onAirplaneModeChanged()V
[COLOR="Blue"]new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$ScreenCap;
const v2, 0x1080a98
const v3, 0x1040784
move-object/from16 v0, p0
invoke-direct {v1, v0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$ScreenCap;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
move-object/from16 v0, p0
iput-object v1, v0, Lcom/android/internal/policy/impl/GlobalActions;->mScreenCapture:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;[/COLOR]
[COLOR="Green"] new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$Recovery;
const v2, 0x1080a9a
const v3, 0x1040785
move-object/from16 v0, p0
invoke-direct {v1, v0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$Recovery;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
move-object/from16 v0, p0
iput-object v1, v0, Lcom/android/internal/policy/impl/GlobalActions;->mRecovery:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
[/COLOR]
[COLOR="DarkOrange"] new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$Download;
const v2, 0x1080a99
const v3, 0x1040786
move-object/from16 v0, p0
invoke-direct {v1, v0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$Download;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
move-object/from16 v0, p0
iput-object v1, v0, Lcom/android/internal/policy/impl/GlobalActions;->mDownload:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;[/COLOR]
[COLOR="Magenta"]new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$SafeMode;
const v2, 0x1080a98
const v3, 0x1040785
move-object/from16 v0, p0
invoke-direct {v1, v0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$SafeMode;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V
move-object/from16 v0, p0
iput-object v1, v0, Lcom/android/internal/policy/impl/GlobalActions;->mSafeMode:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;[/COLOR]
.line 418
const/4 v1, 0x9
As you can see here, the ids for each action are obtained from
public.xml file from
framework-res.apk. The first id in each action will represent the image resource and the second id will represent the string resource... See public.xml lines above and you will figure it out
..
6. Now we need to add new arrays to show in Power Menu.. So bellow modified "
const/4 v1, 0x9" add new arrays to show after the last array:
Code:
.line 418
const/4 v1, 0x9
new-array v1, v1, [Lcom/android/internal/policy/impl/GlobalActions$Action;
const/4 v2, 0x0
move-object/from16 v0, p0
iget-object v3, v0, Lcom/android/internal/policy/impl/GlobalActions;->mAccessiblityShortcut:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v3, v1, v2
...
...
...
const/4 [COLOR="Red"]v2[/COLOR], 0x4
move-object/from16 [COLOR="Red"]v0, p0[/COLOR]
iget-object [COLOR="Red"]v3, v0[/COLOR], Lcom/android/internal/policy/impl/GlobalActions;->mRestart:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object [COLOR="Red"]v3, v1, v2[/COLOR]
[COLOR="Blue"] const/4 v2, 0x5
move-object/from16 v0, p0
iget-object v3, v0, Lcom/android/internal/policy/impl/GlobalActions;->mScreenCapture:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v3, v1, v2[/COLOR]
[COLOR="Green"] const/4 v2, 0x6
move-object/from16 v0, p0
iget-object v3, v0, Lcom/android/internal/policy/impl/GlobalActions;->mRecovery:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v3, v1, v2[/COLOR]
[COLOR="DarkOrange"] const/4 v2, 0x7
move-object/from16 v0, p0
iget-object v3, v0, Lcom/android/internal/policy/impl/GlobalActions;->mDownload:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v3, v1, v2[/COLOR]
[COLOR="Magenta"]const/4 v2, 0x8
move-object/from16 v0, p0
iget-object v3, v0, Lcom/android/internal/policy/impl/GlobalActions;->mSafeMode:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v3, v1, v2[/COLOR]
7. Now save changes and exit.
8. Copy smali resources for ScreenShot, Recovery, Download and Safe modes into classout\com\android\internal\policy\impl folder
9. Smali (recompile) the finished android.policy.jar
Now push the modified
framework-res.apk and
android.policy.jar to your phone.. This will be enough for new Power Menu recovery, download and safe modes addons but not for ScreenShot!! You need to push extra file to
bin folder in your phone which is
screenshot and fix permissions to rwsr-xr-x that is 04755 in updater-script language.
Results example: