[置顶] android性能测试工具之dumpstate

dumpstate类似于dumpsys都是android提供给开发者的帮助了解系统运行状态的利器。


从main函数看起:

1. 设置执行dumpstate这个命令的进程的一些属性

    使它不会占用过多系统资源,即利用setpriority来告知内核它可以随时被调度

    因为在手机系统信息,通过proc/self/oom_adj接口来告知内核(-17这是一个特殊的参数,详见man proc),在寻找可以被kill掉的进程时,忽略该进程。

    /* set as high priority, and protect from OOM killer */                                                                                       
    setpriority(PRIO_PROCESS, 0, -20);                                                                                                            
    FILE *oom_adj = fopen("/proc/self/oom_adj", "w");                                                                                             
    if (oom_adj) {                                                                                                                                
        fputs("-17", oom_adj);                                                                                                                    
        fclose(oom_adj);                                                                                                                          
    }


2. 如果有root权限,就可以从dalvik处获得各种dalvik提供的trace信息
    利用了utils/中的dump_vm_traces函数,
    其中通过proc/[pid]/exe的link的程序如果是app_process,再找到对应pid下的cmdline过滤掉根zygote,即得到所有由Android系统通过zygote所fork出来的所有的dalvik process(即各个APK)。
    从这里可以看出,所有的APK都是由app_process这个应用从跟zygote所fork出来。
    例如,
    #ps
    ...
    app_67    9986  172   99464  21012 ffffffff afd0c75c S com.keramidas.TitaniumBackup
    app_80    9995  172   116304 32656 ffffffff afd0c75c S com.hiapk.marketpho
    ...
    
    # ls -l /proc/9986/exe
    lrwxrwxrwx    1 app_67   app_67           0 Oct 19 15:12 /proc/9986/exe -> /system/bin/app_process
    # cat /proc/9986/cmdline
    com.keramidas.TitaniumBackup#

3. 解析参数

    中间一个有一个关于使用socket的参数值得看一下
    它使用到了由init.rc中定义的专门给dumpstate使用的socket

    service dumpstate /system/bin/dumpstate -s
    socket dumpstate stream 0660 shell log
    disabled
    oneshot

    相关启动各种系统service的init.rc的命令参见/init/readme.txt
    相关的init.rc中的权限概念,参见http://blog.csdn.net/zmyde2010/article/details/6312615

   
4. 如果有root权限,拿到控制vibrator的权限和获得kernel启动的cmd参数
   vibrator用来在dumpstate结束之后震动以提示用户。这是一个在嵌入式设备中常用的提示技巧,有时候也会用简单一个声音提示。
   kernel的启动参数会在dump出来的信息中显示。
   
5. 根据dumpstate的参数做一些简单的准备,然后调用dumpstate()
   关键的dumpstate函数
   5.1 通过property_get获得一些从kernel cmdline及vendor提供的property信息(参见default.prop, build.prop中的预设值)
   5.2 通过proc系统获得各种内存管理系统提供的信息(如, /proc/meminfo, top等等),其中利用了android提供的一个procrank命令获得制定进程的信息(参见我的另一篇文章,《Android性能分析工具之procrank》)
   5.3 dump logcat中的信息和一些网络信息(netcfg, /proc/net/XXX下的内容)
   5.4 dump 一些dalvik收集的trace信息
   5.5 dump properties信息
   5.6 各种通过sysfs接口暴露出来的kernel信息
   5.7 vold, native packages, led灯等信息
   5.8 调用dumpsys,显示dumpsys的信息

6. dumpstate()结束之后的一些后续处理(文件copy,压缩等等)


你可能感兴趣的:(android,socket,properties,Stream,service,测试工具)