Android應用效能優化

2021-08-01 23:24:28 字數 1876 閱讀 6932

記憶體, ui,  電量

1. 記憶體

首先簡單介紹一下android系統記憶體管理機制.

記憶體共享:

預設情況:string vmheapsize = systemproperties.get("dalvik.vm.heapsize", "16m");只有16m.

可以通過在device.mk檔案中設定:product_property_overrides += dalvik.vm.heapgrowthlimit=256m

1) 防止記憶體洩漏

記憶體洩漏的根本原因是不再使用的物件還被gc root直接或者間接引用,導致gc無法**. 以下地方容易產生記憶體洩漏:

a. 重寫finalize()方法可能會導致記憶體洩漏

b. 單例模式,單利物件本身就是gc root,它自己和引用的物件不能被gc**.

c. 盡量使用靜態內部類,因為非靜態內部類自動持有外部類的引用,容易導致記憶體洩漏,而靜態內部類不持有外部類的引用.

d. 謹慎使用service, 因為service的生命週期往往比activity長,如果service持有activity的引用,容易導致activity無法被**.

e. 注意關閉資源,braodcastreceiver,contentobserver,file,cursor,stream等.

2) 防止記憶體抖動

記憶體抖動是指頻繁的建立物件和**物件,這樣會浪費大量的cpu資源.避免在迴圈語句和view.ondraw()方法中建立物件.

3) 盡量使用android優化過的資料類,如pb, sparsearray等.

4) 謹慎處理bitmap,太大就壓縮,太多就分頁載入,滑動過程中不要載入.建議使用開源框架fresco和glide.

如果要顯示超級大圖,又不能壓縮,可以用bitmapregiondeoder類進行分區域解碼顯示.

2. ui

android系統每隔16ms進行一次介面重新整理,應用主線程在16ms內不能處理完訊息佇列裡面的任務並完成介面重新整理就會導致丟幀,也就是卡頓. 卡頓超過5秒就報anr.

主要有兩種情況會導致卡頓

過度繪製是指螢幕上某個畫素在同一幀的時間內被繪製了多次,這會導致某些畫素區域被繪製了多次, 這就浪費了大量的cpu和gpu資源,導致在指定時間無法完成繪製.

針對第一種情況,我們可以將主線程的耗時操作,比如大資料量計算和讀寫io等,移到子執行緒執行即可.

針對第二種情況,主要有以下幾種解決方法:

a. 移除不必要的背景,包括windows預設背景getwindow().setbackgrounddrawable(null)。

b. 優化布局,減少布局層次,盡量多使用linearlayout,少使用relativelayout,多使用merge/include等標籤。

c. 在自定義view裡面通過canvas.cliprect()指定繪製區域,使用canvas.quickreject()減小繪製區域。

常用效能檢查工具strictmode(嚴格模式)介紹

嚴格模式監視那些本不應該在主線程中完成的工作,包括讀寫i/o,網路訪問等,還可以監視記憶體洩漏問題.

log開啟方法;

首先在應用入口進行設定,然後通過"adb logcat -s strictmode"命令檢視**中的違規情況.

3. 電量

電量消耗大戶: cpu, 網路和螢幕.這三個方面主要是在網路上做優化.

網路優化方案:

1) 預取網路資料

預取都是在網路訊號啟用的情況下進行的,減少了啟用網路訊號的開銷.

2) 壓縮傳送的資料

3) 本地快取

google在android6.0上設計了低電耗模式和應用待機模式.在這兩種模式下會將後台任務推遲,堆積到一起處理.  

Android應用效能優化

1 anr 2 listview 卡頓,不流暢 3 activity啟動慢 4 動畫不流暢,啟動前卡頓 5 自定義view啟動慢 6 oom 7 資料庫大量操作 8 長時間執行後,程式變慢 1 語言層解決問題,語法上提高效能 2 合理的資料結構和演算法 3 布局優化,布局深度控制 4 工作執行緒與u...

Web應用效能優化思路

瓶頸是什麼?一條4車道的公路,執行非常順暢,突然出了點事故,事故車導致某個地方只剩下1車道,然後就開始堵車,因為四輛車同時塞向乙個車道裡。把這個事故清除了,故障車拖走了,道路會開始恢復了通暢。這個道理誰都懂,但偏偏有些傻瓜交警去把4車道變成8車道,但卻不清理事故路段。乙個web應用,不管是何種語言開...

Mysql單機應用效能優化

簡單概括。客戶端通過scoket連線與mysql建立連線。然後就可以執行select insert update delete來讀寫資料,由執行引擎來處理。執行引擎首先記錄日誌 undo,redo 寫到日誌記憶體緩衝區中,並在滿足一定條件時flush到磁碟上的日誌檔案中。然後讀 寫資料,也是首先在資...