摘要:性能測試除了需要監控內存占用流量等,還需要獲取的電量數據,測試在可接受范圍內,避免出現過度消耗電量的現象。這一欄顯示了不同的充電方式對電量使用的影響。
本文由作者張迎貞授權網易云社區發布。
APP性能測試除了需要監控PCU、內存占用、流量等,還需要獲取APP的電量數據,測試在可接受范圍內,避免APP出現過度消耗電量的現象。
手機有很多硬件模塊:CPU,藍牙,GPS,顯示屏,Wifi,射頻(Cellular Radio)等,在手機使用過程中,這些硬件模塊可能處于不同的狀態,譬如WIFI打開或關閉,屏幕是亮還是暗,CPU運行或休眠。 硬件模塊在不同的狀態下的耗電量是不同的。Android在進行電量統計時,并不是采用直接記錄電流消耗量的方式,而是跟蹤硬件模塊在不同狀態下的使用時間,收集一些可用信息,用來近似的計算出電池消耗量。
從用戶使用層面來看,Android需要統計出應用程序的耗電量。應用程序的耗電量由很多部分組成,可能使用了GPS,藍牙等模塊,可能應用程序要求長時間亮屏(譬如游戲、視頻類應用)。 一個應用程序的電量統計,可以采用累計應用程序使用所有硬件模塊時間這種方式近似計算出來。
舉一個例子,假定某個APP使用了GPS,使用時間用 t 表示。GPS模塊單位時間的耗電量用 w 表示,那么,這個APK使用GPS的耗電量就可以按照如下方式計算:
耗電量 = 單位時間耗電量(w) × 使用時間(t)
測試方法多種多樣:
1、CPU空閑時,停留在主界面不退出,打開網絡然后鎖屏,12小時后查看電量、流量變化
2、APP在操作運行時(此過程可借助使用monkey進行壓力測試),1小時后查看電量、流量變化
3、第三方APP進行步驟1、2相同的場景測試
4、對比競品APP的耗電量。
期望結果:APP在靜止狀態時無沒有明顯的耗電情況,在運行狀態時耗電量在可接受范圍內。
方法1——手機自帶
有的手機設置菜單里面會有流量和電量統計類,只需在測試前后記錄下電量值,便可獲取消耗電量數值。
方法2——使用第三方工具
已知公式 : 耗電量 = 電流 * 時間
例:平均電流為150mA,測試時間30min,則,30min內耗電量為:150 * 30 /60=75mAh(毫安小時)。
通過耗電量和使用手機電量的百分比,可得出手機電池容量(理論值)。
一個系統走一遍基礎功能耗電不應超過20%。
1、Emmagee
https://github.com/NetEase/Em...
Emmagee是網易杭州研究院QA團隊開發的一個簡單易上手的Android性能監測小工具,主要用于監控單個App的CPU,內存,流量,啟動耗時,電量,電流等性能狀態的變化,且用戶可自定義配置監控的頻率以及性能的實時顯示,并最終生成一份性能統計文件。
2、騰訊GT
http://gt.tencent.com/downloa...
此apk是一款可以對APP進行測試的軟件,可以在任何情況下快速測試手機app的CPU、內存、流量、電量、幀率/流暢度等性能測試。
使用方法:
打開GT,點擊選擇被測應用,選中自己要測的app,選擇關注的測試點,cup、net(流量)、內存(pss)等,點擊“啟動”,在gt的插件標簽里有耗電測試,導出文件查看電量使用。
3、其他各種常見耗電量監控工具
金山電池醫生:能夠記錄CPU耗時、流量消耗隨時間的變化曲線,這樣可以查看app耗電在哪些時間點.
GSam Battery Pro:耗電量信息顯示詳細,包括了喚醒鎖數,前后臺占用cpu的時間,可以導出數據,支持多種監控起始時間點設置
PowerTutor:1.顯示系統電量消耗水平,記錄耗電量的焦耳值,不是百分比,包括LCD/OLED,CPU,WiFi,3G,GPS和Audio;2.查看某段時間內所有運行中的應用程序的耗電量
Battery Monitor Widget:高度可定制化的電量監控小工具,不僅可以顯示當前電量,估算剩余電量支撐時間,還可以一目了然地檢測出各個APP的耗電歷史,從而方便進行比較。
Smart Battery Monitor:除了可以在狀態欄顯示電池消耗百分比外,還可以顯示電池的溫度,以及已充電時間。
Battery Indicator:亮點是輕便、小巧,甚至使用它時不會消耗電池。當然,它可以顯示電池的電量百分比、電池的溫度、以及電池的健康信息。
Battery Widget:這個工具不僅是一個電池Widget,還可以作為顯示選項,GPS,WiFi,藍牙選項等的快捷方式。
Battery Saver:被稱為管理電池的最強大應用之一。除了顯示電量信息,電池溫度和健康信息外,它還可以快速管理一些耗電量大的應用如:GPS,WiFi,藍牙等。另外:該工具可以查看一天之內的哪個時間點電池的耗電量最大。|
等等等等
方法3——Battery Historian
Android框架層通過一個名為batterystats的系統服務,電池的信息,電壓,溫度,充電狀態等等,都是由BatteryService來提供的。電池的這些信息是BatteryService通過廣播主動把數據傳送給所關心的應用程序。實現了電量統計的功能,batterystats實現原理可以查閱電量統計服務
Android提供的dumpsys命令用于查看系統服務的信息(實現原理可以查閱dumpsys介紹), 將batterystats作為參數,就能輸出完整的電量統計信息。
執行:
手機連接usb執行:
adb shell dumpsys batterystats --enable full-wake-history
adb shell dumpsys batterystats –reset //清空電池的歷史狀態
斷開USB,打開目標應用,執行monkey,正常使用5分鐘左右。
連接USB,執行:
adb bugreport > bugreport.txt
也可以用adb shell dumpsys batterystats > com.nt.topline > toplinepower1.txt //得到指定app相關的電量消耗信息。
python historian.py -a bugreport.txt > batterystats.html
上面的historian.py腳本是python寫的,所以需要python環境,從github上下載這個腳本。Chrome瀏覽器打開生成的battery.html文件,打開查看。
html中信息都能從bugreport.txt中找到相應的信息。
分析各個指標代表的意義:
上面的10,20代表的就是秒的意思,它是以一分鐘為周期,到第60秒的時候變為0。橫坐標就是一個時間范圍,咱們的例子中統計的數據是以重置為起點,獲取bugreport內容時刻為終點。我們一共采集了多長時間的數據,圖表下也有信息說明。(經其他人的反饋,這個坐標間隔是會隨著時間的長度發生改變,所以要以你的實際情況為準)
battery_level:電量,可以看出電量的變化。比如上圖中的數據顯示剛開始電量是100%,然后在第11秒-12秒中間的某個時刻降到了99%。
plugged: 充電狀態,這一欄顯示是否進行了充電,以及充電的時間范圍。例如上圖反映了我們在第22s插入了數據線,然后一直持續了數據采集結束。
screen: 屏幕是否點亮,這一點可以考慮到睡眠狀態和點亮狀態下電量的使用信息。
top:該欄顯示當前時刻哪個app處于最上層,就是當前手機運行的app,用來判斷某個app對手機電量的影響,這樣也能判斷出該app的耗電量信息。該欄記錄了應用在某一個時刻啟動,以及運行的時間,這對我們比對不同應用對性能的影響有很大的幫助。
wake_lock*: wake_lock 該屬性是記錄wake_lock模塊的工作時間。是否有停止的時候等。Android的休眠喚醒主要基于wake_lock機制,只要系統中存在任一有效的wake_lock,系統就不能進入深度休眠,但可以進行設備的淺度休眠操作。wake_lock一般在關閉lcd、tp但系統仍然需要正常運行的情況下使用,比如聽歌、傳輸很大的文件等。
running:界面的狀態,主要判斷是否處于idle的狀態。用來判斷無操作狀態下電量的消耗。
wake_lock_in:wake_lock有不同的組件,這個地方記錄在某一個時刻,有哪些部件開始工作,以及工作的時間。
data_conn:數據連接方式的改變,上面的edge是說明采用的gprs的方式連接網絡的。此數據可以看出手機是使用2g,3g,4g還是wifi進行數據交換的。這一欄可以看出不同的連接方式對電量使用的影響。
status:電池狀態信息,有充電,放電,未充電,已充滿,未知等不同狀態。 這一欄記錄了電池狀態的改變信息。
phone_signal_strength:手機信號狀態的改變。 這一欄記錄手機信號的強弱變化圖,依次來判斷手機信號對電量的影響。
health:電池健康狀態的信息,這個信息一定程度上反映了這塊電池使用了多長時間。 這一欄記錄電池狀態在何時發生改變,上面的圖中電池狀態一直處于good狀態。
plug:充電方式,usb或者插座,以及顯示連接的時間。 這一欄顯示了不同的充電方式對電量使用的影響。
gps:gps是否開啟
phone_in_call :是否進行通話
Sync :是否跟后臺同步,可以把鼠標停在某一項上面。可以看到何時sync同步 啟動的,持續時間Duration多久。電池容量不會顯示單一行為消耗的具體電量,這里只能顯示使用電池的頻率和時長,你可以看分時段的剩余電量來了解具體消耗了多少電量。
Job :后臺的工作,比如服務service的運行。從下面圖中可以看到qihoo的AppStore和魯大師都在運行后臺服務。
data_conn:數據連接方式的改變,上面的edge是說明采用的gprs的方式連接網絡的。此數據可以看出手機是使用2g,3g,4g還是wifi進行數據交換的。這一欄可以看出不同的連接方式對電量使用的影響。
status :電池狀態信息,有充電,放電,未充電,已充滿,未知等不同狀態。 這一欄記錄了電池狀態的改變信息。
phone_signal_strength :手機信號狀態的改變。 這一欄記錄手機信號的強弱變化圖,依次來判斷手機信號對電量的影響。
結果分析:
通過前面學習到的Battery Historian我們可以得到設備的電量消耗數據.
例如拿移動網絡舉例,如果數據中的移動蜂窩網絡(Mobile Radio)電量消耗呈現下面的情況,間隔很小,又頻繁斷斷續續的出現,說明電量消耗性能很不好:
經過優化之后,如果呈現下面的圖示,說明電量消耗的性能是良好的:
另外WiFi連接下,網絡傳輸的電量消耗要比移動網絡少很多,應該盡量減少移動網絡下的數據傳輸,多在WiFi環境下傳輸數據。
耗電原因分析
主要造成耗電的幾大原因:
屏幕喚醒
CPU喚醒
蜂窩數據
傳感器
可能造成耗電的原因
網絡請求耗電,而且手機數據網絡進行http請求比無線網進行http請求更加耗電,因為數據網絡調用到一些底層的硬件模塊,就如GPS一樣,當手機打開GPS功能后,也是啟動了一些硬件模塊就會明顯增加耗電
高頻的刷新UI界面,刷新UI界面其實就是進行layout的繪制,如果一個Activity的布局嵌套太多層,那么每一層layout都會刷新一次,例如動畫等等這些都會造成耗電
數據庫,SD卡文件操作,這些都是屬于耗時操作,當操作次數很少的時候基本不會有耗電問題,但是當短時間內操作次數很多的話,也會明顯的增加耗電,同時也有可能造成頁面卡頓
AlarmManager,例如一些推送的心跳包實現,AlarmManager會定時喚醒CPU去執行一些任務,也是造成耗電的一大源頭
手機網絡環境不好的時候會頻繁的切換網絡,因為網絡數據交互的時候,系統也是會被喚醒的,所以APP如果在監聽了網絡切換廣播后做了大量的操作,一樣會增加耗電
針對一些任務隊列的處理,如果隊列堆積的任務太多,導致循環執行太久也會造成耗電,因為占用了CPU資源去執行代碼,我們的log日志工具保存到文件就是用任務隊列實現的,當壓力測試SDK一次性接受1萬條消息的時候,那內存就表上來了,跟了下發現日志保存隊列里面積壓了4千多個任務,這時候即使手機鎖屏,也還會不斷的把隊列中的任務執行完然后CPU才會休眠下去的,同樣會造成嚴重的耗電,耗內存,好在release版本的日志都是關閉的
執行一些高運算量的代碼,例如json數據解析,一些二進制協議的數據編碼和解碼
接收系統的一分鐘廣播,然后做一些程序邏輯處理,其實接收一分鐘廣播不耗電,耗電的是一分鐘執行一次程序處理
Wake Lock使用不當導致沒有及時的釋放,Wake Lock可以阻止cpu進入休眠的,如果沒有及時的release會造成cpu無法休眠,程序耗電嚴重
如果程序中有定時任務,在cpu休眠之后,定時任務就會被掛起不執行,這時候并不會造成太大的耗電,但是如果這個定時任務的時間間隔很短,1秒執行一次,那么當手機app集成了推送,推送就會有心跳包通過AlarmManager來喚醒,每次喚醒的時候就會再去執行掛起的定時任務,雖然執行定時任務的耗電量可能比心跳包的耗電量少很多,不過還是需要注意的,積少成多
其實android中的Log日志的打印也會耗電的,在日常開發中,我們可能不僅會把log打印到AndroidStudio里面,有可能還會保存起來,而且可能在打印對象信息數據的時候會用到json格式轉換,這些都會增加耗電,但是在正式發布的apk包中日志管理一般都是關閉的
在手機鎖屏后,CPU會過一段時間才休眠,如果程序中有定時任務,在CPU休眠后會被掛起不執行,但是在CPU休眠之前,定時任務還是會一直的執行的,之前遇到過這么一個問題,我們采用Picasso庫:Picasso.with(context)
優化建議:
針對主要耗電原因的優化:
o 傳感器的使用,比如gps,如果業務上非頻繁使用并且要求精度不高,那么就在業務上優化定位時機和精度.
o 如果業務上需要有長時間的service,那么要考慮到CPU weak lock,防止后臺任務沒有完成,但是cpu睡眠,或者任務已經完成,仍然持有weak lock
o 我們也許會在手機充電時,做一些日志上傳操作的定時任務,那么注意重試次數和成功后處理,防止用戶一夜充電不到80%,然后手機廠商為我們背鍋的情況
o 已知屏幕喚醒是耗電大戶,原因是屏幕渲染,繪制消耗資源,所以我們在自定義視圖,布局的時候,要盡量做到Android性能優化里要求
o 同理,各種優化,平時編碼的習慣,都會影響我們脆弱的電量
o 為了減少電量的消耗,在蜂窩移動網絡下,最好做到批量執行網絡請求,盡量避免頻繁的間隔網絡請求。
針對Http請求優化:
o 對http請求數據做GZIP壓縮,當前流行的http第三方看默認都支持GZIP壓縮
o Http緩存,Http協議有一個Cache機制,當發出http請求的時候會先到指定目錄下檢查是否已經存在這個請求的數據,如果存在并且還沒過時,那么就會直接返回;而一些第三方例如OkHttp也有有自己的緩存 機制OKHTTP緩存
o 合并Http請求來減少Http請求次數,因為Http底層也是TCP連接,對于每個Http請求,發出請求的時候都會創建TCP連接,請求結束后會斷開TCP連接,那么當Http請求次數很多的時候就會頻繁的創建和斷開TCP連接,如果把當中一些請求進行合理的合并,那么就會減少Http請求次數
o 制定合理的Http請求數據格式和返回數據格式,做到請求數據中沒有冗余字
o 可以在Http請求數據格式里面加一個字段dataVersion代表本地已有數據的版本號,然后傳到服務器,服務器的數據表中也有一個字段是dataVersion,當服務器數據被修改的時候,dataVersion就加一,當檢測到客戶端傳上來的dataVersion小于服務器數據表中的dataVersion的時候就返回最新數據,否則可以直接返回空數據代表當前本地數據已經是最新數據,這樣就不會每次請求http的時候都會返回大量數據,當數據沒有被改變的時候直接返回空,減少了http請求過程中的數據交互(但是要考慮一點,只有一些請求數據量比較大的才適合,因為增加了dataVersion字段后無論給客戶端還是服務端也都相應的增加了維護的成本)
針對數據庫,SD卡文件操作:
o APP在對數據庫或者SD卡文件操作的時候無非也是涉及到一些數據的轉換,json轉換,可以采用json解析效率高的第三方庫,例如fast json,Jackson,gson
o 可以把一些需要持久化到數據庫或者文件中的數據先緩存在內存中,然后在一個時間點一起觸發一同更新到數據庫或者文件中;例如,在進入Activity的時候會首先從數據庫中搜索出帳戶信息并且展示在界面,然后會再去發Http請求服務器的帳戶信息數據,再把服務器最新的帳戶信息數據刷新到界面中,同時也存在一個內存對象中,這時候先不更新到數據庫,當退出這個Activity界面的時候可以去檢測帳戶數據是否發生改變,如果改變了就更新到數據中;這么做的好處是:如果在Activity界面多次修改數據,那最新的數據都是只更新到內存中的,當Activity退出后才把最新的帳戶信息數據更新到數據庫中,沒必要更改一次就同時把數據更新一次到數據庫
o SD卡的文件讀寫操作比數據庫要快,數據庫也是屬于文件,但是在寫數據的時候還要經過sqlite的一些列數據庫操作,但是SD卡在寫數據的時候是直接寫到文件中的,所以針對與簡單數據,標志變量或者數據條數很少的數據,而且安全性要求也不高的數據可以直接存在文件中,例如SharedPreferences中,只有關系型的數據,數據安全性較高的,數據記錄條數比較多的可以選擇數據庫存儲,而且如果數據庫進行加密后,對于數據庫的讀寫操作會更慢了
o 針對數據庫操作盡量不要直接使用android里面的Sqlite來手寫讀寫的那些sql語句,可以選擇一些orm框架庫,例如ormlite,GreenDao等等,我們選擇的是ormlite,因為ormlite數據庫加密已經有現成的庫可以提供使用。
以上!感謝!分析不夠全面的部分歡迎交流補充!
參考:
http://blog.csdn.net/itfootba...
http://blog.csdn.net/itfootba...
http://news.mydrivers.com/1/2...
https://github.com/google/bat...
http://hukai.me/android-perfo...
https://juejin.im/entry/589d6...
http://xusx1024.com/2018/01/0...
http://gityuan.com/2016/01/10...
http://hukai.me/android-perfo...
http://duanqz.github.io/2015-...
http://duanqz.github.io/2015-...
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及云服務器等套餐
更多網易技術、產品、運營經驗分享請訪問網易云社區。
文章來源: 網易云社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25343.html
摘要:被電子束轟擊的每個位置,熒光層都會產生一個小亮點,最終小亮點們將會組成一幅幅影像,顯示在電視屏幕上。下圖展示的是攝像機慢放后,電子束的繪制過程。未來,個推技術團隊將繼續關注移動端的性能優化,為大家分享相關的技術干貨。 作者:個推安卓開發工程師 一七 隨著科技的發展,各種移動端早已成為人們日常生活中不可或缺的部分,人們使用移動端產品工作、社交、娛樂……移動端界面的流暢性已經成為影響用戶...
閱讀 3657·2021-11-15 11:37
閱讀 2317·2021-09-24 10:39
閱讀 2442·2021-07-25 21:37
閱讀 1428·2019-08-30 15:56
閱讀 2580·2019-08-30 15:55
閱讀 948·2019-08-30 15:54
閱讀 2120·2019-08-30 14:21
閱讀 851·2019-08-30 11:24