天天看點

Android啟動優化+ANR優化

概述

應用程式的響應是由ActivityManager和WindowManager系統服務監視的。(Activity實作了Window.Callback和KeyEvent.Callback),當主線程對輸入事件5s内沒有做出響應、BroadcastReceiver的onReceive()方法10s内沒有處理完畢或者Service的各個生命周期方法20s内沒有處理完畢。

展現

  • 啟動速度慢,進入界面卡頓
  • 動畫執行不流暢
  • 清單滑動卡頓
  • 不響應使用者事件

産生原因及解決方法

  • UI線程進行耗時操作

    避免在主線程進行耗時操作,可以放入子線程進行。合理使用多線程程式設計。

  • 采用合理的資料結構
  • 資料結構不同,其記憶體占用也不同
  • 布局嵌套過多
    • 用ViewStub或者merge減少視圖層級
    • 延遲加載
    • 問題:ViewStub,merge,include的差別?
      • include:重用布局。
      • merge:減少視圖層級。例如:外層是垂直布局,引入一個垂直布局的include,這時這個include的LinearLayout就沒意義了,可以使用merge。
      • ViewStub:當你需要時才會加載。例如:進度條,網絡請求的狀态等可以使用,可以減少記憶體使用,加快渲染速度。它是一個不可見的,大小為0的view。不支援merge标簽。
  • 同一時間動畫執行次數過多,CPU或GPU負載過重
  • view的過度繪制,頻繁measure,layout
    • 問題:什麼是view的過度繪制?

      指的是同一像素被繪制多次,Android手機開發者模式中有Debug GPU overdraw(調試GPU過度繪制)開關。可以檢測得到。(有四種顔色:藍,淡綠,淡紅,紅)。

    • 優化:
      • ①activity在setContentView時會自動填充一個預設背景,如果不需要這個背景,要取消掉,getWindow.setBackgroundDrawable(null)
      • 減少層級嵌套,如果有多個布局設定了同樣的background,可以把無用的去掉
  • 頻繁GC
  • Application裡初始化太多第三方sdk

怎麼檢視日志

找到/data/anr/traces.txt檔案。真機通路不了,必須通過adb指令行導出來(adb pull)

繼續閱讀