大眾點評App的短視頻耗電量優化實戰
前言
美團點評測試團隊負責App的質量保證工作,日常除了App的功能測試以外,還會重點關注App的性能測試。現在大家對手機越來越依賴,而上面各App的耗電量,直接影響了手機的待機時間,是用戶非常關心的一點。本文主要通過一個典型案例,介紹App性能測試中的電量測試,並總結了我們由此引發的一些思考。
一、案例分析
短視頻作為已被市場驗證的新內容傳播載體,能有效增加用戶停留時長。大眾點評App從9.3版本開始推出短視頻相關內容,在各頁面新增了短視頻模塊。在短視頻功能測試中,我們發現如果在視頻列表頁中播放視頻,手機很快就會發燙。針對這種現象,我們馬上拉取數據進行了分析,測試數據表明,視頻列表頁耗電量竟然是詳情頁的11倍。這是怎麼回事兒呢?
目前行業內有很多電量測試的方法,我們採用的是Battery Historian,這是Google推出的一款Android系統電量分析工具,支持5.0(API 21)及以上系統手機的電量分析。1. 測試對象
短視頻主要包括三個核心頁面:視頻列表頁、視頻詳情頁、作者頁,本次的測試對象就是這三個頁面。
2. 測試過程
測試機型:華為Mate 9 Android 7.0
電池容量:4000mAh播放的視頻時長:1min15s測試場景設計:WiFi環境下,打開App,播放視頻,通過點擊「重新播放」,連續播放10次對比場景:停在App首頁20min,手機不滅屏注意:測試過程不充電,每次測試環境一致3. 測試結果
如下是Battery Historian測試結果部分截圖:
視頻列表頁
視頻詳情頁
對測試結果數據進行匯總整理:
消耗電量:系統總電量的佔比
從測試結果可以看到,短視頻列表頁耗電量特別高,是視頻詳情頁的11倍。4. 問題定位
視頻列表頁消耗電量過高,從測試數據可以很明顯的看出來,視頻列表頁CPU佔用時間高很多。從播放器布局來看,列表頁和作者頁比視頻詳情頁只是多出了動畫音符。如下圖,紅框中圈出的視頻左下角的音符。
電量消耗差異這麼大,是否跟動畫音符有關呢。為了排除這個問題,重新編譯了一個去掉動畫音符的APK進行測試。測試結果:
從測試結果來看,CPU和耗電量很明顯都下降了很多,因此確定是動畫音符引起的。打開GPU視圖更新的開關,查看三個頁面的繪製情況。打開視頻列表頁,可以看到,動畫音符每波動一次,會導致整個頁面都在不停的繪製。如下是視頻列表頁繪製的情況:
從動圖可以很明顯看出該頁面繪製十分異常,動畫音符每波動一次,會導致整個頁面都重新繪製一遍。所以,到這裡就明白了問題的原因,因為頁面上動畫音符的實現方式有問題,動畫音符波動時,導致整個頁面會跟著一起不停的重新繪製。而頁面的重複繪製,會使App CPU佔用比正常情況下高出很多,進而導致耗電量高。
5. 修復後驗證
定位到原因之後,開發針對性的進行了修復。動畫音符柱狀圖的實現,之前設計由多個可變化的單柱形View組成,單個柱形View重寫了onMeasure & OnDraw方法,從外部柱狀圖View中初始化單個柱子的高度,然後自動根據一個函數式來變化高度。因為每次都需要層層調用Measure和對應的Layout,所以造成外層控制項的多次layout,進而造成CPU佔用率增大。修復之後,使用另一種方式實現,只重寫了View的OnDraw方法,每次使用Canvas畫出所有柱狀圖,使用ValueAnimator來計算變化柱狀圖高度,也不再影響父控制項的Layout。如下是修復前後的核心代碼:
修復之後動畫音符波動時的繪製區域:
修復之後,重新使用Battery Historian進行驗證,測試結果:
從上面的測試結果,可以看到,視頻列表頁和作者頁,耗電情況得到明顯的優化。
總結一下,短視頻耗電量的問題,是由於錯誤的繪製方法,導致CPU佔用過高,進而導致耗電量高。那麼因為動畫音符導致耗電量異常的問題到這裡就完美的解決了。CPU負載高,會導致耗電量高是顯而易見的。但是還想深入探索一下,在手機系統各App耗電量排行榜中,耗電量是怎麼計算的?還有哪些因素會影響耗電量呢?帶著這些疑問,我們來看看系統計算耗電量的原理。二、耗電量計算原理
根據物理學中的知識,功=電壓*電流*時間,但是一部手機中,電壓值U正常來說是不會變的,所以可以忽略,只通過電流和時間就可以表示電量。模塊電量(mAh)=模塊電流(mA)*模塊耗時(h)。模塊耗時比較容易理解,但是模塊電流怎樣獲取呢,不同廠商的手機,硬體不同,是否會影響模塊的電流呢。看一下系統提供的介面:./frameworks/base/core/java/com/Android/internal/os/PowerProfile.java
該類提供了publicdouble getAveragePower(String
type)介面,type可取PowerProfile中定義的常量值,包括POWER_CPU_IDLE(CPU空閑時),POWER_CPU_ACTIVE(CPU處於活動時),POWER_WIFI_ON(WiFi開啟時)等各種狀態。並且從介面可以看出來,每個模塊的電流值,是從power_profile.xml文件取的值。PowerProfile.java只是用於讀取power_profile.xml的介面而已,後者才是存儲系統耗電信息的核心文件。power_profile.xml文件的存放路徑是/system/framework/framework-res.apk。以Nexus 6P為例,在該路徑獲取到framework-res.apk文件。使用apktool,對framework-res.apk進行反解析,獲取到手機裡面的power_profile.xml文件,內容如下所示:<?xml version="1.0" encoding="utf-8"?><device name="Android"> <item name="none">0</item> <item name="screen.on">169.4278765</item> <item name="screen.full">79.09344216</item> <item name="bluetooth.active">25.2</item> <item name="bluetooth.on">1.7</item> <item name="wifi.on">21.21733311</item> <item name="wifi.active">98.04989804</item> <item name="wifi.scan">129.8951166</item> <item name="dsp.audio">26.5</item> <item name="dsp.video">242.0</item> <item name="gps.on">5.661105191</item> <item name="radio.active">64.8918361</item> <item name="radio.scanning">19.13559783</item> <array name="radio.on"> <value>17.52231575</value> <value>5.902211798</value> <value>6.454893079</value> <value>6.771166916</value> <value>6.725541238</value> </array> <array name="cpu.speeds.cluster0"> <value>384000</value> <value>460800</value> <value>600000</value> <value>672000</value> <value>768000</value> <value>864000</value> <value>960000</value> <value>1248000</value> <value>1344000</value> <value>1478400</value> <value>1555200</value> </array> <array name="cpu.speeds.cluster1"> <value>384000</value> <value>480000</value> <value>633600</value> <value>768000</value> <value>864000</value> <value>960000</value> <value>1248000</value> <value>1344000</value> <value>1440000</value> <value>1536000</value> <value>1632000</value> <value>1728000</value> <value>1824000</value> <value>1958400</value> </array> <item name="cpu.idle">0.144925583</item> <item name="cpu.awake">9.488210416</item> <array name="cpu.active.cluster0"> <value>202.17</value> <value>211.34</value> <value>224.22</value> <value>238.72</value> <value>251.89</value> <value>263.07</value> <value>276.33</value> <value>314.40</value> <value>328.12</value> <value>369.63</value> <value>391.05</value> </array> <array name="cpu.active.cluster1"> <value>354.95</value> <value>387.15</value> <value>442.86</value> <value>510.20</value> <value>582.65</value> <value>631.99</value> <value>812.02</value> <value>858.84</value> <value>943.23</value> <value>992.45</value> <value>1086.32</value> <value>1151.96</value> <value>1253.80</value> <value>1397.67</value> </array> <array name="cpu.clusters.cores"> <value>4</value> <value>4</value> </array> <item name="battery.capacity">3450</item> <array name="wifi.batchedscan"> <value>.0003</value> <value>.003</value> <value>.03</value> <value>.3</value> <value>3</value> </array></device>
從文件內容中可以看到,power_profile.xml文件中,定義了消耗電量的各模塊。如下圖所示:
文件中定義了該手機各耗電模塊在不同狀態下的電流值。剛剛提到,電量只跟電流值和時間相關,所以通過這個文件,再加上模塊的耗時,就可以計算出App消耗的電量,App電量=∑App模塊電量。劃重點,手機系統裡面的電量排行,也是根據這個原理計算的。
了解原理對於平常在App耗電量的測試有很大的幫助。因為獲取到手機power_profile.xml文件,就可以清楚的知道這個手機上,哪些模塊會耗電,以及哪些模塊在什麼狀態下耗電量最高。那麼測試的時候,應該重點關注調用了這些模塊的地方。比如App在哪些地方使用WiFi、藍牙、GPS等等。例如最近對比測試其他App發現,在一些特定的場景下,該App置於前台20min內,掃描了WiFi 50次,這種異常會導致App耗電量大大增加。並且反過來,當有case報App耗電量異常時,也可以從這些點去考慮,幫助定位問題。
三、電量測試方法總結
如上,列出的一些常用的電量測試方法。綜合各方法的優缺點,在定製個性化電量測試工具之前,目前採用的方法是Battery Historian。目前行業內,App耗電測試有很多種方案,如果僅僅測試出一個整體的電量值,對於定位問題是遠遠不夠的。藉助Battery Historian,可以查看自設備上次充滿電以來各種匯總統計信息,並且可以選擇一個App查看詳細信息。所以QA的測試結果反饋從「這個版本App耗電量」高,變成「這個版本CPU佔用高」「這個版本WiFi掃描異常」,可以幫助更快的定位到問題原因及解決問題。
當然,除了測試方法和測試工具,測試場景設計也非常重要。如果是在App內毫無規律的瀏覽,即使發現頁面有問題,有很難定位到是哪個模塊的問題。所以要針對性的設計場景,並且進行一些場景的對比,找出差異的地方。
四、總結
本文主要通過一個案例,介紹關於App電量測試中使用的一些基本方法和思路。電量測試採用的Battery Historian方法,雖然能初步解決問題,但是在實際的應用場景中還存在很多不足。目前美團點評雲測平台,已經集成了電量測試方法,通過自動化操作,獲取電量測試文件並進行解析,極大的提高了測試效率。目前每個版本發布之前,我們都會進行專門的電量測試,保障用戶的使用體驗。在電量測試方面,美團點評測試團隊還在持續的實踐和優化中。
作者簡介
倩雲,美團點評客戶端測試開發工程師,2015年加入美團點評,主要負責大眾點評App基礎功能及Android專項測試工作。
招聘信息
點評平台技術部-平台質量中心,Base上海,主要負責大眾點評平台入口和基礎功能的質量保障。平台包括大眾點評App、大眾點評微信小程序、PC站:http://www.dianping.com、M站:http://m.dianping.com;主要業務涵蓋:賬號、POI、評價、視頻、文章、會員社區、問答、運營活動、搜索推薦、通信鏈路、運營活動等基礎業務。熱忱期待各位QA、開發、演算法人才加入點評平台技術部。聯繫郵箱:wanxia.wang#http://dianping.com。
http://weixin.qq.com/r/9HVSSg3EOFBHrUkp9yDm (二維碼自動識別)
推薦閱讀:
※米其林上榜餐廳唐閣無緣大眾點評必吃榜,原因何在?
※畫皮的大眾點評是?
※要錢不要臉的大眾點評,在我的推廣頁加同行的廣告,還有職業道德嗎?