内容介绍
使用adb工具获取并存储设备的用电信息,然后根据adb返回的结果,使用python分析指定app的功耗情况(功耗=消耗的电能/时间)。
准备工作
通过adb工具查看当前运行程序的包名。
adb shell dumpsys window | grep mCurrentFocus
详细步骤
- 用usb连接手机,开启adb调试,输入
adb devices
查看设备是否连接正常。 - 关闭所有应用程序和后台。
- 执行命令
adb shell dumpsys batterystats --reset
,清除手机原有的电量统计信息。 - 断开usb,打开待测app,进行测试。
注意:一定要断开usb进行测试,否则将无法从文件中获得想要的数据。
- 测试完成后,重新连接usb,执行命令
adb shell dumpsys batterystats > 电量信息.txt
,保存电量信息到txt文件。 - 运行python代码,查看被测app的功耗。
(1)可以使用命令python get_mW.py "文件路径" "包名"
来运行程序。
(2)也可以直接修改main函数中的file_path和pkg_name,然后运行。import re import sys def get_mW(file_path, pkg_name): power_flag = 0 power = 0.0 # 消耗的电能 id = None time_flag = 0 time = 0 # 运行的时间 with open(file_path, 'r') as f: for line in f.readlines(): if power_flag == 1 and id is not None: if re.search(r'Uid\s{id}:\s(\S)*'.format(id=id), line): power = float(re.search(r'Uid\s{id}:\s(\S)*'.format(id=id), line).group(1)) if time_flag == 1: if re.search(r'Total running: ([0-9]*)s ([0-9]*)ms', line): time1 = re.search(r'Total running: ([0-9]*)s ([0-9]*)ms', line).group(1) time2 = re.search(r'Total running: ([0-9]*)s ([0-9]*)ms', line).group(2) time = int(time1)+int(time2)*0.001 if time_flag == 0 and re.search(r'{id}\:$'.format(id=id), line): time_flag = 1 if 'Estimated power use' in line and power_flag == 0: power_flag = 1 if re.search(r'\+top\=([0-9a-z]*)\:\"{}\"'.format(pkg_name), line): id = re.search(r'\+top\=([0-9a-z]*)\:\"{}\"'.format(pkg_name), line).group(1) print('pkg name:', pkg_name) print('Uid:', id) print('power(mAh):', power) print('running time(s):', time) print('power dissipation(mW):', power*3600/time) if __name__ == '__main__': args = sys.argv if len(args) > 1: file_path = args[1] pkg_name = args[2] else: file_path = '文件路径' # 电量信息文件所在路径 pkg_name = '包名' # 待测app的包名 get_mW(file_path, pkg_name)