Python小工具——adb功耗測(cè)試

內(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ì)步驟

  1. 用usb連接手機(jī),開啟adb調(diào)試,輸入adb devices查看設(shè)備是否連接正常。
  2. 關(guān)閉所有應(yīng)用程序和后臺(tái)。
  3. 執(zhí)行命令adb shell dumpsys batterystats --reset,清除手機(jī)原有的電量統(tǒng)計(jì)信息。
  4. 斷開usb,打開待測(cè)app,進(jìn)行測(cè)試。

    注意:一定要斷開usb進(jìn)行測(cè)試,否則將無法從文件中獲得想要的數(shù)據(jù)。

  5. 測(cè)試完成后,重新連接usb,執(zhí)行命令adb shell dumpsys batterystats > 電量信息.txt,保存電量信息到txt文件。
  6. 運(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)
    

參考資料

Android手機(jī)app的adb命令測(cè)試電量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容