2013年1月3日木曜日

【Xperia AX SO-01E】戻るキー長押しでアプリキル(1)

戻るキーを長押しすると、最前面で起動中のアプリを終了する機能を追加します。
また、この機能を有効にするかどうか、設定画面で切り替えられるようにします。

いっぺんにやると長くなりそうですので、今回は設定画面に項目を追加する部分だけ説明します。

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

いじるファイルは、以下になります。
/system/app/Settings.apk
/system/app/Settings.odex

■Settings.apk
Settings.apkの作業フォルダ内、「res」フォルダ以下のxmlにリソース追加します。

まずres\values\public.xml。
おそらく2242行目あたりに"string"の末尾がありますので、その後に2行ほど追加します。
この例だと元々のstringのIDの末尾が"0x7f0706f2"ですので、"0x7f0706f3"、"0x7f0706f4"として追加。一応IDがかぶっていないかpublic.xml内を検索しておくと良いでしょう。
"kill_app_longpress_back"は項目名、"kill_app_longpress_back_summary"は説明の要約になります。

    <public type="string" name="transfer_data_option_title" id="0x7f0706f1" />
    <public type="string" name="transfer_data_to_sdcard_summary" id="0x7f0706f2" />
    <public type="string" name="kill_app_longpress_back" id="0x7f0706f3" />
    <public type="string" name="kill_app_longpress_back_summary" id="0x7f0706f4" />
    <public type="array" name="timezone_filters" id="0x7f080000" />
    <public type="array" name="date_format_values" id="0x7f080001" />

次にres\values\strings.xml。英語表記です。
</resources>の直前に追加で良いと思います。

    <string name="transfer_data_option_title">Miscellaneous</string>
    <string name="transfer_data_to_sdcard_summary">Transfer data from internal storage to SD card to free some space</string>
    <string name="kill_app_longpress_back">Kill app back button</string>
    <string name="kill_app_longpress_back_summary">Kill the foreground app by long-pressing the back key</string>
</resources>

続きましてres\values-ja\strings.xml。日本語表記です。
これも</resources>の直前に追加します。

    <string name="wps_popup_pin_accepted">PINが許可されました</string>
    <string name="tethering_confirmation_checkbox">今後表示しない</string>
    <string name="kill_app_longpress_back">長押しでアプリを終了</string>
    <string name="kill_app_longpress_back_summary">戻るボタン長押しでフォアグラウンドアプリを終了させる</string>
</resources>

もういっちょ、res/xml/development_prefs.xmlを編集します。
このファイルは設定→開発者向けオプションの項目リストにあたります。
最下部に</PreferenceScreen>、その上に</PreferenceCategory>があるので、その直前に1行追加します。これにより、設定画面の開発者向けオプションに1つ項目が増えます。

        <CheckBoxPreference android:title="@string/show_all_anrs" android:key="show_all_anrs" android:summary="@string/show_all_anrs_summary" />
        <CheckBoxPreference android:title="@string/kill_app_longpress_back" android:key="kill_app_longpress_back" android:summary="@string/kill_app_longpress_back_summary" />
    </PreferenceCategory>
    <com.sonymobile.settings.preference.IncludePreference settings:include="@xml/somc_add_development_prefs" />
</PreferenceScreen>

Settings.apkの方は以上です。

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

「.field private mShowAllANRs:Landroid/preference/CheckBoxPreference;」を検索(34行目くらい)。
その下にmKillAppLongpressBackフィールドを追加します。

.field private mShowAllANRs:Landroid/preference/CheckBoxPreference;

.field private mKillAppLongpressBack:Landroid/preference/CheckBoxPreference;  #追加

.field private mShowCpuUsage:Landroid/preference/CheckBoxPreference;

次に「.method private updateShowAllANRsOptions()V」を検索(806行目くらい)。
このメソッドが終わる部分(「.end method」、838行目あたり)の下に、新しく「updateKillAppLongpressBackOptions」というメソッドを追加します。

    return-void
.end method

.method private updateKillAppLongpressBackOptions()V  #この行から追加
    .registers 5

    .prologue
    const/4 v0, 0x0

    .line 416
    iget-object v1, p0, Lcom/android/settings/DevelopmentSettings;->mKillAppLongpressBack:Landroid/preference/CheckBoxPreference;

    invoke-virtual {p0}, Lcom/android/settings/DevelopmentSettings;->getActivity()Landroid/app/Activity;

    move-result-object v2

    invoke-virtual {v2}, Landroid/app/Activity;->getContentResolver()Landroid/content/ContentResolver;

    move-result-object v2

    const-string v3, "kill_app_longpress_back"

    invoke-static {v2, v3, v0}, Landroid/provider/Settings$Secure;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I

    move-result v2

    if-eqz v2, :cond_14

    const/4 v0, 0x1

    :cond_14
    invoke-virtual {v1, v0}, Landroid/preference/CheckBoxPreference;->setChecked(Z)V

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

.method private updateShowTouchesOptions()V

「.method private writeShowAllANRsOptions()V」を検索(1266行目くらい)。
このメソッドが終わる部分(「.end method」、1302行目あたり)の下に、新しく「writeKillAppLongpressBackOptions」というメソッドを追加します。

    goto :goto_13
.end method

.method private writeKillAppLongpressBackOptions()V  #この行から追加
    .registers 4

    .prologue
    .line 410
    invoke-virtual {p0}, Lcom/android/settings/DevelopmentSettings;->getActivity()Landroid/app/Activity;

    move-result-object v0

    invoke-virtual {v0}, Landroid/app/Activity;->getContentResolver()Landroid/content/ContentResolver;

    move-result-object v1

    const-string v2, "kill_app_longpress_back"

    iget-object v0, p0, Lcom/android/settings/DevelopmentSettings;->mKillAppLongpressBack:Landroid/preference/CheckBoxPreference;

    invoke-virtual {v0}, Landroid/preference/CheckBoxPreference;->isChecked()Z

    move-result v0

    if-eqz v0, :cond_17

    const/4 v0, 0x1

    :goto_13
    invoke-static {v1, v2, v0}, Landroid/provider/Settings$Secure;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z

    .line 413
    return-void

    .line 410
    :cond_17
    const/4 v0, 0x0

    goto :goto_13
.end method  #この行まで追加

.method private writeShowTouchesOptions()V

「.method public onCreate(Landroid/os/Bundle;)V」を検索(1491行目くらい)。
その217行くらい下(遠い…)に、「iput-object v3, p0, Lcom/android/settings/DevelopmentSettings;->mShowAllANRs:Landroid/preference/CheckBoxPreference;」(長い…)という部分があります(1708行目くらい)。その下に数行追加します。

    const-string v3, "show_all_anrs"

    invoke-virtual {p0, v3}, Lcom/android/settings/DevelopmentSettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;

    move-result-object v3

    check-cast v3, Landroid/preference/CheckBoxPreference;

    iput-object v3, p0, Lcom/android/settings/DevelopmentSettings;->mShowAllANRs:Landroid/preference/CheckBoxPreference;

    const-string v3, "kill_app_longpress_back"  #この行から追加

    invoke-virtual {p0, v3}, Lcom/android/settings/DevelopmentSettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;

    move-result-object v3

    check-cast v3, Landroid/preference/CheckBoxPreference;

    iput-object v3, p0, Lcom/android/settings/DevelopmentSettings;->mKillAppLongpressBack:Landroid/preference/CheckBoxPreference;  #この行まで追加

    .line 145
    const-string v3, "verifier_device_identifier"

「.method public onPreferenceTreeClick」を検索(1881行目くらい)。
その273行くらい下(これまた遠い…)に、「invoke-direct {p0}, Lcom/android/settings/DevelopmentSettings;->writeShowAllANRsOptions()V」という部分があります(2154行目くらい)。その後の「:cond_うんたら」の後に数行追加します。

    :cond_e1
    iget-object v0, p0, Lcom/android/settings/DevelopmentSettings;->mShowAllANRs:Landroid/preference/CheckBoxPreference;

    if-ne p2, v0, :cond_ea

    .line 465
    invoke-direct {p0}, Lcom/android/settings/DevelopmentSettings;->writeShowAllANRsOptions()V

    goto/16 :goto_7

    .line 466
    :cond_ea
    iget-object v0, p0, Lcom/android/settings/DevelopmentSettings;->mKillAppLongpressBack:Landroid/preference/CheckBoxPreference;  #この行から追加

    if-ne p2, v0, :cond_eb

    invoke-direct {p0}, Lcom/android/settings/DevelopmentSettings;->writeKillAppLongpressBackOptions()V

    goto/16 :goto_7

    :cond_eb  #この行まで追加
    iget-object v0, p0, Lcom/android/settings/DevelopmentSettings;->mForceHardwareUi:Landroid/preference/CheckBoxPreference;

「.method public onResume()V」を検索(2179行目くらい)。
その125行くらい下(ちと遠い)に、「invoke-direct {p0}, Lcom/android/settings/DevelopmentSettings;->updateShowAllANRsOptions()V」という部分があります(2304行目くらい)。その下に1行追加します。

    .line 192
    invoke-direct {p0}, Lcom/android/settings/DevelopmentSettings;->updateShowAllANRsOptions()V

    invoke-direct {p0}, Lcom/android/settings/DevelopmentSettings;->updateKillAppLongpressBackOptions()V  #追加

    .line 193
    return-void

項目1つ追加するだけでエラい追加っぷりですね。吐きそうです。
とにかく、Settings.odexの編集もこれで以上になります。

■仕上げ
上記変更後、deodex_Settings.apkを生成し、Settings.apkも含めCWMモードで端末に送信、dexopt-wrapper等の作業を行いつつ(deodex_Settings.apkからSettings.odex生成)、/system/appのSettings.apkとSettings.odexを置き換えてください。
reboot後、設定→開発者向けオプションの最下部に「長押しでアプリを終了」が追加されていることを確認してください。
もちろん、チェックが付けられるだけで、実際には機能しません。

0 件のコメント:

コメントを投稿