2013年7月28日日曜日

Xperia SP C5303 メニューに再起動追加

再起動タップ時にでる確認メッセージの置き換えがどうしてもうまくいかない(素人)なので、
妥協しまくって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$2GlobalActions$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 件のコメント:

コメントを投稿