1. 程式人生 > >一.Android省電開發之效能優化

一.Android省電開發之效能優化

 

電量優化

Android應用開發中的網路、定位、感測器等都是比較耗電的特性,我們應該正確使用API來有效降低應用的耗電量。 
1.BroadcastReceiver: 
在程式碼實現中需要儘量避免無用操作程式碼的執行,減少應用損耗的電量。 
對於BroadcastReceiver,通常的做法是在介面onPasuse之後取消廣播監聽器的監聽操作,同時根據具體業務需求選擇當應用位於後臺時是否禁用廣播接收器。 
2.資料傳輸: 
資料傳輸方式:藍芽傳輸,Wi-Fi傳輸,行動網路傳輸等。 
優化: 
後臺資料傳輸的管理:根據具體業務需求,嚴格限制應用位於後臺時是否禁用某些資料傳輸,儘量能夠避免無效的資料傳輸。 
資料傳輸的頻度問題:通過經驗值或者資料統計的方法確定好資料傳輸的頻度,避免冗餘重複的資料傳輸,資料傳輸過程中要壓縮資料大小,合併網路請求,避免輪詢等。 
3.位置服務: 
三種位置服務: 
GPS定位:通過接收全球定位系統的衛星提供的經緯度座標資訊實現位置服務,精度是最高的,通常在10米以內,在時間和電量的消耗上也是最高的。 
網路定位:通過行動通訊的基站訊號差異來計算出手機所在的位置,精度比GPS定位差很多,通常在幾百米範圍內。 
被動定位:最省電的定位服務,如果應用使用被動定位服務,這個應用會等待手機中其他應用、服務或者系統元件發出定位請求,並和這些元件的監聽器一起接收位置更新。 
正確有限地使用位置伺服器,減少應用耗電量。所以在程式碼中使用位置服務時,需要注意: 
有沒有及時登出位置監聽器:長時間的監聽位置更新會耗費大量的電量,通過可以選擇在頁面的onPasuse中進行登出操作,更好用且全域性有效的做法是禁用位置監聽器。 
位置更新監聽頻率的設定:根據具體的業務需求設定一個合適的更新頻率值,通常需要在定位精度和耗電量之間綜合考慮。 
多種位置服務的選擇:綜合考慮應用的具體需求在不同時機採用不同的定位服務或者選擇第三方的定位SDK。 
4.AlarmManager: 
AlarmManager的喚醒操作是比較耗電的,通常情況下需要保證兩次喚醒操作的時間間隔不要太短,在不需要使用喚醒功能的情況下儘早取消AlarmManager,否則應用會一直處於耗電狀態。 
5.WakeLock: 
使用WakeLock時,需要切記及時釋放鎖,而且通常情況下,要儘早地釋放WakeLock。保持螢幕常量 
在螢幕關閉之後,系統休眠,一些任務可能會被暫停(Timer、Handler、Thread、Service),但是某些情況下我們需要保持螢幕常量,或者不需要螢幕常量但是需要CPU一直執行,直到任務的執行完成,那麼我們可以手動設定螢幕常亮!//在Acitivty裡面使用Flag

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); FLAG_KEEP_SCREEN_ON的好處是使用方便,不要額外的許可權!

Android為了節省電量,會在使用者無操作一段時間之後進入休眠狀態。Wake Lock是一種鎖的機制,只要有人拿著這個鎖,系統就無法進入休眠。一些App為了能在後臺持續做事情,就會持有一個WakeLock,那麼手機就不會進入休眠狀態,App要做的事情能做了,但是也更加耗電。

  • App在前臺不要申請WakeLock,此時無需申請,申請的話會計算到應用電量消耗;
  • App在後臺由於業務需要必須要申請WakeLock時使用帶有超時引數的方法,防止由於忘記或者異常情況下沒有釋放;
  • 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();

 

二.Android省電開發之CPU降頻

 

      眾所周知,在android系統的耗電量排行裡,cpu的耗電佔 了比較大的一部分比例,也就是說,cpu的使用率和使用頻率將直接或間接的影響電量的分配和使用,但很遺憾,android-sdk中沒有為 android的開發者提供類似cpu管理的功能,但是當下很多省電類應用或專業的cpu管理軟體都提供了cpu的降頻甚至是超頻的功能。

     

三.Android省電開發之service

 

      Android應用開發中,難免會遇到service開發。android中服務是執行在後臺的東西,級別與activity差不多。既然說service是執行在後臺的服務,那麼它就是不可見的,沒有介面 的東西。Service和其他元件一樣,都是執行在主執行緒中,因此不能用它來做耗時的請求或者動作。你可以在服務中開一一個執行緒,線上程中做耗時動作。

     我們從三個方面來淺析一下service的省電開發

1.     檢視service是否存活以及降低優先順序:

       假如一個service工作完成,但是來不及關掉或者kill掉,使用者又看不見,所以這個service將會一直在後臺執行,勢必耗電。所以我們可以降低某些不常用service程序的優先順序,在系統記憶體吃緊的情況下, 程序優先順序低的service容易被系統kill掉。除此之外,可以利用監聽系統廣播來判斷service狀態是否存活,死亡即可手動kill掉。

2.     用IntentService代替Service開發:

      普通服務一旦啟動之後,就會一直處於執行狀態,必須呼叫stopService()或者stopSelf()方法才能讓服務停止下來。為了簡單的建立一個非同步的、會自動挺值得服務,Android專門提供了一個IntentService類。IntentService在執行完畢後自動停止,減少耗電量。

3.     後臺執行的定時任務Alarm機制:

       Service沒必要一直在後臺執行,這時候的定時任務顯得很重要。Android的定時任務有兩種實現方式,Timer類和Alarm機制。Timer有一個明顯的短板,不適合長期後臺執行的定時任務。為了能讓電池更加耐用,每種手機都會有自己的休眠策略,Android手機就會在長時間不操作的情況下自動讓CPU進入到睡眠狀態,這就有可能導致Timer中的定時任務無法正常執行。而Alarm機制則不存在這種情況,它具有喚醒CPU的功能,即可以保證每次需要執行定時任務的時候CPU能正常工作。重點來了:從Android 4.4之後,Alarm任務的觸發時間將會變得不準確,有可能會延遲一段時間後任務才能得到執行。這不是bug,而是系統在耗電性方面進行的優化。系統會自動檢測目前有多少Alarm任務存在,然後將觸發時間將近的幾個任務放在一起執行,這就可以大幅度的減少CPU被喚醒的次數,從而有效延長電池的使用時間。

 

四.Android省電開發之網路

 

       除了常規的非同步網路、多執行緒技術、本地快取等等之外,Android省電開發還有一個重要的方面是:wifi比蜂窩資料,包括2G(GPRS)、3G更省電:a)儘量在Wi-Fi下傳輸資料,當然這是廢話,不過可以考慮在有Wi-Fi的時候做預載入,比如應用中心的zip包、手Q web類應用的離線資源等;b)非Wi-Fi下,儘量減少網路訪問,每一次後臺互動都要考慮是否必須。雖然WiFi接入方式已經佔到移動網際網路使用者的50%,但是是有些手機設定為待機關閉WiFi連線,即便有Wi-Fi訊號也只能切換到蜂窩資料;

      看了一篇博文,上面資料測試,也不知道正確與否,但是能說明一定的問題。滅屏情況:滅屏傳輸,高負載download的時候WiFi最省電(70mA),3G(270mA)和2G(280mA)相當,是WiFi的4倍左右;亮屏情況:亮屏傳輸,高負載download的時候WiFi最省電(280mA),3G(360mA)和2G(370mA)相當,是WiFi的1.3倍左右;所以在Android應用省電開發中,我們可以在獲取網路方式的方面加以考慮。

 

五.Android省電開發之Android L5.0(ART)登場

 

1.      預設的ART執行模式

      最新的安卓4.4系統中引入了全新的ART模式嗎,相比之前流行已久的Dalvik模式有了很大的改變。因此LZ為大家制作了以下這張ART模式和Dalvik模式區別對比圖表,通過對比,可以一眼看出 ART模式和Dalvik模式之間的區別。

 

     這篇部落格寫的很好http://www.cnblogs.com/shaweng/p/3811461.html

     在Dalvik中,應用每次執行,位元組碼都需要通過即時編譯器轉換為機器碼,這回拖慢應用的執行效率,而在ART環境中,應用在第一次安裝時,位元組碼就會預先編譯成機器碼,使其成為了真正的本地應用。這個過程叫做預編譯。這樣的話,應用的啟動和執行都會變得更加快速。但是ART的缺點是預編譯完的機器人佔用了更大的儲存空間,應用的安裝需要更長的時間。但是犧牲空間時間換取省電速度,在Android應用中還是可以接受的,畢竟效能的提升,執行速度的變快,體驗更流暢,電池續航更久顯得更重要。

經測試,谷歌最新的Android L系統與上一版本相比續航能力可以提升36%。

     Android 5.0的亮點http://lib.91.com/comments/141029/21755059.html

 

2.      利用JobScheduler API

 

       過去,如果開發人員想通過後臺調取伺服器資料,或完成某些處理工作,應用程式必須先監聽是否有事件正在發生,併為自己設定一個喚醒時間,一旦應用程式開始執行,他需要檢查各種環境條件,以確定是否具備條件讓它完成工作,還是需要稍後再試,這種方式不僅複雜,而且容易出錯,它會不斷的浪費資源,比如當 一個應用程式被喚醒後,發現條件不符合就只能去睡覺併為下次喚醒再次設定時間,這是一個反覆的過程。   

       這個問題,將引用JobScheduler來修復,它作為一個排程應用程式,負責當應用程式被喚醒時,提供適當的執行環境,所以開發者不用再讓程式檢測環境是否符合需求,開發人員只需要按照標準的流程來,排程程式會自動為喚醒的程式,準備好執行環境。應用程式可以使用這個排程程式,來喚醒他們,比如當裝置連線到充電器後,排程程式將喚醒那些需要處理器工作的程式,讓他們進行工作,或者在裝置連線至WiFi網路的時候上傳下載照片,更新內容等。該排程程式還支援一個時間視窗,以便它可以喚醒一組應用程式,這將使那些不需要精確喚醒時間,但每隔一兩小時需要執行一次的程式能在同一時間點執行,這樣就能讓處理器保持更長時間的休眠。

      JobScheduler的優勢相當巨大,它不僅可以幫助手機節省電量, 實際由於不在需要監聽,更改和設定報警,還可以幫助開發人員減少程式碼書寫量。目前該JobScheduler類,已經加入Android L開發者預覽版。

3.      各種省電新模式和新技術

(1)      全新的Material Design風格使用者介面;

      新的使用者介面更加簡潔、色彩更加豐富。動畫效果更加合理生動,同時加入實時陰影的3D檢視,更多的使用卡片風格的顯示效果。全平臺風格也變得更為統一。

(2)      新的通知訊息系統;

      允許使用者管理通知中心中的通知訊息。原先的Android通知欄幾乎是處於無法控制的狀態,所有的應用通知都會彈出,要想關閉只能進到每一個應用中去單獨設定,或是使用第三方軟體來實現統一管理。但是現在不用了,Android 5.0已經自帶了通知管理介面。

(3)      多工介面有著全新的Google Now卡片風格;

      通知中心融入更多的卡片式風格,即使是在鎖屏狀態下也可以進行多種功能操作。同時使用者可以自定義通知的優先級別,使得使用者不會錯過任何重要的通知。還可以設定特定的通知許可權,只有被允許的通知訊息才會推送。同時還具有操作性,比如使用者在遊戲時有電話打入,不會以全屏顯示,而是彈出可操作的通知卡片,使用者可選擇接聽或拒接,不影響遊戲繼續進行。

(4)      Project Volta省電模式、BatterySaver省電模式;

       Android 5.0的省電模式是通過JobSchedulerAPI以及自動調節螢幕亮度、重新整理率來達到省電的效果,而且還使用了Project Volta量化每個應用的耗電量,在手機快沒電的情況下主動降低CPU的主頻或者關閉通訊模組,以獲得更長的待機時間。還配備了一個Battery Bistorian電池歷史記錄功能,可讓詳細顯示裝