ByteScope

am force-stop

端末を変える

あるアプリのプロセスとサービスをすべて終了させます。

コマンド
adb shell am force-stop
コマンド
アクティビティと intent(am)
リスク
端末を変える

構文

am force-stop <package>

使用例

  • am force-stop com.example

    アンインストールも消去もせずに、暴れているアプリを止めます。

  • top -b -n 1 -m 10

    何を止める前に、実際に CPU を食っているものを確認します。

出力の読み方

通常は何も出ません。無言を成功とみなし、`Error:` や例外、権限の行があれば失敗と考えます。確証が欲しければ、出力の不在を信じるのではなく、後で `top` にそのアプリのプロセスがないかを見てください。

出力フィールド

フィールド意味
(no output)コマンドが実行されました。
Error: …パッケージを解決できなかった、または呼び出しが拒否されました。

必要な権限

root も `adb root` も `su` も不要で、認可済みの `adb` 接続がすべてです。`am force-stop` は `ActivityManagerService.forceStopPackage` に届き、そこで呼び出し元の `android.Manifest.permission.FORCE_STOP_PACKAGES` が確認され、無ければ例外になります。Shell パッケージは自分のマニフェスト(`packages/Shell/AndroidManifest.xml`)でまさにその権限を宣言していて、だからこのコマンドはケーブルからだけ通り、他のほぼどこからも通りません。既定の効果範囲が思っているより広いのも、同じマニフェストのせいです。そこには `INTERACT_ACROSS_USERS_FULL` も入っていて、`runForceStop` はユーザー id を `UserHandle.USER_ALL` に設定して始まり、`--user` を渡したときだけ絞ります。つまり引数 1 つの素朴な形は、画面を見ている人のアプリを止めるのではなく、端末上のすべての Android ユーザーで同時に止めます。仕事用プロファイルも、セカンダリユーザーも、同じアプリのクローンもです。目の前のユーザーだけのつもりなら、明示してください。他に間に立つものはありません。確認も、ドライランも、取り消せるパッケージ単位の許可もなく、システムアプリの force-stop も止められません。user ビルドでは `adb root` はどのみち拒否されますし、shell が既に必要な権限を持っている以上、通ったところで何の足しにもなりません。

エラーメッセージの読み解き

メッセージ意味
Error: Unknown option: --user0`runForceStop` が受け付けるオプションは `--user` ただ 1 つです。それ以外は標準エラーにそのまま出て、`forceStopPackage` を呼ぶ **前に** -1 を返します。つまり `--user0` のようにくっつけた書き方、`-u` という略記、紛れ込んだ `--all` は、アプリを動かしたままにしておきながら、拒否ではなく警告のような顔で表示されます。行の口調ではなく終了コードを見てください。
Exception occurred while executing 'force-stop':`Throwable` が `onCommand` から抜け、標準エラーに空行とこのバナーとトレースが出ます。`java.lang.IllegalArgumentException: Argument expected after "force-stop"` は、パッケージ名を渡していないという意味です。`android.permission.FORCE_STOP_PACKAGES` を名指しする `java.lang.SecurityException` は呼び出しが shell でも root でもなかったという意味で、ケーブル越しでは普通、`run-as` の中にいて uid 2000 でなくなっているということです。
Unknown command: force stopハイフンはサブコマンド名の一部です。引用したり分けたりすると `am` には `force` だけが見え、`handleDefaultCommands` がこれを **標準出力** に出して、どのプロセスにも触れずに -1 を返します。成功した force-stop の無言とは似ても似つかないので、そこだけは救いです。
cmd: Can't find service: activity`am` は `cmd activity` のラッパーで、その `cmd` がサービスマネージャに `activity` を見つけられませんでした。何も止まっていません。`system_server` が `activity` を公開する前の起動途中なら想定内で、パッケージ名が間違っている合図ではありません。

何が変わるか、そして戻る道

何も削除されず、次に起動されるかブロードキャストで起こされれば、アプリはまた動き出します。ただしプロセス内の未保存の状態は失われ、そのアプリが予約していたアラームやジョブは、再び動くまで取り消されます。元に戻すコマンドはありません。直し方はアプリを開くことです。

バージョンとメーカーに関する注意

  • CPU 順に並んだプロセス表からの force-stop は押し間違いが起きやすく、放っておくつもりだったアプリが未保存の状態を失います。
  • 無効化とは違います。アプリはいつでも再び動き出せます。

これには UI があります

Android System Monitor はこのコマンドを USB 経由で実行し、返ってきたものを解析します。Chromium 系ブラウザだけで、SDK も不要、どこにもアップロードしません。

Android System Monitor を開く

関連コマンド

am force-stop と同じ作業で出てくるコマンド。

コマンド何をするか
top1 回分のプロセス表:CPU 使用率、メモリ、状態、コマンドライン。
dumpsys meminfoどのプロセスがメモリを最も使っているかを、PSS(比例配分したサイズ)で表示します。
am startコンポーネント指定または intent 指定でアクティビティを起動します。ディープリンクの解決を確かめる最短経路です。

他のアクティビティと intent(am)コマンド

コマンド何をするか
am broadcastブロードキャスト intent を送ります。SystemUI の demo mode などプラットフォームのレシーバをシェルから動かす方法です。

Web ADB ツール群のパーサを書きながら、AOSP・toybox・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。

よくある質問

adb shell のコマンドはどう実行しますか?

端末で開発者向けオプションと USB デバッグを有効にし、ケーブルを繋いだうえで、platform-tools を入れた機械から adb shell <コマンド> を実行します。adb shell だけを実行すれば対話プロンプトが出て、接頭辞なしで打てます。スクリーンショットのようにバイナリを出力するコマンドでは adb shell ではなく adb exec-out を使ってください。素のシェルサービスは端末を割り当て、それが改行のバイトを書き換えてデータを壊します。

adb shell のコマンドに root は必要ですか?

このリファレンスにあるものには不要です。すべて shell ユーザーとして動き、自分の Android ユーザー向けのパッケージ管理、ほとんどの dumpsys サービスの読み取り、設定プロバイダへの書き込み、入力の注入、共有ストレージの読み取りができます。root が必要なのはこのリファレンスがあえて避けていること、つまり他のアプリのプライベートデータの読み取り(debuggable なビルドに対する run-as を除く)、システムパーティションへの書き込み、/data/anr の直接読み取りです。

自分の端末では出力が違って見えるのはなぜ?

Android のバージョンか、メーカーのどちらかです。一部のフラグやフィールドは特定のリリースから入ったもので、それはコマンドごとに注記しています。残りはメーカーによる改変で、いちばん影響が大きいのは dumpsys です。ダンプはデバッグ出力で、そのテキストはサービスの作者が最後に印字した内容そのもの、しかもメーカーはそれを変えて自分の変更をバックポートします。フィールドは位置ではなく名前で読み、見慣れない形は失敗ではなく差分として扱ってください。

端末ではなくブラウザから実行できますか?

多くのコマンドは可能です。このサイトの Web ADB ツール群は、Chromium 系のデスクトップブラウザから WebUSB で端末と話し、SDK のインストールも不要、どこにもアップロードしません。各ページは、該当するツールがあればそこへリンクしています。知っておく価値のある制限が 2 つあります。ADB インターフェイスを保持できるプログラムは同時に 1 つだけなので、デスクトップの adb server は先に止める必要があります。そして adb forward と adb reverse はブラウザでは一切動きません。

打つより押したい場合は、Web ADB Toolkit がこの種のコマンドをブラウザから USB 経由で実行します。あるいは全コマンドを見る。