Android计算应用/进程的线程数

时间:2014-06-09 17:18:04

标签: android multithreading adb

我需要监控应用程序的行为并收集有关如何创建/销毁线程的统计信息。我知道DDMS有一个线程视图,可以实时显示这些信息,但是我可以通过命令行获得相同的信息吗?我想创建自己的工具,记录这些信息及其过程。

澄清: 我正在寻找的是一个可以通过ADB传递的命令,它将列出在进程下运行的线程。这样,我可以在不同的时间点运行命令,以获得一段时间内所有线程的状态(线程数和它们的名称)。

2 个答案:

答案 0 :(得分:7)

有两种方法可以做到这一点 在Ubuntu 12.10的摩托罗拉Moto G上试过这个问题

  1. 您可以使用top(在ADB Shell下)列出所有设备上运行的线程。

    $ top -t
    PID   TID PR CPU% S     VSS     RSS PCY UID      Thread          Proc
    271   895  1   0% S  11120K   1892K     root     netd            /system/bin/netd
    272   272  0   0% S   1040K    200K     root     debuggerd       /system/bin/debuggerd
    274   274  2   0% S  63256K   7008K  fg system   surfaceflinger  /system/bin/surfaceflinger
    274   451  0   0% S  63256K   7008K  fg system   Binder_1        /system/bin/surfaceflinger
    

    因此,要获取任何特定流程的详细信息,您可以使用grep

    $ top -t | grep com.whatsapp
    PID   TID   PR CPU% S     VSS     RSS PCY UID      Thread          Proc
    15210 15210  0   0% S 550076K  51180K  bg u0_a96   com.whatsapp    com.whatsapp
    15210 15214  0   0% S 550076K  51180K  bg u0_a96   GC              com.whatsapp
    15210 15215  0   0% S 550076K  51180K  bg u0_a96   Signal Catcher  com.whatsapp
    15210 15216  0   0% S 550076K  51180K  bg u0_a96   Compiler        com.whatsapp
    

    要在主机上运行此功能,请使用

    $ adb shell top -t | grep com.whatsapp
    

    如果不支持grep,请使用Busybox

  2. 如果您正在寻找静态视图。您也可以使用ps

    $ ps -p 15210 -t                                         
    USER     PID   PPID  VSIZE  RSS   PRIO  NICE  RTPRI SCHED   WCHAN    PC         NAME
    u0_a96   15210 275   549036 52136 20    0     0     0     ffffffff 00000000 S com.whatsapp
    u0_a96   15214 15210 549036 52136 20    0     0     0     ffffffff 00000000 S GC
    u0_a96   15215 15210 549036 52136 20    0     0     0     ffffffff 00000000 S Signal Catcher
    u0_a96   15216 15210 549036 52136 20    0     0     0     ffffffff 00000000 S Compiler
    

    15210是您的流程的PID com.whatsapp

  3. 希望这能解决您的问题,让我知道它是否有效。

答案 1 :(得分:1)

在我有限的知识中,并且我可能完全错了,请看看:

public static Map<Thread,StackTraceElement[]> getAllStackTraces()    

文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getAllStackTraces()

  

返回所有活动线程的堆栈跟踪映射。地图键是   线程和每个map值都是StackTraceElement的数组   表示相应Thread的堆栈转储。归来了   堆栈跟踪采用为getStackTrace方法指定的格式。   调用此方法时,线程可能正在执行。堆栈   每个线程的跟踪仅代表一个快照和每个堆栈跟踪   可以在不同的时间获得。零长度数组将是   如果虚拟机没有堆栈跟踪,则返回映射值   有关线程的信息。

我希望有所帮助。