APP電量測試這樣做。



iOS電量相關問題一直是測試人員頭疼的事情,電量測試怎麼開展、問題怎麼復現和跟進定位、用戶反饋電量相關的問題我們如果獲取更多的信息等等,一直都沒有一個好的解決方案,以至於我們面對電量相關的問題時,總是束手無策。整個項目組經常收到這樣的一種反饋:你看,你們開發的APP,我還沒怎麼用呢,耗電量就排第一了。對於這樣的反饋,我們能做些什麼呢?之前我們是迷茫的,但經過一段時間的嘗試和努力之後,事情有了一些改觀。

一、電量測試之農業時代

在之前很長一段時間,我們都是用這種可憐的方式進行電量測試的:

1、選定測試場景以及時長;

2、給手機充放電,讓手機剩餘電量在我們預設的值,比如90%,每個場景測試開始時,保證手機都是這一電量;

3、手機系統設置,一般要關注屏幕亮度、藍牙、定位、通知消息、音量、後臺應用等等,爲保證簡單,通常是全部關閉或調到最小即可;

4、記錄開始時的剩餘電量,並執行測試,在測試結束後再記錄一次剩餘電量,兩個電量差,就爲該場景在一定時長內的耗電量;剩餘電量嘛,直接讀手機上展示的值或是通過接口獲取(後面會介紹)均可以,幾乎沒有區別;

真是夠簡陋,但並非完全沒有用,明顯的電量消耗問題,還是可以發現,只要選得場景對了就可以。要是發現不了問題也不會一直用這個方法了不是。嘿嘿。

後面我們還將這種方案做了優化,流程不變,但是全自動化,人工只參與數據出來後的整理即可。具體的方法是,在手機和mac之前,加了一塊Arduino開發板,通過mac端的指令,可以智得控制開發板通電或是斷電,以達到手機充電或是放電的效果。

但不管怎麼全自動化都好,終歸還是最粗放的方式,沒有具體的數據,沒法幫助定位,如果還是個偶現的問題,那就更加束手無策,只能作罷。

二、電量測試之工業時代

慢慢得,我們開始去做一些新的嘗試,能不能獲取到更多更詳細的電量數據,是我們的主要目標。

我們想得也比較簡單,執着得認爲,肯定是有一些我們沒有發現的接口,可以獲取到一些詳細的數據,要不然系統是怎麼計算每個APP的耗電量的呢?其實在某一段時間之內,確實如我們所想,但並非一直如此。

最初我們用到的是UIDevice類batteryLevel接口。這個接口只能獲取到剩餘電量百分比,目前世面上能見到的所有iOS系統版本都可用,如上文所提到的,他和系統界面上展示的值幾乎沒有區別,唯一不同的是,他是以mAh爲單位計的,以這個值計算的剩餘電量百分比,就是系統上顯示的那個值。這樣看來,這個接口也沒有什麼多大的意義。還得繼續嘗試。

接着我們使用到的是IOKit中的IOPMPowerSource接口,私有接口,調用方式如下:

在iOS 10及以上的系統上,能獲取到的信息如下:

看看關鍵信息:

第三行CurrentCapacity是當前的剩餘電量;

第六行FullyCharged是否滿電量;

第八行IsCharging是否正在充電;

第九行MaxCapacity最大電池容量;

第十行Voltage當前電壓。

信息是多了一些,有當前電壓值,有剩餘電量。這個有什麼用呢?我們先科普一點點小知識。

首先,某一設備的電壓,基本是在一定範圍之內變動的,相對穩定的一個值。就像iPhone 6P的電壓,基本是在4V上下。當電池剩餘電量越少時,電壓值會變得越小,但波動不大。電壓過小時,可能會引起手機直接關機,這也是爲什麼有時還有20%電量,但手機卻開不了機了。新的電池,電壓波動會小一些,越是老化,電壓波動可能越大。所以電壓這個值能用來判斷當前電池的健康度。

然後是剩餘電量2548,他的單位是mAh。手機電池常用類似1000mAh這樣的標識,這不是具體的電量,光看這個值,能解理到的含義是,以1000mA的電流來放電,能放1小時。或者說,以200mA的穩定電流放電,能放5小時。但明顯這樣意義並不大。因爲我們還不知道電池在工作時,會以多少mA的電流工作,所以也就不知道能用多久,我們想知道的是,電池到底還有多少電,這個纔是一個具體的值。上面提過,電壓是相對固定的,我們可以算出具體剩餘多少電,以1000mAh,粗略計電壓穩定爲4V,根據公式計算得出W=U*I*t=4v*1000mAh=4000mWh。這個就是當前電池剩餘的電量。當計算剩餘電量的百分比的時候,用哪個值去算都一樣了。

以上是IOPMPowerSource接口在iOS10及以上系統上獲取的信息。但事實上,在iOS 9及以前的系統上,能獲取到更多更詳細的信息,大部分是一些硬件的固定信息,對我們測試沒有幫助。但也有一些其他有用的信息,比如說當前的溫度,電流,都是很有用的信息,如下圖:

溫度能用來直接判斷當前的發熱情況,電流能直接判斷當前的電池發電功率,都可以有效判斷當前電池的使用狀態。

但是這個接口拿到的數據,仍然是不夠具體,全是整機的電池情況,沒有具體到某一個應用或是其他維度的電量統計。所以,還得繼續摸索。

這一次我們應用到的是BatteryUsageUI.bundle中PLBatteryUsageUIQuery,也是個私有接口。這裏賣個關子,實現就不帖了,有心的同學可以根據我的關鍵字找到具體的東西。這個接口就厲害了,具體得說,他能拿到每一個APP的CPU\GPU\顯示\網絡\存儲等前後臺所有詳細信息,一個巨大的表。

當我們探索到這一步時,激動不已,以爲光明就在眼前了。可是事實卻是,這個接口早在iOS9的第一個版本,就完全被封了,只能在iOS 8上的機子上拿到數據。而且經過多次確認後,我們發現,這個數據是每個小時纔會更新一次,並不是實時的。

但儘管如此,還是大大得增強了我們繼續探索的信心,我們第一次獲取到了每一個App的電量消耗情況,而且我們很確信,蘋果iOS的電量排行榜,就是根據這些數據計算出來的。因爲,我們在這之前,已經發現在越獄環境下有個工具,叫DetailedBatteryUsage,這個插件只做了一件事情,就是把系統設置裏,電池的顯示方式設置成了“2”,而默認的顯示方式是“0”。設置爲“2”以後,就可以在電池設置裏看到很詳細的信息,如下圖:



跟我們用接口拿到的數據是一致的,所以我們確認電量排行榜數據來至於這個接口,而且,系統一直在調用這個接口在統計電量相關的信息,只是對用戶而言不可見,而且接口也不可見。在越獄環境下能拿到這些數據,對我們定位問題已經有很大的幫助了,但是一方面這些數據是系統顯示出來的,我們處理很不方便,效率也低,另一方面,這些數據只能在越獄的機器上拿到,而目前主流的系統都還是不能越獄的。我們不得不再進一步。

三、電量測試之大數據時代

經過長時間的探索,我們的目標越來越清晰,但是路卻越來越窄,因爲能用的接口都被官方給屏蔽了,很長一段時間內,我們都沒有任何進展。直到無意中發現了官方的工具sysdiagnose。這是蘋果日誌系統的統稱,蘋果經常會詢問是否要官方幫忙診斷和定位問題時,上傳的就是sysdiagnose的各種日誌。

Sysdiagnose很龐大,每天上幾百M的日誌,記錄電池、第三方APP、各種系統功能和應用的所有運行情況。

Sysdiagnose怎麼使用呢?簡單得說,就是需要一個開發者賬號,然後到蘋果開發者網下載對應的證書。不需要越獄,沒有系統限制,這個特別關鍵。關於怎麼使用,有明確的說明:

當然每一類不同的日誌,都對應不同的證書,以上說明是針對電池電量的。

電量日誌是sysdiagnose系統中最龐大的一塊。電量日誌每天有幾十到一百M,他是一個龐大的數據庫,裏面有267張表,記錄了電池電量的各維度信息。看來要弄懂電量的數據來源,必須要弄明白這些表之前的聯繫以及各自的意思。

經過幾周的折騰,我們弄明白了幾個關鍵的頂部的表格,下面列出來分享給大家:

通過這些表格數據,我們能明白,系統記錄了哪一些數據,他們之前的關係,哪些是對我們有用的。數據非常全面,我只能說蘋果威武。

有了這樣全面的官方數據,我們的測試怎麼做呢?

1、首先,上線前的電量測試,只要裝上對應的證書,便可開始執行測試,只要記下哪個時間段對應的是哪個場景,然後測試完後,取下系統的數據庫,便可以對當次的電量做較全面的評價,例如,某個APP在某場景下,20分鐘運行時間,顯示耗電100mWh,CPU耗電20mWh,運行溫度是32度,平均電流是110mA,是不是很酷?這樣的數據,一旦異常,對於問題的定位幫助也比較大,點個贊。

2、用戶反饋的問題,不再沒有頭緒,只需要裝證書發送給他,讓他裝上,半小時後便可以獲取到最近幾天的所有電量信息,用於跟進和定位問題。酷不酷?想不想學?

不僅如此,這些關鍵數據,還讓我們弄清了兩個關鍵問題,一個是剩餘電量是怎麼計算的,另一個是電量排行榜是怎麼計算的,我一一列舉。

四、剩餘電量是怎麼計算的

iOS系統每20秒會讀取一次系統電量相關數據記錄入整機電量數據庫,主要內容有當前電流,電壓,剩餘電量,最大電量,溫度,是否在充電,充放電次數。

1、電流以mA計,直接通過硬件測得,是計算其他數據的基礎,iPhone工作時,電流一般在1mA到700mA之間。超過500mA電池很容易發熱。

2、電壓以mV計,通過硬件測得,是計算其他數據的基礎,iPhone工作時,電壓幾乎一直恆定在4V左右。測試過程中出現過的最高電壓是4.3V。

3、剩餘電量是以mAh計,他和最大電量是相對值,我們看到的電量百分比是這兩個值的比值。電量最大值是一個理論值,1000mAh的意義是,以1000mA的恆定電流放電時,能放1小時。他最大值並不固定,他會隨着電壓而發生一些波動。

4、溫度也通過硬件接口獲得,可以作爲一個參考值,測試過程中出現的最高溫度是37度,能明顯感覺到發熱了。

5、是否在充電,如果是在充電過程中,使用的任何應用,具體電量都不作統計,不入數據庫,而只統計整機的電量。

6、充放電次數,以充放一次最大電池容量記爲一次,充放電次數可以作爲電池老化程度的一個根據。

下面再來說說到底是怎麼計算的。

假如充滿電是1000mAh,系統會每20秒讀一次電流值,以及判斷是在充電還是放電,記算這段時間的功耗,逐步累加。如半小時後還有800mAh,剩餘電量就是80%。

五、電量排行榜是怎麼計算出來的

1、首先要說明的是,電量排行榜顯示的不是實時的數據,他有1小時內的延遲。同時他與系統顯示的剩餘電量百分比也不是同一套計算體系。

2、iPhone用來記錄電量相關數據的數據庫極爲龐大,有在概265張表,每天超10M的數據。

3、每一個安裝到iPhone的應用,在系統級都會有一個ID標註,稱作結點ID。

4、系統電量的消耗分爲主要以下大類,每一種都作爲電量消耗的根結點。isp\apsocbase \display\wifi data\GPU venc\venc\CPU\restofsoc\GPS\DRAM。

5、系統中每個應用都有幾種狀態,分別是不運行、前臺活躍、前臺不活躍(一般應用間切換時出現)、後臺、暫停(在後臺但沒有運行,程序還在內存中)。

6、系統每小時記錄了每一個根結點被哪些應用佔用,應用的狀態是怎麼樣的,每應用消耗了多少能量,總共消耗了多少,比如某一小時內,某個APPCPU\GPU\GPS\DRAM\顯示各耗電20mAh,共100mAh,這小時內所有APP耗電200mAh,那麼該APP耗電佔比50%。

六、總結

總結一下,電量測試從農業時代,到工業時代,再進大數據時代,是量變到質量的過程。我們做了長時間的探索,最終還是站在巨人的肩膀上,實現了最初預想的目標,走了很多彎路,由於研究的人很少,經常一些關鍵詞,google出來的信息就兩三條,很容易走進死衚衕裏,但也正因爲這樣,也沒有在一條錯的路上一直走,總算是有點收穫,很是感慨。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章