获取Android应用CPU、FLOW、MEM性能脚本

#!/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 $@

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值