性能優化6--電量優化

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/07/07/9278077.html
-Advertisement-
Play Games

1、 電量測試Android4.1版本之後在系統增加了battery info模塊,記錄一定時間周期內整機及單個App的電量消耗。2.1 註冊廣播ACTION_BATTERY_CHANGED 然後就可以獲取電池電量、充電狀態、電池狀態等信息。具體參考BatteryManager。缺點:①獲取到的是手 ...


1、 電量測試
Android4.1版本之後在系統增加了battery info模塊,記錄一定時間周期內整機及單個App的電量消耗。
2.1 註冊廣播
ACTION_BATTERY_CHANGED

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(filter,receiver);

然後就可以獲取電池電量、充電狀態、電池狀態等信息。具體參考BatteryManager。
缺點:
①獲取到的是手機整體的耗電量,而不是特定App的耗電量;
②實時性差,精度較低,只能接受被動通知電量餘量以及跳變。 

2.2 Battery Historian
  最強大、最推薦的工具:Battery Historian是Android5.0之後Google開源的一款用於檢測與電池有關的信息和事件的工具,從設備中收集電池數據,然後使用Battery Historian可以可視化分析相關指標如耗電比例、Wifi、蜂窩數據量、WakeLock喚醒次數。隨著Android6.0更新了Battery Historian 2.0加入引起手機狀態變化的應用。
通過Battery Historian可以方便的看到各耗電模塊隨著時間的耗電情況:包含操作類型、執行時間、對應App等;還可以進行篩選特定的App,給出一個總結性的說明,包括:Network Information、 Syncs、WakeLock、Services、Process info、Scheduled Job、Sensor Use等,查看每一個模塊的總結,可以看出來每一項的耗時以及執行次數。當發現異常的時候可以針對性的進行排查。總之:Battery Historian真的很強大。
adb命令導出電量信息:

adb shell dumpsys batterystats --reset(Android4.1到4.3 adb shell dumpsys batteryinfo)
adb bugreport > bugreport.txt(Android7.0以上 adb bugreport bugreport.zip)

安裝Battery Historian後打開:http: //localhost:9999/, 上傳bugreport.txt文件開始分析,下圖分析360手機助手為例;

可以看出:360手機助手使用WakeLock的場景有:推送、定時任務、利用系統賬號同步、服務等。 悄悄的告訴你:360手機助手相比於一般應用耗電的場景更多哦,當然對於一個超級App,也不能過多要求。
安裝過程可以參考Github:battery-historian。備註:我使用Docker的方式並沒有執行成功,通過Go的方式完成的。

2、 電量優化
Android系統上App的電量消耗主要由cpu、wakelock、數據傳輸(流量和wifi)、wifi運行、gps、other senior組成,而耗電異常也是由於這幾個模塊的使用不當。
2.1 CPU時間片優化
當檢測到CPU時間片消耗異常時,需要使用TraceView,獲取進程執行信息,定位CPU占用率異常的問題,關於CPU的使用可以參照《Android性能優化(一)之啟動加速35%
》一文。

2.2 網路傳輸
通常情況下,使用3G移動網路傳輸數據,電量的消耗有三種狀態:
Full power: 能量最高的狀態,移動網路連接被激活,允許設備以最大的傳輸速率進行操作。
Low power: 一種中間狀態,對電量的消耗差不多是Full power狀態下的50%。
Standby: 最低的狀態,沒有數據連接需要傳輸,電量消耗最少。

 2.2.1 數據壓縮
通過數據壓縮等方式縮減傳輸時間,降低電量消耗,此章節可以參考《Android 性能優化(八)之網路優化》。
2.2.2 選擇更快的傳輸方式
雖然3G晶元比Wifi晶元耗電低,但Wifi的速率可以讓數據在較短時間內完成傳輸,從而降低電量消耗。
2.2.3 請求集中發送
分析和統計之類的非重要操作,可以在合適狀態(電量充足或Wifi狀態)下發送。參見3.6節JobScheduler。
2.2.4 無網狀態避免網路請求
之前在網路優化的文章里寫過,網路請求失敗之後的重試機制,但是要註意這個重試是在有網狀態下的重試。否則無網狀態下重試不會請求成功,只會消耗電量。尤其是與AlarmManager或者WakeLock連用的場景下,耗電量會更多。
2.3 GPS
定位是App中常用的功能,但是定位不能千篇一律,不同的場景以及不同類型的App對定位更加需要個性化的區分。
2.3.1 選擇合適的Location Provider
Android系統支持多個Location Provider:

I.GPS_PROVIDER:
GPS定位,利用GPS晶元通過衛星獲得自己的位置信息。定位精準度高,一般在10米左右,耗電量大;但是在室內,GPS定位基本沒用。
II. NETWORK_PROVIDER:
網路定位,利用手機基站和WIFI節點的地址來大致定位位置,這種定位方式取決於伺服器,即取決於將基站或WIF節點信息翻譯成位置信息的伺服器的能力。
III. PASSIVE_PROVIDER:
被動定位,就是用現成的,當其他應用使用定位更新了定位信息,系統會保存下來,該應用接收到消息後直接讀取就可以了。比如如果系統中已經安裝了百度地圖,高德地圖(室內可以實現精確定位),你只要使用它們定位過後,再使用這種方法在你的程式肯定是可以拿到比較精確的定位信息。 使用Criteria,設置合適的模式、功耗、海拔、速度等需求,系統會返回合適的Location Provider。
例如你的App只是需要一個粗略的定位那麼就不需要使用GPS進行定位,既耗費電量,定位的耗時也久。 2.3.2 及時註銷定位監聽
在獲取到定位之後或者程式處於後臺時,註銷定位監聽,此時監聽GPS感測器相當於執行no-op(無操作指令),用戶不會有感知但是卻耗電。

2.3.3 多模塊使用定位儘量復用
多個模塊使用定位,儘量復用上一次的結果,而不是都重新走定位的過程,節省電量損耗;例如:在應用啟動的時候獲取一次定位,保存結果,之後再用到定位的地方都直接去取。

2.4 謹慎使用WakeLock
  Android為了節省電量,會在用戶無操作一段時間之後進入休眠狀態。Wake Lock是一種鎖的機制,只要有人拿著這個鎖,系統就無法進入休眠。一些App為了能在後臺持續做事情,就會持有一個WakeLock,那麼手機就不會進入休眠狀態,App要做的事情能做了,但是也更加耗電。
v1:App在前臺不要申請WakeLock,此時無需申請,申請的話會計算到應用電量消耗;
v2:App在後臺由於業務需要必須要申請WakeLock時使用帶有超時參數的方法,防止由於忘記或者異常情況下沒有釋放;
v3:App申請使用WakeLock,任務結束之後及時釋放,讓系統再次進入休眠狀態。

PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
wl.acquire(TIMEOUT);// 使用帶有超時參數的acquire方法 
// ... do work... 
wl.release();

備註:如果只是需要屏幕常亮的話,可以使用FLAG_KEEP_SCREEN_ON,無需考慮釋放WakeLock的問題。

2.5 感測器使用
①使用感測器,選擇合適的採樣率,越高的採樣率類型則越費電;
SENSOR_DELAY_NOMAL (200000微秒)
SENSOR_DELAY_UI (60000微秒)
SENSOR_DELAY_GAME (20000微秒)
SENSOR_DELAY_FASTEST (0微秒)
②在後臺時註意及時註銷感測器監聽;

2.6 JobScheduler
  使用JobScheduler,一些任務通過JobScheduler來觸發,例如可推遲的網路請求、下載、GPS等,可以在特定場景:連接Wifi、連接電源等場景觸發。既完成了任務,也無需考慮由於一些任務導致的電量消耗。

3、 後記
4.1 電量優化的一般套路
在設置-電量里查看App的耗電情況;
使用Battery Historian進行分析,這是分析里最重要的一步;
針對分析結果,參照第三章節的優化方式進行優化。
4.2 Android系統費電嗎?
  一直有一種傳言:Android系統比較費電,然而真相不是這樣,請不要把鍋甩給Android系統:
   ①原生的Android手機其實並不耗電,不安裝App的Android手機放置一周仍然是電量充足,而且對功耗的控制在Android每次版本更新都會有所補強。
   ②耗電的原因在於手機ROM以及安裝的軟體,手機ROM會針對原生的Android做各種各樣的定製(免費贈送各種“親情軟體”,各種系統級應用)。安裝軟體的開發者不考慮電量損耗,以及都希望千方百計占用系統資源(例如保活、互拉)等。
  電量優化可以說是開發者和QA最不關註的一個方面了,但是如果任而由之,變成“電量殺手”不僅僅是傷害用戶的體驗,也是對自己的放縱。性能問題不僅僅在於發現之後的優化更改,更在平時的防微杜漸。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 採集目錄到HDFS 使用flume採集目錄需要啟動hdfs集群 spooldir source 監控指定目錄 如果目錄下有新文件產生 就採集走 註意!!! 此組件監控的目錄不能有同名的文件產生 一旦有重名文件:報錯 罷工 註意!!! 此組件監控的目錄不能有同名的文件產生 一旦有重名文件:報錯 罷工 ...
  • 概述 Flume 是 Cloudera 提供的一個高可用的,高可靠的,分散式的海量日誌採集、聚合和傳輸的軟體。 Flume 的核心是把數據從數據源(source)收集過來,再將收集到的數據送到指定的目的地(sink)。為了保證輸送的過程一定成功,在送到目的地(sink)之前,會先緩存數據(chann ...
  • 概述 序列化(Serialization)是指把結構化對象轉化為位元組流。 反序列化(Deserialization)是序列化的逆過程。把位元組流轉為結構化對象。 當要在進程間傳遞對象或持久化對象的時候,就需要序列化對象成位元組流,反之當要將接收到或從磁碟讀取的位元組流轉換為對象,就要進行反序列化。 Jav ...
  • 篇幅簡介 篇幅簡介 一、Msql數據類型 1、整型 tinyint, 占 1位元組 ,有符號: -128~127,無符號位 :0~255 smallint, 占 2位元組 ,有符號: -32768~32767無符號位 :0~65535 mediumint 占 3位元組 ,有符號: -8388608~838 ...
  • MapReduce 的輸入輸出 MapReduce 框架運轉在<key,value> 鍵值對上,也就是說,框架把作業的輸入看成是一組<key,value>鍵值對,同樣也產生一組<key,value>鍵值對作為作業的輸出,這兩組鍵值對可能是不同的。 一個 MapReduce 作業的輸入和輸出類型如下圖 ...
  • (一)問題: 最近在做Oracle數據清理,在對分區表進行數據清理時,採用的方法是drop partition,刪除的過程中,沒有遇到任何問題,大概過了10分鐘,開發人員反饋部分分區表上的業務失敗。具體錯誤為: ORA-01502錯誤:索引或這類索引的分區處於不可用狀態(英文:ora-01502:i... ...
  • 大數據時代,你在乾什麼?大家都知道數據本身並沒有什麼價值,由於分析方法的存在,使得海量的數據變得如同一座永遠開采不完的礦,是金礦還是銀礦,得看你怎麼分析和怎麼利用了,和小編一起來瞭解一下怎麼學習大數據吧。 大數據時代,你在乾什麼?大家都知道數據本身並沒有什麼價值,由於分析方法的存在,使得海量的數據變 ...
  • 設備環境:Electra、iOS11.13.1 PS:Electra最新版本進行越獄只支持11.14以下的版本、同時這是不完美越獄,每次重啟手機都需要重新越獄,最後,由於Electra版本推出倉促,一次成功率較低。僅建議喜歡瞎折騰的童鞋嘗試。 越獄結果截圖 越獄過程 進入 "Electra" 官網下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...