2012/01/20

アプリの無効/有効をコマンドで切り替える方法


Android4.0より搭載されたプリインアプリの無効化について。

プリインアプリ無効化時にどのような動作になるのか試験を行う場合、その都度
設定アプリに遷移して1つずつ無効化/有効化するのは非常に面倒です。
そこで、adb shellのpmコマンドを使用してコマンドラインからアプリの無効/
有効を切り替えたいと思います。

adb shellより、pmコマンドを実行するとオプション指定一覧が表示されます。
今回使用するのは下記コマンドです。

デバイス上のパッケージ一覧を表示します。
# pm list packages

オプション:
pm list packages: prints all packages, optionally only
   those whose package name contains the text in FILTER.  Options:
     -f: see their associated file.
     -d: filter to only show disbled packages.
     -e: filter to only show enabled packages.
   -s: filter to only show system packages.
     -3: filter to only show third party packages.
     -u: also include uninstalled packages.

よく使用するのは -e や -d あたりでしょうか。

有効中のパッケージ一覧を取得
# pm list packages -e

無効中のパッケージ一覧を取得
# pm list packages -d


次にpmコマンドから指定のパッケージの有効/無効を切り替える方法です。
これにはpm disable-userあるいはenableを使用します。

指定パッケージを無効化(ブラウザ無効化の例)
# pm disable-user com.android.browser

指定パッケージを有効化(ブラウザ有効化の例)
# pm enable com.android.browser

pm disableを実行すると設定アプリのアプリ一覧には表示されなくなってしま
います。
特に理由がない場合はdisable-userを指定するのが良いでしょう。

また、設定アプリからでは無効化できないアプリでもpmコマンドからはそれが
可能です。
設定アプリはDevicePolicyManager.packageHasActiveAdminsの値を参照して
無効化ボタンをdisableに設定しているにすぎません。
# このあたりはcom.android.settings.applications.InstalledAppDetails
のinitUninstallButtonsメソッドを確認した方がわかり易いと思います。

設定アプリのアプリ一覧で表示されているアプリのパッケージ名を知りたい場
合は、無効化時に出力されるログ「Force stopping package <Package名>」
から得ることができます。


ちなみに、エミュレータでは連携先アプリがいなくても「連携先アプリがない」
旨のToastが表示されるケースがあります。
これは開発用アプリ Fallbackアプリ が存在しているためです。
FallbackアプリがIntentを拾うのでActivityNotFoundExceptionが発生しません。

より実機に近い状態で試験したい場合はFallbackアプリを無効化すると良いで
しょう。
ラベル:Fallback  パッケージ:com.android.fallback

以上です。