命令 adb shell ps
- -t 查看进程中线程的信息
- -x 查看utime和stime
- -P 查看属性
- -p 查看调度策略,通常是查看一个app处于前台还是后台
- -c 查看哪一个CPU在执行这个进程
- name|pid 用名字或pid过滤
例子(1) 查看包名为com.eat的线程,也就是com.eat应用的UI线程。
- adb shell ps -t |grep com.eat
- app_62 21964 141 127748 17012 ffffffff 00000000 S com.eat
UID: app_62 (程序安装的时候,系统分配的。Linux系统是多用户系统,在Android中,一个用户就相当一个应用程序。)
PID: 21964(进程ID)
PPID:141(这个是Zygote进程,因为所有的Android程序都是从这个进程“孵化”出来的。)
另外,也可以用DDMS去查看进程的信息。
(2) 查看app_62这个应用程序中所有的线程。
- adb shell ps -t |grep app_62
- app_62 21964 141 127748 17012 ffffffff 00000000 S com.eat
- app_62 21965 21964 127748 17012 ffffffff 00000000 S HeapWorker
- app_62 21966 21964 127748 17012 ffffffff 00000000 S GC
- app_62 21967 21964 127748 17012 ffffffff 00000000 S Signal Catcher
- app_62 21968 21964 127748 17012 ffffffff 00000000 S JDWP
- app_62 21969 21964 127748 17012 ffffffff 00000000 S Compiler
- app_62 21970 21964 127748 17012 ffffffff 00000000 S Binder Thread #
- app_62 21971 21964 127748 17012 ffffffff 00000000 S Binder Thread #
一个崭新的应用程序包括不下10个线程,大多数都是Dalvik的内部线程。从应用程序的角度,不需要关心它们。
除了com.eat以外的其他所有线程的PPID都是21966,也就是com.eat的PID。这是因为这些线程都是从UI线程孵化出来的。
要关心的有3个线程,分别为:
- app_62 21964 141 127748 17012 ffffffff 00000000 S com.eat
- app_62 21970 21964 127748 17012 ffffffff 00000000 S Binder Thread #
- app_62 21971 21964 127748 17012 ffffffff 00000000 S Binder Thread #
不难看出,com.eat是UI线程;另外2个Binder线程用来调用系统的一些服务,一个是ApplicationThead,一个是ViewRoo.W对象。