功耗優化-頁面停留功耗從100mmA到0

背景

在一個頁面改版後,頁面停留平均功耗從改版前360mmA上升到460mmA。功耗嚴重上升,需要優化才上線。

原理先行

功耗影響的要素
耗電組成

CPU

所有的cpu計算都是消耗電量的。主要包括:數學運算,浮點運算比較耗cpu資源,儘量使用移位代替。儘量避免使用算法複雜度的算法。最爲典型的就layout佈局:如果多嵌套一層,算法複雜度就越高,需要多次執行onMeasure,onLayout和onDraw。這樣情況應該使用約束佈局或者相對佈局減少嵌套層數。
cpu分析
通過Android studio-view-tools Windows——Profiler可以查看cpu的具體執行情況
cpu執行情況
發現功耗異常時,首先可以查看cpu的執行情況。通過Record記錄cpu的執行方法詳情。

  • 如果是停留頁面,那麼所有的線程應該都是空閒,否則都是功耗異常,需要優化
  • 如果存在頁面更新,可以開發者模式-顯示面更新,查看更新區域是否已經是最小區域

屏幕

屏幕是耗電最大元件之一。顯示基本所有的手機屏幕都是LED類型。LED每個屏幕像素都可以看成是一個LED燈,由RGB三種顏色共同呈現,不同顏色能量消耗也各不相同。黑色不使用任何顏色,不消耗能量,白色相反使用了所有顏色且亮度高,所以能量消耗也更多。而且根據實踐,透明度需要消耗更多的內存,cpu計算和待機功耗
在待機功耗中,使用偏暗色的顏色,能夠明顯降低功耗。

網絡、定位、傳感器和定時任務等

數據網絡比wifi更新耗電。定位和傳感器等在使用過程中都會耗電。使用JobScheduler代替wakelock。

過程分析

  1. 知道頁面停留功耗增大後,立刻使用Android Profiler分析cpu的執行情況。發現並沒有任何log和線程執行情況,也沒有頁面更新。確認不是cpu、網絡、定位和界面更新等等可執行情況
  2. 考慮到屏幕的情況,應該和佈局有關係。採用二分法和控制變量法。經常統計,其他頁面也存在功耗異常問題。而他們的共同點,是多新增了幾條橫線。果然在刪除掉幾條新增的橫線時,功耗立即迴歸到360mmA左右。
  3. 但是UI效果需要這幾條橫線,懷疑是橫線的實現方式有問題。分析代碼,發現橫線使用了shape,並且使用了8位顏色值。修改成6位顏色值後,立刻功耗優化了60mmA.
  4. 還是超標了40mmA。再次查詢原理,對比前後的ui界面,發現白色區域高度增加了160dp。把之前的界面拉伸160dp後,發現改版前電流增加了20mmA
  5. 還是超標了20mmA。再次分享橫線的實現方式,發現橫線view啓用了軟件加速(LAYER_TYPE_SOFTWARE)。去掉之後,再次優化了20mmA,達到標準。軟件加速,是因爲虛線才需要軟件加速,但是普通橫線並不需要。

總結

功耗異常,可以通過查看cpu執行情況和佈局方式逐步定位。在實際中,耗電統計需要專門的儀器。普通開發者最簡單的方式是通過手機的耗電統計。
本次主要經過:去除透明度——分析顏色值明暗——去掉軟件加速。實現了頁面停留功耗從100mmA到0。

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