22

アプリケーションの PID を提供する必要があるスクリプトに取り組んでいます。次のコマンドですべてのプロセスを PID とともに一覧表示でき、アプリケーションのエントリを確認できました。

adb シェル ps

これにより、プロセスの膨大なリストが得られます。そして、単一のエントリ (さらに別のコマンドに提供できる) が必要なので、この結果をパッケージ名でフィルタリングしたいと考えています。Windows マシンで grep コマンドが機能しません。次のコマンドも試しましたが、役に立ちませんでした。

adb シェル ps 名:my_app_package

4

4 に答える 4

33

Android 7.0 以降、パッケージ名でプロセス ID を見つける最も簡単な方法は、次のpidofコマンドを使用することです。

usage: pidof [-s] [-o omitpid[,omitpid...]] [NAME]...

Print the PIDs of all processes with the given names.

-s      single shot, only return one pid.
-o      omit PID(s)

次のように実行するだけです:

adb shell pidof my.app.package

7.0 より前の Android では、コマンドを使用してから、組み込みの値によるフィルター (Android アプリの場合はパッケージ名の最後の 15 文字) またはコマンドpsを使用して、その出力を解析していました。名前の最後の 15 文字が数字で始まる場合、フィルタは機能せず、Android 4.2 までデフォルトで含まれていませんでした。しかし、適切なプロセス ラインが見つかった後でも、値を抽出する必要がありました。commgrepcommgrepPID

それには複数の方法がありました。プロセスの検索と PID の抽出を 1 つのsedコマンドで実行する方法を次に示します。

adb shell "ps | sed -n 's/^[^ ]* *\([0-9]*\).* my\.app\.package$/\1/p'"

ここでも問題は、sedAndroid 6.0 までデフォルトで含まれていなかったことです。

ただし、古いデバイスを使用する必要がある場合は、次の Android バージョンに依存しないソリューションをいつでも使用できます。外部コマンドは使用せず、Android シェルの組み込みのみを使用します。

adb shell "for p in /proc/[0-9]*; do [[ $(<$p/cmdline) = my.app.package ]] && echo ${p##*/}; done"

PID を探す最も一般的な理由は、 などの他のコマンドで使用することkillです。logcat実行中の複数のインスタンスがあり、それらすべてを一度に正常に終了したいとしましょう。最後のコマンドで を次のようにecho置き換えます。kill -2

adb shell "for p in /proc/[0-9]*; do [[ $(<$p/cmdline) = logcat ]] && kill -2 ${p##*/}; done"

Linux/OSX シェルからコマンドを実行する場合は に"置き換えます。'

于 2013-03-25T19:04:01.957 に答える
14

を使用する代わりにadb shell ps、まず入力adb shellしてから使用してpsください。

ステップバイステップ:

  1. adb shellデバイス(またはエミュレータ)が接続されている状態でコマンドを入力してください。
    (コマンドラインの接頭辞はshell@android:/ $、このコマンドを実行した後のものです。)

  2. 入力しますps | grep <package_name_to_be_filtered>(つまりps | grep com.google)。


C:> adb shell
shell@android:/ $ ps | grep com.google
u0_a64  3353  2467  903744 52904 ffffffff 00000000 S com.google.process.location
u0_a64  3426  2467  893964 49452 ffffffff 00000000 S com.google.process.gapps
于 2014-12-16T11:53:47.870 に答える
1

ps によって表示されるプロセスは、テキスト検索に使用されるフィルターである grep を介して出力をパイプすることにより、特定のユーザーに属するプロセスに限定できます。たとえば、ユーザー名が adam のユーザーに属するプロセスは、次のように表示できます。

ps -ef | grep adam

-e オプションは、現在実行中のすべてのプロセスに関する情報のリストを生成します。-f オプションは、-l オプションよりも各プロセスの情報項目が少ないリストを生成します。

于 2013-03-25T06:43:22.793 に答える