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,压缩等等)