また、この機能を有効にするかどうか、設定画面で切り替えられるようにします。
いっぺんにやると長くなりそうですので、今回は設定画面に項目を追加する部分だけ説明します。
前提は以下です。
・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" />
<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>
<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>
<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>
<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;
.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
.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
.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"
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;->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;if-ne p2, v0, :cond_eb
invoke-direct {p0}, Lcom/android/settings/DevelopmentSettings;->writeKillAppLongpressBackOptions()V
goto/16 :goto_7
:cond_eb #この行まで追加
「.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
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 件のコメント:
コメントを投稿