def get_flow_data(package_name):
     uid = AdbUtil.get_uid(package_name)
     if uid == 0:
         log.log_i('app uid is 0, check app 是否打开')
         return 0, 0
     cmd = 'cat /proc/net/xt_qtaguid/stats'
     flag_net = AdbUtil.exec_adb_shell(cmd)
     if 'No such file or directory' not in flag_net:
         try:
             cmd = 'cat /proc/net/xt_qtaguid/stats | grep %s' % uid
             str_uid_net_stats = AdbUtil.exec_adb_shell(cmd)
             # 有可能有多行数据
             list_rx = []  # 接收网络数据流量列表
             list_tx = []  # 发送网络数据流量列表
             for item in str_uid_net_stats.splitlines():
                 rx_bytes = item.split()[5]
                 tx_bytes = item.split()[7]
                 list_rx.append(int(rx_bytes))
                 list_tx.append(int(tx_bytes))
             float_total_net_traffic = (sum(list_rx) +
                                        sum(list_tx)) / 1024.0
             float_total_net_traffic = round(float_total_net_traffic, 4)
             return sum(list_rx), sum(list_tx), float_total_net_traffic
         except Exception, e:
             log.log_e('cannot get flow from /proc/net/xt_qtaguid/stats' +
                       e.message)
    def get_cpu_data(package):
        #getTotalCpuTime获取总jiffies数据#

        def getTotalCpuTime():
            _result = os.popen('adb shell cat /proc/stat').read().strip()
            _result = _result.split('\n')[0]
            _result = re.findall(u'(\d+)', _result)
            _result = reduce(lambda x, y: int(x) + int(y), _result)
            return _result

        #获取应用占用的总jiffies数据#pid:为应用进程pid

        def getPIDCpuTime(pid):
            _result = os.popen('adb shell cat /proc/%s/stat' %
                               pid).read().strip()
            _result = re.findall(u'(\d+)', _result)
            _result = reduce(lambda x, y: x + y, [
                int(_result[11]),
                int(_result[12]),
                int(_result[13]),
                int(_result[14])
            ])
            return _result

        pid = AdbUtil.get_pid(package)
        _start0 = getTotalCpuTime()
        _start1 = getPIDCpuTime(pid)
        time.sleep(1)
        _end0 = getTotalCpuTime()
        _end1 = getPIDCpuTime(pid)
        cpuUsage = float(
            (_end1 - _start1)) / (_end0 - _start0) * 100  #计算当前用户进程CPU的值
        CPU = (float('%.2f' % cpuUsage))  #当前被监控应用CPU的值
        return CPU
        pass
 def get_cur_activity():
     try:
         cmd = 'dumpsys activity top | findStr ACTIVITY'
         result = AdbUtil.exec_adb_shell(cmd)
         if result is None or result == '':
             return 'unknow'
         activity_name = result.split('/')[1].strip()
         activity_name = activity_name.split(' ')[0].strip()
         return activity_name
     except Exception, e:
         log.log_e('get current activity failure' + e.message)
         return ''
 def get_cur_packagename():
     try:
         cmd = 'dumpsys activity top | findStr ACTIVITY'
         result = AdbUtil.exec_adb_shell(cmd)
         if result is None or result == '':
             return 'unknow'
         package_name = re.findall(r'com.\w+.\w+', result, re.M)
         package_name = package_name[0].strip()
         # result_trs = result.split()
         # activity_name = result_trs[len(result_trs) - 2].split('/')[1]
         return package_name
     except Exception, e:
         log.log_e('get current activity failure' + e.message)
         return ''
 def get_versioncode(package_name):
     try:
         cmd = 'dumpsys package %s | findStr versionName' % package_name
         process_result = AdbUtil.exec_adb_shell(cmd)
         if process_result is None or process_result == '':
             return '0.0.0.0'
         # 得到的结果格式是: versionName=3.2.13.2303
         results = process_result.strip().split('=')
         # 假如有两个值,我们认为是存活的,一个进程本身,一个push进程(不考虑多个push进程的情况)
         version_code = results[1].strip()
         return version_code
     except Exception as e:
         log.log_e('get process alive failure' + e.message)
         return '0.0.0.0'
 def process_alive(package_name):
     try:
         cmd = 'ps | findStr %s' % package_name
         process_result = AdbUtil.exec_adb_shell(cmd)
         if process_result is None or process_result == '':
             return False
         process_result = process_result.split('\r\n')
         # 假如有两个值,我们认为是存活的,一个进程本身,一个push进程(不考虑多个push进程的情况)
         if len(process_result) > 1:
             return True
         # 判断是否是push进程
         if len(process_result) == 1:
             if package_name + ':' in process_result[0]:
                 return False
         return True
     except Exception as e:
         log.log_e('get process alive failure' + e.message)
    def get_fps_data_by_gfxinfo(pkg_name):

        # 为了验证一帧是否合格
        def validator(x):
            if x is None:
                return False

            xs = x.split('\t')
            # 必须要有三个数值
            if len(xs) < 2 or len(xs) > 5:
                return False

            return True

        # 为了处理通过adb shell dumpsys gfxinfo package_name 获得的结果
        def handle_fps_result(x):
            # 截取 【Profile data in ms:】之后的数据
            first_result = re.findall(r'Profile.*hierarchy', x, re.DOTALL)
            if len(first_result) < 1:
                return None
            activity_name = re.findall(r'(com.*)/.*@', first_result[0])
            data = re.findall(r'Execute(.*?)\r\n\r\n', first_result[0],
                              re.DOTALL)

            if len(data) < 1:
                return None

            if len(data) > 1:
                result = data[1].strip().split('\r\n\t')
            else:
                result = data[0].strip().split('\r\n\t')

            return result

        try:
            cmd = 'dumpsys gfxinfo %s' % pkg_name
            fps_result = AdbUtil.exec_adb_shell(cmd)
            fps_result = handle_fps_result(fps_result)
            if fps_result is None or len(fps_result) < 1:
                return None, None, None
            # 得到的fps_result中是包含\t的。
            frames = [frame for frame in fps_result if validator(frame)]

            frame_count = len(frames)
            jank_count = 0
            vsync_count = 0
            if len(frames) > 0:

                for frame in frames:
                    time_block = frame.strip().split('\t')

                    # 计算一帧渲染的时间
                    render_time = 0
                    try:
                        for i in range(len(time_block)):
                            render_time += float(time_block[i])
                            i += 1
                    except Exception as e:
                        log.log_e('render_time get failure' + e.message)
                    """
                    执行一次命令,总共收集到了m帧(理想情况下m=128),但是这m帧里面有些帧渲染超过了16.67毫秒,算一次jank,一旦jank,
                    需要用掉额外的垂直同步脉冲。其他的就算没有超过16.67,也按一个脉冲时间来算(理想情况下,一个脉冲就可以渲染完一帧)

                    所以FPS的算法可以变为:
                    m / (m + 额外的垂直同步脉冲) * 60
                    """
                    if render_time > 16.67:
                        jank_count += 1
                        if render_time % 16.67 == 0:
                            vsync_count += int(render_time / 16.67) - 1
                        else:
                            vsync_count += int(render_time / 16.67)
                fps = int(frame_count * 60) / (frame_count + vsync_count)

                return frame_count, jank_count, fps
            else:
                # 不滑动,没有帧率数据时返回0,0,0
                return 0, 0, 0
        except Exception as e:
            log.log_e('get fps failure,please check ' + e.message)
 def __init__(self):
     adbutil = AdbUtil()
     pass
                    rx_bytes = item.split()[5]
                    tx_bytes = item.split()[7]
                    list_rx.append(int(rx_bytes))
                    list_tx.append(int(tx_bytes))
                float_total_net_traffic = (sum(list_rx) +
                                           sum(list_tx)) / 1024.0
                float_total_net_traffic = round(float_total_net_traffic, 4)
                return sum(list_rx), sum(list_tx), float_total_net_traffic
            except Exception, e:
                log.log_e('cannot get flow from /proc/net/xt_qtaguid/stats' +
                          e.message)
        else:
            try:
                cmd_snd = 'cat /proc/uid_stat/%s/tcp_snd' % uid
                cmd_rec = 'cat /proc/uid_stat/%s/tcp_rcv' % uid
                str_totalTxBytes = AdbUtil.exec_adb_shell(cmd_snd)
                str_totalRxBytes = AdbUtil.exec_adb_shell(cmd_rec)
                if 'No such file or directory' not in str_totalTxBytes and 'No such file or directory' not in str_totalRxBytes:
                    float_total_net_traffic = (
                        int(str_totalRxBytes) +
                        int(str_totalTxBytes)) / 1024.0 / 1024.0
                    float_total_net_traffic = round(float_total_net_traffic, 4)
                    return int(str_totalRxBytes), int(
                        str_totalTxBytes), float_total_net_traffic
            except Exception as e:
                log.log_e(
                    'cannot get flow from /proc/uid_stat/tcp_snd  or tcp_rcv' +
                    e.message)

        return 0, 0, 0
 def make_app_silent():
     AdbUtil.press_home()
     AdbUtil.press_power_key()