內(nèi)容介紹
使用adb工具獲取并存儲(chǔ)設(shè)備的用電信息,然后根據(jù)adb返回的結(jié)果,使用python分析指定app的功耗情況(功耗=消耗的電能/時(shí)間)。
準(zhǔn)備工作
通過adb工具查看當(dāng)前運(yùn)行程序的包名。
adb shell dumpsys window | grep mCurrentFocus
詳細(xì)步驟
- 用usb連接手機(jī),開啟adb調(diào)試,輸入
adb devices查看設(shè)備是否連接正常。 - 關(guān)閉所有應(yīng)用程序和后臺(tái)。
- 執(zhí)行命令
adb shell dumpsys batterystats --reset,清除手機(jī)原有的電量統(tǒng)計(jì)信息。 - 斷開usb,打開待測(cè)app,進(jìn)行測(cè)試。
注意:一定要斷開usb進(jìn)行測(cè)試,否則將無法從文件中獲得想要的數(shù)據(jù)。
- 測(cè)試完成后,重新連接usb,執(zhí)行命令
adb shell dumpsys batterystats > 電量信息.txt,保存電量信息到txt文件。 - 運(yùn)行python代碼,查看被測(cè)app的功耗。
(1)可以使用命令python get_mW.py "文件路徑" "包名"來運(yùn)行程序。
(2)也可以直接修改main函數(shù)中的file_path和pkg_name,然后運(yùn)行。import re import sys def get_mW(file_path, pkg_name): power_flag = 0 power = 0.0 # 消耗的電能 id = None time_flag = 0 time = 0 # 運(yùn)行的時(shí)間 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 = '包名' # 待測(cè)app的包名 get_mW(file_path, pkg_name)