2012年12月31日月曜日

【Xperia AX SO-01E】電源ボタン長押しメニューに「再起動」追加(2)

電源メニューに「再起動」を追加する以前の記事で、そのままだと「再起動」→キャンセル→「電源を切る」→OKの流れで再起動になってしまう不具合が残ってしまっていました。今回の記事では、そこを修正します。
なお、今回はあまり詳しくやりません。追加修正部分だけの紹介になります。

前提は以下です。
・rootとってあること
・作業PCはadbコマンドが使える環境であること
・作業PCにjavaが入っていること
・端末のビルド番号は9.0.G.0.247
・CWMを導入してあること
・母艦はWindows 7
・トラブっても自力で復旧できること(つまり自己責任)

いじるファイルは、以下になります。
/system/framework/android.policy.odex
/system/framework/framework.odex

■framework.odex
framework.odexをbaksmaliした展開先の中で、以下のファイルを探してテキストエディタで開きます。
com\android\internal\app\ShutdownThread.smali

「.method public static reboot(Landroid/content/Context;Ljava/lang/String;Z)V」を検索(392行目あたり)
このメソッドが終わる部分(「.end method」、412行目あたり)の下に、新しく「doShutdown」というメソッドを追加します。

    return-void
.end method

.method public static doShutdown(Landroid/content/Context;Z)V  #この行から追加
    .registers 3
    .parameter "context"
    .parameter "confirm"

    .prologue
    const/4 v0, 0x0

    sput-boolean v0, Lcom/android/internal/app/ShutdownThread;->mReboot:Z

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

    return-void
.end method  #この行まで追加

.method public static rebootOrShutdown(ZLjava/lang/String;)V

「電源を切る」の時はここを経由させることによって、mReboot(再起動かどうかのフラグ)をちゃんとクリアしてから終了処理に入るようにします。
以上、書き換えたら上書き保存。

■android.policy.odex
android.policy.odexをbaksmaliした展開先の中で、以下のファイルを探してテキストエディタで開きます。
com\android\internal\policy\impl\GlobalActions$2.smali

「.method public onPress()V」を検索(39行目あたり)
その13行くらい下(52行目あたり)の「->shutdown(」を「->doShutdown(」に変更します。

    const/4 v1, 0x1

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

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

■仕上げ
上記変更後、deodex_framework.jarとdeodex_android.policy.jarを生成し、CWMモードで端末に送信、それぞれdexopt-wrapper等の作業を行い、/system/frameworkのframework.odexとandroid.policy.odexを置き換えてください。
reboot後、「再起動」→キャンセル→「電源を切る」の流れで再起動にならないことを確認してください。

4 件のコメント:

  1. 初心者ですみません。
    deodex_framework.jarのbaksmali方法と、dexopt-wrapperはどうすればいいでしょうか?
    コマンドを教えてください。

    返信削除
    返信
    1. framework.odex に関しては「セルスタンバイ問題対策」の記事を参考にしてください。
      ソースの書き換え以外の部分の手順は全く一緒です。

      削除
  2. ありがとうございます。
    VLでこちらの方法をやったら無限ループになってしまいました。
    どうすれば導入できるでしょうか?

    返信削除
    返信
    1. んー、他機種は正直どうなっているか分からないので、ちょっとずつ追加して、どこでダメになるか試行錯誤する、といった方法をとっていただくしかないですね。
      特にレジスタ(変数)は環境によって変わってくるので、一歩間違うとすぐ動かなくなるでしょう。
      最低限、javaでandroidの開発が出来る知識が無いと厳しいかと思います。

      VL持ちの詳しい方がおられると良いのですが…。

      削除