Battery Historian的使用
github地址:https://github.com/google/battery-historian
對于安裝其實沒什么好說,官方地址說的其實很明白普监,博客也有很多贵试,我就不說安裝了,我的是Mac凯正,所以我才用的是第一種Docker方式毙玻。
安裝完后,首先我們需要輸入兩個命令
adb shell dumpsys batterystats --reset
adb shell dumpsys batterystats --enable full-wake-history
兩個輸入完之后廊散,把數(shù)據(jù)線直接拔掉桑滩,做一些測試什么的,然后再重新插回去允睹,再輸入這條命令(7.0以上)
adb bugreport bugreport.zip
6.0以下輸入這條命令
adb bugreport bugreport.txt
隨后打開自己設(shè)置的端口號如
localhost:9000
也可以選擇備用網(wǎng)站
https://bathist.ef.lc/
提交自己剛剛生成的txt文件或者zip文件运准,隨后點擊submit就可以了。注意上面網(wǎng)站需要翻墻缭受,不然不會出現(xiàn)submit按鈕胁澳。之后會分析成下面這張圖
-
battery historian分析
(因為我之前測試時間比較短,所以這里我借了以前看的文章保存的一張圖片)
在該圖中特別感興趣的是電池水平的黑色線米者,水平韭畸,下降趨勢線宇智,在y軸上測量。例如胰丁,在電池電平線的最開始随橘,大約在早上1:20,可視化顯示電池電量相對急劇下降锦庸。
查看特定于應(yīng)用的數(shù)據(jù)
除了系統(tǒng)范圍視圖提供的宏觀數(shù)據(jù)外机蔗,Battery Historian還提供了特定于設(shè)備上運行的每個應(yīng)用程序的表格和一些可視化數(shù)據(jù)。表格數(shù)據(jù)包括:
- 應(yīng)用程序在設(shè)備上的估計耗電量酸员。
- 網(wǎng)絡(luò)信息蜒车。
- Wakelocks讳嘱。
- 服務(wù)幔嗦。
- 流程信息
調(diào)查哪些應(yīng)用消耗的功率最大:點擊 Device Power Estimates,如查看qq的消耗
我們可以看到此時qq是耗電占據(jù)第二位(我這里我打開的軟件比較少)
查找特定應(yīng)用程序的數(shù)據(jù):位于App Selection下面沥潭,可以選擇也可以自己輸入包名
電量分布
Purdue University研究了最受歡迎的一些應(yīng)用的電量消耗,平均只有25-30%左右的電量是被程序最核心的方法例如繪制圖片,擺放布局等等所使用掉的,剩下的70%左右的電量是被上報數(shù)據(jù)邀泉,檢查位置信息,定時檢索后臺廣告信息所使用掉的钝鸽。
常用電量優(yōu)化方案
核心電量優(yōu)化:
布局優(yōu)化汇恤,網(wǎng)絡(luò)優(yōu)化,控件優(yōu)化拔恰,內(nèi)存優(yōu)化等
輔助電量優(yōu)化:
1因谎、優(yōu)化定位的方式(GPS(室外)、移動網(wǎng)絡(luò)颜懊、Wi-Fi)财岔,定位時間間隔(步行、騎車河爹、駕車)匠璧,確保開啟定位和關(guān)閉定位需成對出現(xiàn)
2、弱化或者軟化廣告的植入咸这,用戶數(shù)據(jù)采集夷恍,準確投放廣告
3、充電的情況下進行任務(wù)處理
常用API使用
WakeLock
@Override
protected void onResume() {
super.onResume();
PowerManager pm= (PowerManager) getSystemService(POWER_SERVICE);
//tag用于標記鎖媳维,我們可以依據(jù)tag進行鎖的釋放
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag");
//釋放鎖
mWakeLock.acquire();
}
@Override
protected void onPause() {
super.onPause();
//釋放鎖
if(mWakeLock!=null){
mWakeLock.release();
}
}
1酿雪、需要權(quán)限
<uses-permission android:name="android.permission.WAKE_LOCK" />
2、newWakeLock方法的各種類型
- SCREEN_BRIGHT_WAKE_LOCK:保持CPU運轉(zhuǎn)侄刽,允許屏幕高亮顯示指黎,允許關(guān)閉鍵盤燈。
- FULL_WAKE_LOCK:保持CPU運轉(zhuǎn)唠梨,允許屏幕高亮顯示,鍵盤燈也保持亮度
- SCREEN_DIM_WAKE_LOCK:保持CPU運轉(zhuǎn)袋励,允許屏幕顯示但是可能是灰色的,允許關(guān)閉鍵盤燈
- PARTIAL_WAKE_LOCK:保持CPU運轉(zhuǎn),屏幕和鍵盤有可能是關(guān)閉的
手機充電狀態(tài)判斷
1.利用廣播判斷設(shè)備是否充電
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
2.提取當前充電狀態(tài)
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
通常情況下茬故,在設(shè)備連接到AC充電器的情況下盖灸,應(yīng)該最大限度地提高后臺更新的速度,如果是通過USB充電磺芭,則應(yīng)降低速度赁炎,如果電池正在放電,則應(yīng)進一步降低速度钾腺。
- JobSchedulere
你需要在稍后的某個時間點或者當滿足某個特定的條件時執(zhí)行一個任務(wù)徙垫,在Android5.0后我們可以使用JobScheduler來處理這樣的工作。如:1中使用廣播的方式我們也可以在JobScheduler通過設(shè)置條件達到
setRequiresCharging(boolean requiresCharging)
還可以配置
時間控制
每隔一段時間執(zhí)行
延時一段時間執(zhí)行事件控制
網(wǎng)絡(luò)狀態(tài)
充電狀態(tài)
設(shè)備空閑狀態(tài)
Doze和App Standby
從Android 6.0(API級別23)開始放棒,Android引入了兩項省電功能姻报,通過管理設(shè)備未連接電源時應(yīng)用程序的行為方式,延長了用戶的電池續(xù)航時間间螟。當設(shè)備長時間不使用時吴旋,Doze會通過延遲應(yīng)用的后臺CPU和網(wǎng)絡(luò)活動來減少電池消耗。App Standby推遲用戶最近未與之交互的應(yīng)用的后臺網(wǎng)絡(luò)活動厢破。
-
Doze模式(低電耗模式)
如果用戶將設(shè)備拔出并靜止一段時間荣瑟,屏幕關(guān)閉,設(shè)備將進入Doze模式摩泪。在Doze模式下笆焰,系統(tǒng)會通過限制應(yīng)用程序訪問網(wǎng)絡(luò)和CPU密集型服務(wù)來嘗試節(jié)省電池電量。它還可以防止應(yīng)用程序訪問網(wǎng)絡(luò)并延遲其工作见坑,同步和標準警報嚷掠。
系統(tǒng)會定期退出Doze一段時間,對窗口進行維護鳄梅。在窗口維護這段期間叠国,將運行所有掛起的程序,并允許應(yīng)用程序訪問網(wǎng)絡(luò)戴尸。隨著時間的推移粟焊,系統(tǒng)會越來越頻繁地安排維護窗口,有助于在設(shè)備未連接到充電器時長時間不活動時減少電池消耗孙蒙。
一旦用戶通過移動設(shè)備项棠,打開屏幕或連接充電器喚醒設(shè)備,系統(tǒng)退出Doze并且所有應(yīng)用程序恢復(fù)正晨媛停活動香追。
Doze限制
網(wǎng)絡(luò)訪問被暫停。
系統(tǒng)忽略所有的wackLock
標準AlarmManager alarms(包括setExact()和 setWindow()將推遲到下一個maintenance window坦胶。但使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()和setAlarmClock()透典,alarms定義事件仍會繼續(xù)正常啟動 晴楔,但在alarm觸發(fā)前,系統(tǒng)會短暫退出Doze模式峭咒。
系統(tǒng)不執(zhí)行Wi-Fi掃描税弃。
系統(tǒng)不允許sync adapter運行
系統(tǒng)不允許JobScheduler運行
因此國內(nèi)的開發(fā)的一些基于消息機制的應(yīng)用將收到影響,社交類應(yīng)用影響更大凑队。我們可以通過添加應(yīng)用到電池優(yōu)化白名單列表來解決問題则果。
- App 程序可發(fā)送action為ACTION_ IGNORE_ BATTERY_ OPTIMIZATION SETTINGS 的intent引導(dǎo)用戶進入設(shè)置界面將應(yīng)用程序設(shè)置進白名單列表里。
2.應(yīng)用程序還可以使用AREQUEST IGNORE_ BATTERY OPTIMIZATIONS 權(quán)限來觸發(fā)-一個系統(tǒng)對話來讓用戶添加到白名單里漩氨,而無需進入設(shè)置界面去設(shè)置西壮。
3.為了幫助安排警報,Android 6.0(API級別23)引入了兩種新 AlarmManager方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()叫惊。使用這些方法款青,您可以設(shè)置即使設(shè)備處于Doze狀態(tài)也會觸發(fā)的警報。
App Standby(應(yīng)用待機模式)
進入條件
當用戶在一段時間內(nèi)未觸摸應(yīng)用程序時,App處于App Standby狀態(tài)赋访,系統(tǒng)會把app標志為空閑狀態(tài)
退出條件
1可都、用戶明確啟動應(yīng)用程序
2蚓耽、該應(yīng)用程序當前處于前臺(作為活動的前臺服務(wù),或由其他activity或service使用
3旋炒、App生成一個用戶在鎖定屏幕或通知托盤中看到的notification
4、而當用戶設(shè)備插入電源時鼎兽,系統(tǒng)將會釋放App的待機狀態(tài),允許他們自由的連接網(wǎng)絡(luò)及其執(zhí)行未完成的工作和同步。如果設(shè)備空閑很長一段時間秉继,系統(tǒng)將允許空閑App一天一次訪問網(wǎng)絡(luò)