●ython3
●统计性能信息cpu,men,fps,battery,flow
●支持wifi,gprs统计
●统计crash信息
查看源码
monkey.ini 配置文件
cmd=adb shell monkey -p com.jianshu.haruki --throttle 500 --ignore-timeouts --ignore-crashes --monitor-native-crashes -v -v -v 200 > package_name=com.jianshu.haruki activity = com.baiji.jianshu.account.SplashScreenActivity net = wifi |
●throttle 每次事件等待500毫秒
●net 支持gprs和wifi
代码分析
主要监控代码
def get_cpu(pkg_name): cmd = "adb shell dumpsys cpuinfo | findstr " + pkg_name print(cmd) output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines() for info in output: if info.split()[1].decode().split("/")[1][:-1] == pkg_name: # 只有包名相等 # print("cpu=" + info.split()[2].decode()) cpu.append(float(info.split()[2].decode().split("%")[0])) print("----cpu-----") print(cpu) return cpu def get_men(pkg_name): cmd = "adb shell dumpsys meminfo %s" % (pkg_name) print(cmd) men_s = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines() for info in men_s: if len(info.split()) and info.split()[0].decode() == "TOTAL": # print("men="+info.split()[1].decode()) men.append(int(info.split()[1].decode())) print("----men----") print(men) return men # 得到fps ''' @author fenfenzhong ''' def get_fps(pkg_name): _adb = "adb shell dumpsys gfxinfo %s" % pkg_name print(_adb) results = os.popen(_adb).read().strip() frames = [x for x in results.split('\n') if validator(x)] frame_count = len(frames) jank_count = 0 vsync_overtime = 0 render_time = 0 for frame in frames: time_block = re.split(r'\s+', frame.strip()) if len(time_block) == 3: try: render_time = float(time_block[0]) + float(time_block[1]) + float(time_block[2]) except Exception as e: render_time = 0 if render_time > 16.67: jank_count += 1 if render_time % 16.67 == 0: vsync_overtime += int(render_time / 16.67) - 1 else: vsync_overtime += int(render_time / 16.67) _fps = int(frame_count * 60 / (frame_count + vsync_overtime)) fps.append(_fps) # return (frame_count, jank_count, fps) print("-----fps------") print(fps) return fps def get_battery(): _batter = subprocess.Popen("adb shell dumpsys battery", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines() for info in _batter: if info.split()[0].decode() == "level:": battery.append(int(info.split()[1].decode())) print("-----battery------") print(battery) return int(info.split()[1].decode()) def get_pid(pkg_name): pid = subprocess.Popen("adb shell ps | findstr " + pkg_name, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines() for item in pid: if item.split()[8].decode() == pkg_name: return item.split()[1].decode() def get_flow(pkg_name, type): pid = get_pid(pkg_name) if pid is not None: _flow = subprocess.Popen("adb shell cat /proc/" + pid + "/net/dev", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines() for item in _flow: if type == "wifi" and item.split()[0].decode() == "wlan0:": # wifi # 0 上传流量,1 下载流量 flow[0].append(int(item.split()[1].decode())) flow[1].append(int(item.split()[9].decode())) print("------flow---------") print(flow) return flow if type == "gprs" and item.split()[0].decode() == "rmnet0:": # gprs print("--------------") flow[0].append(int(item.split()[1].decode())) flow[1].append(int(item.split()[9].decode())) return flow else: flow[0].append(0) flow[1].append(0) return flow |
代码入口:
if ba.attached_devices(): mc = BaseMonkeyConfig.monkeyConfig(PATH("monkey.ini")) # 打开想要的activity ba.open_app(mc["package_name"], mc["activity"]) temp = "" # monkey开始测试 start_monkey(mc["cmd"], mc["log"]) time.sleep(1) starttime = datetime.datetime.now() while True: with open(mc["monkey_log"], encoding='utf-8') as monkeylog: BaseMonitor.get_cpu(mc["package_name"]) BaseMonitor.get_men(mc["package_name"]) BaseMonitor.get_fps(mc["package_name"]) BaseMonitor.get_battery() BaseMonitor.get_flow(mc["package_name"], mc["net"]) time.sleep(1) # 每1秒采集检查一次 if monkeylog.read().count('Monkey finished') > 0: endtime = datetime.datetime.now() print("测试完成咯") app = {"beforeBattery": BaseMonitor.get_battery(), "net": mc["net"], "monkey_log": mc["monkey_log"]} report(app, str((endtime - starttime).seconds) + "秒") bo.close() |