Android Top命令实现
最近有个性能分析问题,发现使用Top和Qcom Profiler分析得到的数据存在差异,怀疑是Top命令统计的是 top -d value(second default 3s
秒内的平均值,而qcom Profiler 统计的却可以精确到us。于是想修改下Top的源码,将top命令统计的时间间隔减小到ms。
top命令的源码在:
external\toybox\toys\posix\ps.c
void top_main(void)
{
sprintf(toybuf, "PID,USER,%s%%CPU,%%MEM,TIME+,%s",
TT.top.O ? "" : "PR,NI,VIRT,RES,SHR,S,",
toys.optflags&FLAG_H ? "CMD:15=THREAD,NAME=PROCESS" : "ARGS");
if (!TT.top.s) TT.top.s = TT.top.O ? 3 : 9;
top_setup(toybuf, "-%CPU,-ETIME,-PID");
if (TT.top.O) {
struct strawberry *fields = TT.fields;
fields = fields->next->next;
comma_args(TT.top.O, &fields, "bad -O", parse_ko);
}
top_common(merge_deltas);
}
接着
static void top_setup(char *defo, char *defk)
{
TT.top.d *= 1000;//刷新时间top.d*1000该为TT.top.d *= 1;
if (toys.optflags&FLAG_b) TT.width = TT.height = 99999;
else {
TT.time = millitime();
set_terminal(0, 1, 0);
sigatexit(tty_sigreset);
xsignal(SIGWINCH, generic_signal);
printf("\033[?25l\033[0m");
}
shared_main();
comma_args(TT.top.u, &TT.uu, "bad -u", parse_rest);
comma_args(TT.top.p, &TT.pp, "bad -p", parse_rest);
TT.match_process = shared_match_process;
default_ko(defo, &TT.fields, "bad -o", TT.top.o);
dlist_terminate(TT.fields);
// First (dummy) sort field is overwritten by setsort()
default_ko("-S", &TT.kfields, 0, 0);
default_ko(defk, &TT.kfields, "bad -k", TT.top.k);
dlist_terminate(TT.kfields);
setsort(TT.top.s-1);
}
从上面的分析看:
**将TT.top.d = 1000改为TT.top.d = 1 就可以将Top命令的刷新时间改为ms为单位
另外:
在toybox的mk文件中看,很多系统的常用工具全在这,如echo 、kill 、ls 、ps 等都在这实现
.\external\toybox\Android.mk
#
# To add a toy:
#
# Edit .config to enable the toy you want to add.
# make clean && make # Regenerate the generated files.
# # Edit LOCAL_SRC_FILES below to add the toy.
# # If you just want to use it as "toybox x" rather than "x", you can stop now.
# # If you want this toy to have a symbolic link in /system/bin, add the toy to ALL_TOOLS.
ALL_TOOLS := \
acpi \
base64 \
basename \
blockdev \
cal \
cat \
chcon \
chgrp \
chmod \
chown \
chroot \
chrt \
cksum \
clear \
comm \
cmp \
cp \
cpio \
cut \
date \
df \
diff \
dirname \
dmesg \
dos2unix \
du \
echo \
env \
expand \
expr \
fallocate \
false \
file \
find \
flock \
free \
getenforce \
getprop \
groups \
gunzip \
gzip \
head \
hostname \
hwclock \
id \
ifconfig \
inotifyd \
insmod \
ionice \
iorenice \
kill \
killall \
load_policy \
ln \
log \
logname \
losetup \
ls \
lsmod \
lsof \
lspci \
lsusb \
md5sum \
mkdir \
mkfifo \
mknod \
mkswap \
mktemp \
microcom \
modinfo \
modprobe \
more \
mount \
mountpoint \
mv \
netstat \
nice \
nl \
nohup \
od \
paste \
patch \
pgrep \
pidof \
pkill \
pmap \
printenv \
printf \
ps \
pwd \
readlink \
realpath \
renice \
restorecon \
rm \
rmdir \
rmmod \
runcon \
sed \
sendevent \
seq \
setenforce \
setprop \
setsid \
sha1sum \
sha224sum \
sha256sum \
sha384sum \
sha512sum \
sleep \
sort \
split \
start \
stat \
stop \
strings \
swapoff \
swapon \
sync \
sysctl \
tac \
tail \
tar \
taskset \
tee \
time \
timeout \
top \
touch \
tr \
true \
truncate \
tty \
ulimit \
umount \
uname \
uniq \
unix2dos \
uptime \
usleep \
uudecode \
uuencode \
vmstat \
wc \
which \
whoami \
xargs \
xxd \
yes \
zcat \
############################################
# toybox for /system
############################################
发现也有相关的介绍
https://blog.csdn.net/aaajj/article/details/83347834