2012/06/06

ICS 4.0.4 再起動メニュー追加

再起動メニュー追加するにはどれに何を追加するか調べてみた。
忘れないうちに備忘録がてら
※rooted,deodex済みが大前提


 

当然のごとく「自己責任」

追加・編集が必要なのは
framework-res.apk
framework.jar
android.policy.jar
この3つ
GBと一緒だった。

事前にadb pull等で端末から抜いておく。

【framework-res.apk】
1)framework-res.apkをデコンパイル

2)framework-res.apk/res/drawable-hdpiにrebootのアイコンを入れる(ic_lock_reboot.png)

3)framework-res.apk/res/values-ja/string.xmlをテキストエディタで開いてリソース追加
    <string name="reboot">再起動する</string>
    <string name="reboot_progress">再起動中..</string>
    <string name="reboot_confirm">端末を再起動します</string>
    <string name="reboot_confirm_question">端末を再起動しますか?</string>

4)framework-res.apk/res/values/string.xmlをテキストエディタで開いてリソース追加
    <string name="reboot">Reboot</string>
    <string name="reboot_progress">Rebooting..</string>
    <string name="reboot_confirm">Your phone will reboot.</string>
    <string name="reboot_confirm_question">Would you like to reboot?</string>

5)framework-res.apk/res/values/public.xmlをテキストエディタで開いてリソースIDを追加
    <public type="string" name="reboot" id="0x0104051b" />
    <public type="string" name="reboot_progress" id="0x0104051c" />
    <public type="string" name="reboot_confirm" id="0x0104051d" />
    <public type="string" name="reboot_confirm_question" id="0x0104051e" />
    <public type="drawable" name="ic_lock_reboot" id="0x010807f5" />
※空きIDは環境によって異なる為、空きIDを探す必要あり。
   追加したリソースIDは後ほど使うので、どこかにメモしておく。

6)framework-res.apkコンパイル(Compression-Levelは9のままでOK)
※2回ある質問は2回ともy

7)keep/resources.arscを削除して続行

8)place-apk-here-for-modding/unsignedframework-res.apkを適当に移動してframework-res.apkにリネーム

--------------------------------------------------------------------------------

【framework.jar】
1)framework.jarデコンパイル
java -jar baksmali.jar framework.jar -o framework

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

3)29行目に「.field public static mReboot:I」を追記

4)「invoke-direct {v1, p0}, Landroid/app/ProgressDialog;-><init>(Landroid/content/Context;)V」を検索

    invoke-direct {v1, p0}, Landroid/app/ProgressDialog;-><init>(Landroid/content/Context;)V #←これを検索

    .line 184
    .local v1, pd:Landroid/app/ProgressDialog;
    sget v2, Lcom/android/internal/app/ShutdownThread;->mReboot:I #←追記

    if-eq v2, v5, :cond_24 #←追記

    const v2, 0x104014a

    goto :goto_27 #←追記

    :cond_24 #←追記
    const v2, 0x104051b #←追記 reboot string ID

    :goto_27 #←追記
    invoke-virtual {p0, v2}, Landroid/content/Context;->getText(I)Ljava/lang/CharSequence;

    move-result-object v2

    invoke-virtual {v1, v2}, Landroid/app/ProgressDialog;->setTitle(Ljava/lang/CharSequence;)V

    .line 185
    sget v2, Lcom/android/internal/app/ShutdownThread;->mReboot:I #←追記

    if-eq v2, v5, :cond_36 #←追記

    const v2, 0x104014e

    goto :goto_39 #←追記

    :cond_36 #←追記
    const v2, 0x104051c #←追記 reboot_progress string ID

    :goto_39 #←追記
    invoke-virtual {p0, v2}, Landroid/content/Context;->getText(I)Ljava/lang/CharSequence;

    move-result-object v2

    invoke-virtual {v1, v2}, Landroid/app/ProgressDialog;->setMessage(Ljava/lang/CharSequence;)V

5)「invoke-static {p1}, Landroid/os/Power;->reboot(Ljava/lang/String;)V」を検索

    .line 406
    :try_start_1a
    invoke-static {p1}, Landroid/os/Power;->reboot(Ljava/lang/String;)V #←これを検索
    :try_end_1d
    .catch Ljava/lang/Exception; {:try_start_1a .. :try_end_1d} :catch_34

    .line 428
    :goto_1d
    const-string v2, "ShutdownThread"

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

    invoke-static {v2, v3}, 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, :cond_2d #←追記

    .line 429
    invoke-static {}, Landroid/os/Power;->shutdown()V

    .line 430
    return-void

    :cond_2d #←追記
    const-string/jumbo v4, "now" #←追記

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

    return-void #←追記

6)frameworkをコンパイル
java -jar smali.jar framework -0 classes.dex

7)コンパイルしたclasses.dexをframework.jarに追加
7za d -tzip framework.jar classes.dex
7za a -tzip framework.jar classes.dex

--------------------------------------------------------------------------------

【android.policy.jar】
1)android.policy.jarをデコンパイル
java -jar baksmali.jar android.policy.jar -o android.policy

2)android.policy/com/android/internal/policy/impl/GrobalAction.smaliをテキストエディタで開く。
「new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$2;」を検索

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

    const v2, 0x1080030

    const v3, 0x1040155

    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

    iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList;

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

    const v2, 0x10807f5 #←追記 ic_lock_reboot drawable ID

    const v3, 0x104051b #←追記 reboot string ID

    invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$7;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V #←追記

    invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z

3)android.policy/com/android/internal/policy/impl/GrobalAction$2.smaliをテキストエディタで開く。

# virtual methods
.method public onPress()V
    .registers 3

    .prologue
    .line 170
    iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions$2;->this$0:Lcom/android/internal/policy/impl/GlobalActions;

    #getter for: Lcom/android/internal/policy/impl/GlobalActions;->mContext:Landroid/content/Context;
    invoke-static {v0}, Lcom/android/internal/policy/impl/GlobalActions;->access$100(Lcom/android/internal/policy/impl/GlobalActions;)Landroid/content/Context;

    move-result-object v0

    const/4 v1, 0x1

    const/4 p0, 0x0 #←追記

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

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

4)android.policy/com/android/internal/policy/impl/GrobalAction$2.smaliをコピーして
android.policy/com/android/internal/policy/impl/GrobalAction$7.smaliにリネームしてテキストエディタで開く。

GlobalActions$2になっている箇所をGlobalActions$7に変更(3箇所)

# virtual methods
.method public onPress()V
    .registers 3

    .prologue
    .line 170
    iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions$7;->this$0:Lcom/android/internal/policy/impl/GlobalActions;

    #getter for: Lcom/android/internal/policy/impl/GlobalActions;->mContext:Landroid/content/Context;
    invoke-static {v0}, Lcom/android/internal/policy/impl/GlobalActions;->access$100(Lcom/android/internal/policy/impl/GlobalActions;)Landroid/content/Context;

    move-result-object v0

    const/4 v1, 0x1

    const/4 p0, 0x1 #←変更

    sput p0, Lcom/android/internal/app/ShutdownThread;->mReboot:I

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

5)android.policyをコンパイル
java -jar smali.jar android.policy -o classes.dex

6)android.policy.jarにコンパイルしたclasses.dexを追加
7za d -tzip android.policy.jar classes.dex
7za a -tzip android.policy.jar classes.dex

完成した3つを端末に適用すれば終わり

まだ実行していないけど、これでいいはず。

5 件のコメント:

  1. ますのすけ2012年7月30日 18:40

    はじめまして。お世話になります。
    locked BL ARC ICS 4.04ですが、ブートループに陥ります。
    自己満足の世界ですけど、私も電源オプションに再起動を追加したいんですがうまくいきません。
    ICSは難しいですね。

    返信削除
  2. コメントありがとう御座います。

    こんな事書いてますが、ICSでは一度も自作したことなかったりします。
    既に付加されている1式を解体して中身調べただけなんです。
    1度は自作してみねばと思いつつ・・・
    ごめんなさい。

    返信削除
    返信
    1. ますのすけ2012年8月1日 19:39

      こちらこそありがとうございます。
      私もGBでは頂き物ばかりでしたから(汗)
      >既に付加されている1式
      ななしさんは適用されているんですか?よかったら教えてくださると
      ありがたいです。

      削除
    2. ここから頂きました。
      http://forum.xda-developers.com/showthread.php?t=1534903
      日本語リソース追加
      たしかodexだったはずなのでdeodex
      この2点は自分で実行です(必要ならば)

      削除
  3. ますのすけ2012年8月4日 13:45

    返信ありがとうございます。
    自分の環境ではなぜかdeodexするとブートループしちゃいましたので、
    odexで再署名してぶちこんだら、うまくいきました。
    これで満足して常用できそうです。
    BL lockなSO-01C ICS 4.04ですが、今のところ問題無いですね。

    いろいろありがとうございました。

    返信削除