なお、今回はあまり詳しくやりません。追加修正部分だけの紹介になります。
前提は以下です。
・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
.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
↓↓↓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 #変更
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後、「再起動」→キャンセル→「電源を切る」の流れで再起動にならないことを確認してください。
初心者ですみません。
返信削除deodex_framework.jarのbaksmali方法と、dexopt-wrapperはどうすればいいでしょうか?
コマンドを教えてください。
framework.odex に関しては「セルスタンバイ問題対策」の記事を参考にしてください。
削除ソースの書き換え以外の部分の手順は全く一緒です。
ありがとうございます。
返信削除VLでこちらの方法をやったら無限ループになってしまいました。
どうすれば導入できるでしょうか?
んー、他機種は正直どうなっているか分からないので、ちょっとずつ追加して、どこでダメになるか試行錯誤する、といった方法をとっていただくしかないですね。
削除特にレジスタ(変数)は環境によって変わってくるので、一歩間違うとすぐ動かなくなるでしょう。
最低限、javaでandroidの開発が出来る知識が無いと厳しいかと思います。
VL持ちの詳しい方がおられると良いのですが…。