Androidアプリを実行しているプロセスIDとプロセス名をプログラムで調べる方法を紹介します。
プロセスとは
Android(ベースはLinux)はマルチタスクのOS(Operating System)です。
ここでいうタスクはOS上で実行されているプログラムのことを示しています。
従って、マルチタスクとは複数(マルチ)のプログラム(タスク)を同時に実行できるという意味です。
しかし、「複数を同時に実行できる」といっても、リソース(CPU、メモリー、センサーなどのコンピュータ資源)は端末上に限られた数や量しかありません。
ですので、OSはリソースを分割してプログラム毎に割り当てます。
このリソースを割り当てる単位がプロセスです。
「プログラム毎≒リソースの割り当て単位≒プロセス」になるので、「プログラムの実行単位がプロセスである」と語られる場合もあります。
「adb shell ps」コマンドを用いればOS内に存在するプロセスの一覧が見られます。多くのプロセスの存在を確認できると思います。
# ps USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 8232 1468 SyS_epoll_ b1fcf424 S /init root 2 0 0 0 kthreadd 00000000 S kthreadd root 3 2 0 0 smpboot_th 00000000 S ksoftirqd/0 root 5 2 0 0 worker_thr 00000000 S kworker/0:0H ... u0_a50 12723 1345 1109968 33652 SyS_epoll_ af07d424 S com.android.printspooler u0_a1 12759 1345 1117292 43096 SyS_epoll_ af07d424 S android.process.acore u0_a26 27425 1345 1117116 37196 SyS_epoll_ af07d424 S com.android.calendar u0_a2 27439 1345 1113156 36752 SyS_epoll_ af07d424 S com.android.providers.calendar u0_a40 27670 1345 1116820 35016 SyS_epoll_ af07d424 S com.android.gallery3d system 27687 1345 1108720 35352 SyS_epoll_ af07d424 S com.android.keychain u0_a48 27703 1345 1108004 31380 SyS_epoll_ af07d424 S com.svox.pico ... root 30323 30150 6264 1404 0 b5615424 R ps
OS(Android)上でプログラムを実行しようとした場合は、必ずこのプロセスが作成されて、その中でプログラムが実行されます。
OSはこのプロセスを管理するためにプロセスID(PID)という番号を付けています。また、プロセスIDに関連付けられたプロセス名を持ちます。
Androidの場合、プロセス名はアプリ名(パッケージ名を伴った)になるのが普通です。
プロセスIDとプロセス名を調べるプログラム
プロセスIDとプロセス名を調べるプログラムは次のようになります。
class SysInfo { companion object Utility { fun logProcess(context: Context, tag: String): Unit { val procId = Process.myPid() var procName = "" val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager for (procInfo in manager.runningAppProcesses) { if (procInfo.pid == procId) { procName = procInfo.processName break } } Log.i(tag, "Process = %s(%d)".format(procName, procId)) } } }
public class SysInfo { public static void logProcess(Context context, String tag) { int _ProcId = Process.myPid(); String _ProcName = ""; ActivityManager _Manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); for (RunningAppProcessInfo _ProcInfo: _Manager.getRunningAppProcesses()) { if (_ProcInfo.pid == _ProcId) { _ProcName = _ProcInfo.processName; break; } } Log.i(tag, String.format("Process = %s(%d)", _ProcName, _ProcId)); } }
自身を実行しているプロセスIDはProcessクラスが持っています。プロセス名はActivityManagerが持つプロセスの情報からプロセスIDを頼りに探します。
プログラムの実行結果は次のようになりました。
package com.example.android.myapp ... class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { ... // --- プロセス確認 logProcess(this, "Main") } }
package com.example.android.myapp ... public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { ... // --- プロセス確認 logProcess(this, "Main") } }
I/Main: Process = com.example.android.myapp(30031)
プロセスIDはプロセスが作成された時点でOSが付けます。同じプログラムでも作成された時点が異なれば違う番号になります。
関連記事: