Xposed Frameworkモジュールでカスタマイズ:App Settings

昨日Xposed Frameworkモジュールを使ったドコモMVNO SIM利用時の問題を解消するパッチを紹介しましたが、Xposed Frameworkでできることはそれだけではありません。
Xposed Frameworkを使うことで可能になるカスタマイズ項目は多岐にわたり、しかもリスクが低い(もちろんリスクフリーではない)ことは大きなメリットなのですが、その割には知名度が低く、対応モジュールの数も現状ではあまり多くありません。
そして情報も少ない。
それにしても主要なモジュール配布サイトである


http://www.villainrom.co.uk/forum/microdownloads/


が現在ダウンしているのはいただけません。
そして特定のメーカー、端末専用のモジュールも多く、汎用的に使えるモジュールが少ないのも難。
そこで今回は「App Settings」という汎用のXposed Frameworkモジュールを紹介します。
これを使うと標準状態では不可能なアプリ毎の動作を個別にカスタマイズすることが可能になります。


App SettingsのXposed FrameworkモジュールのAPKファイルはここからダウンロードできます。
このエントリを書いている時点でのファイル名は「AppSettings04_1367747932_458.apk」。
それを端末にインストールしてXposed Installerを起動し、MODULESタブへ移動。
そこでApp Settingsモジュールを有効化し、端末を再起動すれば準備完了です。


アプリ一覧に「App Settings」が追加されているので、それを起動します。

動作をカスタマイズしたいアプリをリストから選び、Application SettingsのスイッチをONにするとカスタマイズ画面が開きます。

設定を変更したら右上の保存ボタン(フロッピーアイコン)を押して設定変更を適用します。
変更した項目は基本的に即時適用されます(=端末の再起動は不要)。
それではどんなことができるのかを見ていきましょう。


・DPI、フォントスケーリングの変更
表示されるフォントが大きすぎたり小さすぎたりして使いづらい、画面をより広く使いたい、といった場合にbuild.propを書き換えてシステムDPI値を変更し、それを解決する方法があります。
しかしこれだと端末全体で変更したDPI値が使われるため、アプリによっては表示が見にくくなったりしますし、それだけでなく動作に不具合が出ることもあります。
そこでApp Settingsを使うことでアプリ毎にDPI値を変更し、この問題を解決することができます。
方法論としては「システムDPIは変更せず、フォントサイズを変更したいアプリだけDPI値を変更、またはフォントスケーリングを変更する」「システムDPIを変更し、それによって不具合が出るアプリのDPI値を修正する」という2つが考えられます。
私は一部の端末でシステムDPI値を変更して使っている(画面を広く使うためデフォルトよりも小さい値に設定)こともあり、ここでは後者について解説します。
システムDPI値を変更することで不具合が出るアプリとしてここではspeedtest.netを例に説明します。
speedtest.netはシステムDPI値をデフォルトよりも小さい値にすると表示サイズが小さくなってしまいます。

そこでApp Settingsを使ってDPI値を端末(ここではGalaxy Note)本来のDPI値である320に設定。
「DPI」ボックスに指定したいDPI値を直接入力します。

左がApp SettingsでDPI値を変更する前、右が変更後。
私はbuild.propを編集しシステムDPI値を280に設定していますが、そうする前と同じサイズでの表示に戻りました。
カスタムROM(NeatROM Lite)を導入したGalaxy S IIでbuild.propを書き換えてシステムDPI値を変更すると標準ブラウザが起動できない(即強制終了してしまう)という問題があって困っていたのですが、同じ方法で解決できました。
そうすると画面表示が大きくなってしまい、表示できる情報量が減るという問題はフォントスケーリング値を変更することで解決。

システムDPI値を200に指定しているので、それと同じフォントサイズになるようフォントスケーリングを83%に設定。
ブラウザ側の設定でフォントサイズを変更する、という方法もありますが、それだとWebページのフォントサイズしか変更されないので、この方法を取りました。
とは言え標準ブラウザはあまり使わないのですが。


ロケールの変更
ロケールはシステムで設定されたそれを全てのアプリで使う仕様になっていますから、アプリ毎に違ったロケールを設定する、といったことはできません。
そのため「海外旅行時にGoogle Mapsアプリを英語地図で使いたい」とか「訳あってロケールを英語に設定しているが、ロケール設定が日本になっていないと正常動作しないアプリを使いたい」といった場合は一時的にシステムロケールを変更する必要があります。
しかしApp Settingsを使うとアプリ毎にロケール設定を変更できるので、システムロケールはそのままで上記の問題を解決できます。

Google Mapsを英語地図で使う設定にしたところ。
「Locale」タブから設定したいロケールを選択しますが、端末標準で設定できるロケールしか設定できない点は要注意。
よってMoreLocale2を使わないと日本ロケールに設定できない海外版Galaxy Note/S IIなどの端末ではアプリ別ロケールとして日本を設定することはできません(つまり上の例にある後者の使い方はできない)。
上の設定でちゃんと英語版のGoogle Mapsを開くことができました。


・画面回転設定の変更
「特定のアプリを横画面固定で使いたい」「画面が勝手に回転するのがウザイので通常は画面の自動回転をOFFにしているが、特定のアプリだけは自動回転する設定にしたい」と思っても、画面回転の設定は全てのアプリがシステムで設定されたそれを使うようになっているため、アプリ側でそのような設定ができない限りそういったことはできません。
しかしこれもApp Settingsで解決できます。

「Orientation」タブから設定したい動作を選択します。
常時縦位置(Always portrait)、常時横位置(Always landscape)、画面自動回転を強制(Force auto-rotation)が設定できます。
ここではXperia acro HDのワンセグアプリを画面自動回転させる設定にしました。
私は上記の例の後者の理由で画面自動回転をOFFにしていますが(Android端末だけでなくiPhoneでも同様)、ワンセグをフルスクリーンで見たい時にいちいち画面自動回転設定を切り替えるのが面倒(というか通知画面から切り替えできるトグルボタンがないと不可能)なので、ワンセグアプリだけ画面自動回転ONにできれば、と思っていたのでした。
しかしこの設定をすることでそのような動作をさせることが可能になり、願いが叶いました。
とは言えワンセグを使うことはほとんどないのですが。


パーミッションの変更
「アプリの動作には明らかに不要な(情報抜き取り系の)パーミッションを要求するので、インストール/アップデートしたくない」というアプリがたまにありますが、そういったアプリでもApp Settingsでその問題のパーミッションを無効化してしまえば解決(するかも知れません)。
ここではバージョンアップ時に「電話のステータス、IDの読み取り」(Read phone state and identity)のパーミッションが追加されたことでアップデートを見送っていたYahoo地図でこの機能を試してみます。

このように追加パーミッションを要求しています。

そんなパーミッション無効化してしまうから関係ねぇ、とばかりにアップデート。
アップデート後App Settingsを起動し、アプリリストからYahoo地図を選択し、Application SettingsをONにします。
そして左下の「Permissions」ボタンを押すとそのアプリが要求しているパーミッションのリストが開きます。

ここで「Revoke Permissions」をONにし、無効化したいパーミッションをタップするとこのように文字が取消線付きピンク文字に変わります。
OKを押してパーミッションリストを閉じ、メイン画面で設定を保存すればそのパーミッションが無効化されます。
パーミッションの無効化を行なった後試しにYahoo地図を起動してみると、ちゃんと起動、動作しました。
今回はうまくいきましたが、もちろん無効化したパーミッションを必要とする機能は使えなくなりますし、パーミッションを無効にすることにより起動しなくなったり、正常動作しなくなるアプリもあるので要注意。
これはアプリの仕様ですからどうにもならないので、パーミッション無効化は諦めましょう。

試しにspeedtest.netの位置情報利用に関するパーミッションを無効にして…

起動するとスピードテスト開始ボタンを押して測定画面が開いた直後に強制終了してしまい、使えなくなってしまいました。
これを応用すると「アプリの動作自体には必要ないが、広告表示のためにネット接続(Full Internet access)のパーミッションを要求しているアプリの広告を消す」といったことも可能です(とは言え私は試していませんが:AdAwayを導入しているので不要なため)。


このようにアプリの動作を様々にカスタマイズでき、これまで「これができればいいのにな」と思っていたことの多くが解決。
これはもう手放せませんね。