android性能優(yōu)化之電量優(yōu)化

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按鈕胁澳。之后會分析成下面這張圖


image.png

image.png
  • battery historian分析


    原創(chuàng)圖片.png

(因為我之前測試時間比較短,所以這里我借了以前看的文章保存的一張圖片)
在該圖中特別感興趣的是電池水平的黑色線米者,水平韭畸,下降趨勢線宇智,在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的消耗

image.png

我們可以看到此時qq是耗電占據(jù)第二位(我這里我打開的軟件比較少)

查找特定應(yīng)用程序的數(shù)據(jù):位于App Selection下面沥潭,可以選擇也可以自己輸入包名

image.png

電量分布

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)進一步降低速度钾腺。

  1. 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ò)并延遲其工作见坑,同步和標準警報嚷掠。


    image.png

系統(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)化白名單列表來解決問題则果。

    1. 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ò)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尚辑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盔腔,更是在濱河造成了極大的恐慌杠茬,老刑警劉巖月褥,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓢喉,居然都是意外死亡吓坚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門灯荧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來礁击,“玉大人,你說我怎么就攤上這事逗载《吡” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵厉斟,是天一觀的道長挚躯。 經(jīng)常有香客問我,道長擦秽,這世上最難降的妖魔是什么码荔? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任纤控,我火速辦了婚禮星压,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猖腕。我一直安慰自己触幼,他們只是感情好硼瓣,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著置谦,像睡著了一般堂鲤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上媒峡,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天瘟栖,我揣著相機與錄音,去河邊找鬼谅阿。 笑死半哟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奔穿。 我是一名探鬼主播镜沽,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贱田!你這毒婦竟也來了缅茉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤男摧,失蹤者是張志新(化名)和其女友劉穎蔬墩,沒想到半個月后译打,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拇颅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年奏司,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片樟插。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡韵洋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黄锤,到底是詐尸還是另有隱情搪缨,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布鸵熟,位于F島的核電站副编,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏流强。R本人自食惡果不足惜痹届,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望打月。 院中可真熱鬧队腐,春花似錦、人聲如沸僵控。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽报破。三九已至,卻和暖如春千绪,著一層夾襖步出監(jiān)牢的瞬間充易,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工荸型, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盹靴,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓瑞妇,卻偏偏與公主長得像稿静,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辕狰,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容