#!/bin/sh
RECORD_COUNT=1
RECORD_DELAY=0 #秒
TMP_UID=0
APP_TCP_RCV=0
APP_TCP_SND=0
APP_MEM=0
APP_CPU_RATE=0.0
SYS_WLAN_RCV=0
SYS_WLAN_SND=0
SYS_MEM=0
SYS_CPU_RATE=0.0
TIMESTAMP=0
function main(){
while getopts "s:p:c:d:q" arg
do
case $arg in
s)
DEVICE_SERIAL_NO=$OPTARG
;;
p)
PACKAGE_NAME=$OPTARG
;;
c)
RECORD_COUNT=$OPTARG
;;
d)
RECORD_DELAY=$OPTARG
;;
q)
stopCmd
exit 0;;
?) #当有不认识的选项的时候arg为?
echo "unknown argument"
exit 1;;
esac
done
if [[ -n ${DEVICE_SERIAL_NO} ]] && [[ -n ${PACKAGE_NAME} ]]; then
doCollect
else
echo "device serial no & package name should not be null!"
fi
}
function doCollect(){
BASE_COMMAND="adb -s ${DEVICE_SERIAL_NO} shell"
getUid
APP_UID=$((${TMP_UID}+10000))
echo "TIMESTAMP | APP_TCP_RCV | APP_TCP_SND | APP_MEM | APP_CPU_RATE | SYS_WLAN_RCV | SYS_WLAN_SND | SYS_MEM | SYS_CPU_RATE"
for (( i=1; i<${RECORD_COUNT}+1; i++ ))
do
TIMESTAMP=`date '+%s'`
getFlow # 获取流量信息
getCpuRate # 获取CPU信息
getAppMeminfo # 获取内存占用信息
printf "%d %d %d %d %.1f %d %d %d %.1f\n" ${TIMESTAMP} ${APP_TCP_RCV} ${APP_TCP_SND} ${APP_MEM} ${APP_CPU_RATE} ${SYS_WLAN_RCV} ${SYS_WLAN_SND} ${SYS_MEM} ${SYS_CPU_RATE}
sleep ${RECORD_DELAY}
done
}
# 获取某个应用的(uid)
function getUid(){
# “u0_aXX”后面的信息代表这个应用的安装序号,表示这个应用是第几个被安装到系统的。
# Java 编写的应用程序,它的 uid 是从 10000 开始的;
# C 语言编写的,它的 uid 是从 1000 开始的;
# 例 u0_a74,uid=10074
TMP_UID=`${BASE_COMMAND} ps | grep ${PACKAGE_NAME} | awk '{print $1}' | grep -Eo '_?[0-9]+$' | sort -u`
}
# 获取流量信息(byte)
# RCV:应用入流量
# SND:应用出流量
function getFlow(){
# 读取某个应用(uid)的流量
APP_TCP_RCV=`${BASE_COMMAND} cat /proc/uid_stat/${APP_UID}/tcp_rcv | awk '{print int($0)}'`
APP_TCP_SND=`${BASE_COMMAND} cat /proc/uid_stat/${APP_UID}/tcp_snd | awk '{print int($0)}'`
# 读取系统WI-FI的流量
SYS_WLAN_RCV=`${BASE_COMMAND} cat /proc/net/dev | awk '$1=="wlan0:" {print $2}'`
SYS_WLAN_SND=`${BASE_COMMAND} cat /proc/net/dev | awk '$1=="wlan0:" {print $10}'`
}
# 获取内存占用信息(kB)
function getAppMeminfo(){
# Total 的 PSS 信息就是应用真正占据的内存大小
# SYS_MEM:系统占用内存
# APP_MEM:应用占用内存
local tmp_mem=`${BASE_COMMAND} dumpsys meminfo ${PACKAGE_NAME} | sed -n "8,25p" | awk '$1=="TOTAL" {print $2}'`
if [[ -n ${tmp_mem} ]]; then
APP_MEM=${tmp_mem}
fi
SYS_MEM=`${BASE_COMMAND} dumpsys meminfo | awk '$1=="Used" && $2=="RAM:" {print $3}'`
}
# 获取CPU占用率
function getCpuRate(){
# 应用CPU占用率(int)
local tmp_rate=`${BASE_COMMAND} dumpsys cpuinfo | grep ${PACKAGE_NAME} | awk '{print $1}'| cut -d "%" -f 1 | head -n1`
if [[ -n ${tmp_rate} ]]; then
APP_CPU_RATE=${tmp_rate}
fi
# 系统CPU占用率(float)
SYS_CPU_RATE=`${BASE_COMMAND} dumpsys cpuinfo | awk '$2=="TOTAL:" {print $1}' | cut -d "%" -f 1`
}
function stopCmd {
sec=10
#开始一个循环,以判断进程是否关闭
for var in 1 2 3 4 5 6 7 8 9
do
count=`ps -ef | grep collect-performance.sh | grep ${DEVICE_SERIAL_NO} | grep -v "grep" | grep -v "\-q" | awk '$8=="sh"' | wc -l`
if [ 0 == ${count} ];then
#若进程已经关闭,则跳出循环
break
else
#若进程还未关闭,则脚本sleep几秒
echo sleep ${sec} second the ${var} time, the JMS thread is still alive
sleep ${sec}
fi
done
# ps -ef | grep collect-performance.sh | grep ${DEVICE_SERIAL_NO} | grep -v grep | grep -v '-q'| awk '$8=="sh" {print $2}' | xargs kill -3
}
main $@