2012/03/29

再起動メニューを追加する

OS2.3.4
rooted端末であることが大前提。
失敗したとしても「自己責任」




【必要なもの】
powermenu_final.zip(要ユーザー登録) → ここ
Android SDK → ここ
Java開発環境 → ここ
APK Multi Tool → ここ
apktool → ここ
7-zip(コマンドライン用、Windows用) → ここ
テキストエディタ → これ か これ 編集できればなんでもいい。
※これらのインストール方法等は省略
framework-res.apk,framework.jar,androd.policy.jar

【下準備】
1)端末の設定→アプリケーション→開発→USBデバッグにチェック入れる。

2)PCと端末をUSB接続

3)PCの任意の場所に作業フォルダ作成(例:C:\powermenu)

4)3のフォルダにapktool.jarと7-zip(コマンドライン)を入れる。

5)コマンドプロンプト起動して作業フォルダに移動
cd C:\powermenu

5)adbコマンドで引っこ抜く。
adb pull /system/framework/android.policy.jar
adb pull /system/framework/framework-res.apk
adb pull /system/framework/framework.jar

【framework-res.apkの編集】
1)place-apk-here-for-moddingにframework-res.apkを入れる。

2)Script.bat起動

3)「9」を入力してデコンパイル
これでprojectsフォルダの中にframework-res.apkフォルダが作られ展開される。

4)projects/framework-res.apk/res/drawable-hdpiにrebootアイコンを入れる。

5)projects/framework-res.apk/res/values-ja/strings.xmlをテキストエディタで開いて
一番最後の行(たぶん975行)に下記追記。
    <string name="reboot">再起動する</string>

6)projects/framework-res.apk/res/values/string.xmlをテキストエディタで開いて
一番最後の行(たぶん1027行)に下記追記。
    <string name="reboot">Reboot</string>

7)projects/framework-res.apk/res/values/public.xmlをテキストエディタで開いて
stringとアイコンのリソースIDを追加する。
    <public type="string" name="reboot" id="0x010403f5" /> (2736行目あたり)
    <public type="drawable" name="reboot" id="0x0108052d" /> (4199行目あたり)
※必ずしも同じIDではないので、空いてるIDを探す。
ここで追加IDは後ほど使うのでどこかにメモしておく。

8)Script.bat起動

9)「22」を入力してCompression Levelを「0」にする。(圧縮率0)

10)「11」を入力してコンパイル

11)Is this a system apk (y/n)と聞いてきたら「y」を入力

12)Aside from the signature, would you like to copy
     over any additional files that you didn't modify
     from the original apk in order to ensure leadt
     # of errors (y/n)
と聞いてきたら「y」を入力
これでコンパイルが始まるのでしばし待つ。

13)「続行するには何かキーを押してください...」と表示されたらキーは何も押さず
keepフォルダを開いて「resources.arsc」を削除する。

14)何かキーを押して処理続行
これでplace-apk-here-for-moddingの中にunsignedframework-res.apkが作られる。
が、なぜかresources.arscが圧縮されているのでこのままではダメ

15)unsignedframework-res.apkを作業フォルダに移動してframework-res.apkにリネーム

16)projects/framework-res.apk/build/apk/resources.arscを作業フォルダにコピー

17)コマンドプロンプト起動して作業フォルダに移動
cd C:\powermenu

18)resources.arscをコマンドで入替え
7za.exe d -tzip framework-res.apk resources.arsc
これで圧縮されているresources.arscが削除される。
7za.exe a -tzip -mx=0 framework-res.apk resources.arsc
これでコピーしたresources.arscが無圧縮で追加される。
【framework-res.apkの編集完了】

【framework.jarの編集】
1)コマンドプロンプト起動して作業フォルダに移動
cd C:\powermenu

2)apktoolを使ってframework.jarを解体
java -jar apktool.jar d framework.jar
これで作業フォルダにframework.jar.outフォルダが作られ展開される。

3)framework.jar.out/smali/com/android/internal/app/ShutdownThread.smaliを
テキストエディタで開く。

4)21行目に下記追記
.field public static mReboot:I

5)invoke-static {}, Landroid/os/Power;->shutdown()Vを検索(たぶん487行目あたり)して
下記のように追記

    .line 409
    :goto_0
    const-string v2, "ShutdownThread"

    const-string v2, "Performing low-level shutdown..."

    invoke-static {v4, v2}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

    sget v1, Lcom/android/internal/app/ShutdownThread;->mReboot:I #←追記

    const/4 v2, 0x1 #←追記

    if-eq v1, v2, :reboot #←追記

    .line 410
    invoke-static {}, Landroid/os/Power;->shutdown()V #←これを検索

    .line 411
    return-void

    :reboot #←追記
    const-string v4, "now" #←追記

    invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V #←追記

    return-void #←追記

    .line 388
    :catch_0
    move-exception v0

6)編集した内容でコンパイル
java -jar apktool.jar b framework.jar.out
これでframework.jar.outフォルダの中にdistフォルダが作られframework.jarが出来上がる。
が、このままではダメ

7)作業フォルダのframework.jarを7-zipで開く。

8)framework.jar.out/dist/framework.jarを7-zipで開く。

9)8のclasses.dexを7に移動
【framework.jarの編集完了】

【android.policy.jarの編集】
1)コマンドプロンプト起動して作業フォルダに移動
cd C:\powermenu

2)apktoolを使ってandroid.policy.jarを解体
java -jar apktool.jar d android.policy.jar
これで作業フォルダにandroid.policy.jar.outフォルダが作られ展開される。

3)android.policy.jar.out/smali/com/android/internal/policy/impl/GlobalActions.smaliを
テキストエディタで開く。

4)new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$4;を検索(たぶん468行目あたり)して下記のように追記。

    new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$4; #←これを検索

    const v3, 0x1080030

    const v4, 0x104015f

    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

    const/4 v1, 0x3

    new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$8; #←追記

    const v3,  0x0108052d #←追記 reboot icon resource id

    const v4,  0x010403f5 #←追記 reboot 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, 0x4 #←追記

    new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$DividerAction;

5)android.policy.jar.out/smali/com/android/internal/policy/impl/GlobalActions$4.smaliを
コピーしてそのまま貼り付けてGlobalActions$8.smaliにリネーム

6)android.policy.jar.out/smali/com/android/internal/policy/impl/GlobalActions$8.smaliを
テキストエディタで開く。

8)GlobalActions$4となっている箇所をGlobalActions$8に変更(1行,30行,44行)

9)53行目に下記のように追記

    move-result-object v0 #(49行目)

    const/4 v1, 0x1 #(51行目)

    const/4 v2, 0x1 #←追記(53行目)

    sput v2, Lcom/android/internal/app/ShutdownThread;->mReboot:I #←追記(55行目)

    invoke-static {v0, v1}, Lcom/android/internal/app/ShutdownThread;->shutdown(Landroid/content/Context;Z)V #(57行目)

10)編集した内容でコンパイル
java -jar apktool.jar b android.policy.jar.out
これでandroid.policy.jar.outフォルダの中にdistフォルダ作られandroid.policy.jarが出来上がる。
が、このままではダメ

11)作業フォルダのandroid.policy.jarを7-zipで開く。

12)android.policy.jar.out/dist/android.policy.jarを7-zipで開く。

13)12のclasses.dexを11に移動
【android.policy.jarの編集完了】

作業フォルダの中にあるframwork-res.apk,framwork.jar,andorid.policy.jarを
1)CWMインストールzipにして端末に適用
2)adb pushして端末に適用
3)それぞれ端末のSDカードに移してSUFBSなどで適用
すれば終わり

2 件のコメント:

  1. new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$8 #←追記

    ↑の$8の後に ; が抜けているようです。
    報告まで。

    返信削除