8

私が書いたネイティブアプリケーションは/proc/PID/statusname変数を使用しています。ただし、ステータスファイルのname変数が不完全であるようです。たとえば、テスト時にAndroid電卓を開き、PSからPIDを検索して、対応する/proc/PIDフォルダーに移動しました。次に、ステータスファイルをキャットして確認します

Name: oid.calculator

PSコマンドはを示していますcom.android.calculatorpackages.xmlを示していますcom.android.calculator。他のいくつかの電話(4.0.4を実行しているRazr Maxx、同じOSバージョンを実行しているGoogle Nexus)でテストしたところ、同様の動作に気づきました。

4

1 に答える 1

15

これはLinuxカーネルの機能によるものです。プロセスには2つの異なる名前があります。

  • 名前の1つは、実行可能ファイルへのパスの最後のコンポーネントです。たとえばnative_executable、アプリケーションがにある場合など/data/apps/com.example.hello/native_executableです。Nameこれは、のフィールドに表示される名前です/proc/PID/status。カーネルはそれを15文字に切り捨てるので、この場合はが含まれますnative_executab
  • もう1つの名前は、アプリケーションをコマンドラインパラメーター#0(argv[0]C、args[0]Java)として呼び出すプログラムによって渡されます。これは、の先頭に表示され、表示される名前/proc/PID/cmdlineですps
  • 実行可能ファイルへのパスは、シンボリックリンクのターゲットでもあり/proc/PID/exeます。

慣例により、プログラムが別のプログラムを起動するときは、実行可能ファイルの名前をコマンドラインパラメータ0として使用する必要がありますが、そうでない場合もあります。のNameフィールドは、/proc/PID/status常にカーネルによって実行可能ファイルの(切り捨てられた)名前に設定されます。

これは一般的なLinuxの機能です。プロセスの名前にスペースが埋め込まれている場合、標準ツールを使用してプロセスのフルネームを取得できますか?も参照してください。AskUbuntuで。

アプリケーション自体は、後で両方の名前を変更できます(長さの制約はありますが)。Dalvikはこの機能を使用して、アプリケーションを区別します。すべてのアプリケーションは、同じネイティブ実行可能ファイルに由来します/sytem/bin/app_process。それらをすべて呼び出すのではなくapp_process、VMは両方の名前をアプリケーションパッケージ名に変更します。の名前は/proc/PID/status15文字に制限されているため、切り捨てられます。から長い名前を取得できます/proc/PID/cmdline(最初のヌルバイトまで読み取ります)。

于 2013-01-04T18:59:39.650 に答える