Android電量優(yōu)化提高手機續(xù)航
正文
節(jié)能減排,從我做起。一款A(yù)ndroid應(yīng)用如果非常耗電,是一定會被主人嫌棄的。自從Android手機的主人用了你開發(fā)的app,一天下來,也沒干啥事,電就沒了。那么他就會想盡辦法找出耗電量殺手,當(dāng)他找出后,很有可能你開發(fā)的app就被無情的卸載了。為了避免這種事情發(fā)生,我們就要想想辦法讓我們的應(yīng)用不那么耗電,電都用在該用的時候和地方。
通過power_profile.xml查看各個手機硬件的耗電量
Google要求手機硬件生產(chǎn)商都要放入power_profile.xml文件到ROM里面。有些不太負(fù)責(zé)的手機生產(chǎn)商,就亂配,也沒有真正測試過。但我們還是可以大概知道耗電的硬件都有哪些。
先從ibotpeaches.github.io/Apktool/ 下載apktool反編譯工具,然后執(zhí)行adb命令,將手機framework的資源apk拉取出來。
adb pull /system/framework/framework-res.apk ./
然后我們用下載好的反編譯工具,將framework-res.apk進行反編譯。
java -jar apktool_2.7.0.jar d framework-res.apk
apktool_2.7.0.jar換成你下載的具體的jar包名稱。 power_profile.xml文件的目錄如下:
framework-res/res/xml/power_profile.xml
<?xml version="1.0" encoding="utf-8"?>
<device name="Android">
<item name="ambient.on">0.1</item>
<item name="screen.on">0.1</item>
<item name="screen.full">0.1</item>
<item name="bluetooth.active">0.1</item>
<item name="bluetooth.on">0.1</item>
<item name="wifi.on">0.1</item>
<item name="wifi.active">0.1</item>
<item name="wifi.scan">0.1</item>
<item name="audio">0.1</item>
<item name="video">0.1</item>
<item name="camera.flashlight">0.1</item>
<item name="camera.avg">0.1</item>
<item name="gps.on">0.1</item>
<item name="radio.active">0.1</item>
<item name="radio.scanning">0.1</item>
<array name="radio.on">
<value>0.2</value>
<value>0.1</value>
</array>
<array name="cpu.active">
<value>0.1</value>
</array>
<array name="cpu.clusters.cores">
<value>1</value>
</array>
<array name="cpu.speeds.cluster0">
<value>400000</value>
</array>
<array name="cpu.active.cluster0">
<value>0.1</value>
</array>
<item name="cpu.idle">0.1</item>
<array name="memory.bandwidths">
<value>22.7</value>
</array>
<item name="battery.capacity">1000</item>
<item name="wifi.controller.idle">0</item>
<item name="wifi.controller.rx">0</item>
<item name="wifi.controller.tx">0</item>
<array name="wifi.controller.tx_levels" />
<item name="wifi.controller.voltage">0</item>
<array name="wifi.batchedscan">
<value>.0002</value>
<value>.002</value>
<value>.02</value>
<value>.2</value>
<value>2</value>
</array>
<item name="modem.controller.sleep">0</item>
<item name="modem.controller.idle">0</item>
<item name="modem.controller.rx">0</item>
<array name="modem.controller.tx">
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</array>
<item name="modem.controller.voltage">0</item>
<array name="gps.signalqualitybased">
<value>0</value>
<value>0</value>
</array>
<item name="gps.voltage">0</item>
</device>
抓到不負(fù)責(zé)任的手機生產(chǎn)商一枚,好家伙,這么多0.1,明眼人一看就知道這是為了應(yīng)付Google。盡管這樣,我們還是可以從中知道,耗電的有Screen(屏幕亮屏)、Bluetooth(藍牙)、Wi-Fi(無線局域網(wǎng))、Audio(音頻播放)、Video(視頻播放)、Radio(蜂窩數(shù)據(jù)網(wǎng)絡(luò))、Camera的Flashlight(相機閃光燈)和GPS(全球定位系統(tǒng))等。
電量殺手簡介
Screen
屏幕是非常耗電的一個硬件,不要問我為什么。屏幕主要有LCD和OLED兩種。LCD屏幕白色光線從屏幕背后的燈管發(fā)出,盡管屏幕顯示黑屏,依舊耗電,這種屏幕逐漸被淘汰,如果你翻出個早點的功能機,或許能看到。那么大部分Android手機都是OLED的屏幕,每個像素點都是獨立的發(fā)光單元,屏幕黑屏?xí)r,所有像素都不發(fā)光。有必要時,讓屏幕息屏很重要,當(dāng)然手機也有自動息屏的時間設(shè)置,這個不太需要我們操心。
Radio數(shù)據(jù)網(wǎng)絡(luò)和Wi-Fi無線網(wǎng)絡(luò)
網(wǎng)絡(luò)也是非常耗電的,其中又以數(shù)據(jù)網(wǎng)絡(luò)的耗電更多于Wi-Fi的耗電。所以請盡量引導(dǎo)用戶使用Wi-Fi網(wǎng)絡(luò)使用app的部分功能,比如下載文件。
GPS
GPS也是很耗電的硬件,所以不要動不動就請求地理位置,GPS平常是要關(guān)閉的,除非你在使用定位和導(dǎo)航等功能,這樣你的手機續(xù)航會更好。
WakeLock
如果使用了WakeLock,是可以有效防止息屏情況下的CPU休眠,但是如果不用了,你不釋放掉鎖的話,則會帶來很大的電量的開銷。
查看手機耗電的歷史記錄
// 上次拔掉電源到現(xiàn)在的耗電情況 adb shell dumpsys batterystats --unplugged
你在逗我?讓我看命令行的輸出?后面我們來使用Battery Historian的圖表進行分析。
使用Battery Historian分析手機耗電量
安裝Docker
Docker下載網(wǎng)址 docs.docker.com/desktop/ins…
使用Docker容器編排
docker run -p 9999:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999
獲取bugreport文件
Android7.0及以上
adb bugreport bugreport.zip
Android6.0及以下
adb bugreport > bugreport.txt
上傳bugreport文件進行分析
在瀏覽器地址欄輸入 http://localhost:9999

點擊Browse按鈕并上傳bugreport.zip或bugreport.txt生成分析圖表。

我們可以通過時間軸來分析應(yīng)用當(dāng)下的電池使用情況,比較耗電的是哪部分硬件。
使用JobScheduler來合理執(zhí)行后臺任務(wù)
JobScheduler是Android5.0版本推出的API,允許開發(fā)者在符合某些條件時創(chuàng)建執(zhí)行在后臺的任務(wù)。比如接通電源的情況下才執(zhí)行某些耗電量大的操作,也可以把一些不緊急的任務(wù)在合適的時候批量處理,還可以避開低電量的情況下執(zhí)行某些任務(wù)。
以上就是Android電量優(yōu)化手機續(xù)航的詳細(xì)內(nèi)容,更多關(guān)于Android電量優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android開發(fā)中的Surface庫及用其制作播放器UI的例子
這篇文章主要介紹了Android開發(fā)中的Surface庫及用其制作播放器界面的例子,利用SurfaceView和SurfaceHolder可以高效地繪制和控制圖形界面,需要的朋友可以參考下2016-04-04
Android實現(xiàn)頂部底部雙導(dǎo)航界面功能
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)頂部\底部雙導(dǎo)航界面功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android編程之canvas繪制各種圖形(點,直線,弧,圓,橢圓,文字,矩形,多邊形,曲線,圓角矩形)
這篇文章主要介紹了Android編程之canvas繪制各種圖形的方法,涉及Android使用Canvas類中常用繪圖方法的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12
從源代碼分析Android Universal ImageLoader的緩存處理機制
這篇文章主要介紹了從源代碼分析Android Universal ImageLoader的緩存處理機制 的相關(guān)資料,需要的朋友可以參考下2016-01-01
ListView實現(xiàn)頂部和底部內(nèi)容指示器的方法
這篇文章主要介紹了ListView實現(xiàn)頂部和底部內(nèi)容指示器的方法,需要的朋友可以參考下2015-09-09
Bootstrap 下拉菜單.dropdown的具體使用方法
這篇文章主要介紹了Bootstrap 下拉菜單.dropdown的具體使用方法,詳細(xì)講解下拉菜單的交互,有興趣的可以了解一下2017-10-10
Android編程基礎(chǔ)之Menu功能菜單設(shè)計實例
這篇文章主要介紹了Android編程基礎(chǔ)之Menu功能菜單,結(jié)合實例形式分析了基本的Menu功能菜單原理、定義與響應(yīng)機制,需要的朋友可以參考下2016-10-10

