妥協しまくってjarファイル3つで完結するようにしました。
メッセージのリソースIDの振り分けがうまくいかない。
追加手順参考:備忘録的な何か。 : 【Android】XPERIA Zに再起動メニューを追加してみた
コマンド参考:キューブ実験室: 【Xperia AX SO-01E】電源ボタン長押しメニューに「再起動」追加(1)
妥協箇所:メニューの再起動の文言、アイコンを流用。確認メッセージは”電源を切る”と同じ。
手順としては各jarファイルを展開・修正・再作成・置き換えです。framework-res.apkの修正をカットしたので少しは楽に・・・
1.ファイルの展開まではCUBE実験室さんのとおりです(1.と2.)。
deodex化前提なので、deodex化してるとodexファイルがありませんが・・・(追記予定)
2.jarファイルの編集。ほとんど備忘録的な何か。さんの通りですが、足りない所もあるので補足こみ。
1)android.policy.jar
・android.policy.jar\com\android\internal\policy\impl\GlobalActions$2.smaliをコピーして
GlobalActions$11.smaliにリネーム。
・GlobalActions$11.smaliをテキストエディタで開いて、GlobalActions$2をGlobalActions$11に置換する。
・onPressメソッド内でshutdownを呼び出している部分(69行目)をrebootに変更して保存する。
変更前
invoke-interface {v0}, Landroid/view/WindowManagerPolicy$WindowManagerFuncs;->shutdown()V |
変更後
invoke-interface {v0}, Landroid/view/WindowManagerPolicy$WindowManagerFuncs;->rebootNormal()V |
2)GlobalActions.smali
・android.policy.jar\com\android\internal\policy\impl\GlobalActions.smaliを開く。
・666行目に追記する。これで”電源を切る”、”機内モード”の間に”端末の再起動”が入ります。
・”0x108005f”が文字、”0x1040272”がアイコンのリソースID。
IDの文字のヒモ付の一覧は、framework-res.apk\res\values\public.xml、
日本語の一覧はframework-res.apk\res\values-ja\strings.xml
追記前
invoke-direct {v2, v0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$2;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V invoke-virtual {v1, v2}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z .line 236 move-object/from16 v0, p0 iget-object v1, v0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList; ここに追記 move-object/from16 v0, p0 iget-object v2, v0, Lcom/android/internal/policy/impl/GlobalActions;->mAirplaneModeOn:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction; |
追記後
invoke-direct {v2, v0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$2;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V invoke-virtual {v1, v2}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z .line 236 move-object/from16 v0, p0 iget-object v1, v0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList; new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$11; const v3, 0x108005f const v4, 0x1040272 move-object/from16 v0, p0 invoke-direct {v2, v0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$11;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V invoke-virtual {v1, v2}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z .line 236 move-object/from16 v0, p0 iget-object v1, v0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList; move-object/from16 v0, p0 iget-object v2, v0, Lcom/android/internal/policy/impl/GlobalActions;->mAirplaneModeOn:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction; |
2)framework.jar
・framework.jar\android\view\WindowManagerPolicy$WindowManagerFuncs.smaliを開く。
・rebootSafeMode()Vの.end methodの下rebootNormalのmethodを追加
追記前
.method public abstract rebootSafeMode()V .end method ここに追記 .method public abstract reevaluateStatusBarVisibility()V .end method |
追記後
.method public abstract rebootSafeMode()V .end method .method public abstract rebootNormal()V .end method .method public abstract reevaluateStatusBarVisibility()V .end method |
3)services.jar
・services.jar\com\android\server\wm\WindowManagerService.smaliを開く。
・rebootSafeMode()Vの.end methodの下(27757行ぐらい)rebootNormalのmethodを追加
・ ”const/4 v2, 0x1”を”const/4 v2, 0x0”にすると、確認メッセージが省略されて即再起動(確か)
追記前
.method public rebootSafeMode()V 省略 .end method ここに追記 .method final rebuildAppWindowListLocked()V |
追記後
.method public rebootSafeMode()V 省略 .end method .method public rebootNormal()V .registers 4 .prologue .line 5223 iget-object v0, p0, Lcom/android/server/wm/WindowManagerService;->mContext:Landroid/content/Context; const-string v1, "now" const/4 v2, 0x1 invoke-static {v0, v1, v2}, Lcom/android/server/pm/ShutdownThread;->reboot(Landroid/content/Context;Ljava/lang/String;Z)V .line 5224 return-void .end method .method final rebuildAppWindowListLocked()V |
4.jarファイルの再作成。CUBE実験室さんのとおりです(4.と5.)。
5.元のjarファイルをバックアップして、新ファイルに置き換え。コマンドでもいいのですが、
面倒臭がって端末のアプリ↓で全部やります。
ファイルマネージャ - Google Play の Android アプリ
1)4.で作った新jarファイルを端末にコピー
2)/system/frameworkを開く→”複数選択”→android.policy.jar、framework.jar、services.jarを選択→
”コピー”→コピー先フォルダに移動後、”貼り付け”でバックアップ
3)新jarファイルを置いたフォルダに移動→”複数選択”→新ファイル3つ選択→”切り取り”→
/systemに移動後、”貼り付け”
4)パーミッションの変更。jarファイルを長押し→”権限”→644に変更する(画像の状態)
5)”複数選択”→新ファイル3つ選択→”切り取り”→/system/frameworkに移動後、”貼り付け”
カバーしますか?で”はい”で上書き。端末の電源再投入で完了(途中Androidのアップデートが入ります)
もし、電源キー長押しで即再起動がかかるなどの不具合があった場合は、2)で取ったバックアップを
3)4)の手順で戻せば元に戻ります。
備考:一度/systemにファイルを移動させているのは長押しで”権限”がでないためとその他のファイルが少ない。
0 件のコメント:
コメントを投稿