Performance
- https://www.udacity.com/course/android-performance--ud825
App使用時,感覺畫面不流暢,或有lag情況發生是,因為人類大腦和眼睛對動態感知是有一定範圍的。在看電影時,是以24fps(frame per seconds)來讓腦和眼感到有連續流暢的畫面。
而Android流暢的定義為60fps, 換算為16ms\/frame。所以當畫面(view)經過手機上CPU and GPU calculate, draw and render view layout and action需在此範圍內,否則就會產生所謂的lag現象。 歸納起來,可能是以下狀況:
ANR(Application Not Responding):最常見,在通常情形下,當Main Thread(或稱為UI Thread)長期被占用,就會觸發此事件。
- 在activity下,預設是5秒;BroadcastReceiver預設是10秒。
memory leak:常見,當某些錯誤的機制(程式碼),導致內部記憶體被長期占用(此記憶體暫存之內容,可能不在被程式碼所refreence使用),而不能即時被GC(Garbage Collection)。造成手機中可用記憶體越來越少,最後導致記憶體不足,Performance下降。
- 限制每個Process內部暫存記憶體(Memory Cache)只有16M,超過就會跳出異常,俗稱的OOM(Out Of Memory)。在處理大量Bitmap時要注意此狀況,可使用弱引用(Weak Preference)。
- 但也要避免GC過度操作(在同個frame頻繁create多次memory cache's data),導致OOM,影響到Main Thread操作。
畫面(view)巢狀階層的深度太深【View Hierarchy】或是過度重疊畫面(Overdraw):
- 在追求UI上炫麗的效果,常會在同一個區塊使用大量的重疊畫面。這樣的狀況會照成CPU和GPU需要經過大量的運算,而去繪製同樣的區塊。
- 盡量使用RelativeLayout來取代LinearLayout達到相同的畫面效果。畫面階層盡量扁平化,避免使用重複的layout。
- 若有重複的layout可使用<include>或是<merge>標籤達到 re-usable layout。
- 當View Hierarchy的root相同時,可以使用<merge>取代<include>達到提升效能。
- 範例:https://developer.android.com\/training\/improving-layouts\/reusing-layouts.html#Merge
避免多次 WakeLock手機,以節省手機電量消耗。做工具類App的要注意。
- 可使用 Job Scheduler,將一些較不緊急的任務藉由 Job Scheduler 機制,集合所有不緊急的任務,在適當時間和網路下,一併處理,減少手機休眠時,被polling的次數。
待補充!