天天看點

使用 Snapdragon Profiler 分析 Android 應用的 GPU 記憶體洩露

前幾天同僚發現一個正在開發的小程式在反複進入退出時,應用的 GPU 記憶體占用會一直上漲直到觸發 OOM,因為小程式使用了核心作為渲染引擎,是以懷疑是核心發生記憶體洩露,讓我幫忙分析看看。

使用 Snapdragon Profiler 分析 Android 應用的 GPU 記憶體洩露

Snapdragon Profiler Snapshot Capture

進入小程式後,使用

Snapdragon Profiler

Snapshot Capture 抓取了目前幀的 GPU 快照,可以看到一共配置設定了 4 個 GL Context。

使用 Snapdragon Profiler 分析 Android 應用的 GPU 記憶體洩露
檢視每個 Context 配置設定的紋理

點選右上角的 All 可以看到每個 Context 配置設定的紋理,從配置設定的紋理内容很快就猜到了其中三個 Context 的配置設定來源和用途。一個是 Android UI 渲染引擎 HWUI 配置設定的,一個是我們浏覽器核心配置設定的,還有一個是因為攝像頭掃碼子產品配置設定。而第四個 Context 配置設定了大量的紋理,但是不知道是哪個子產品配置設定的。

退出小程式後在應用的主界面再抓一幀 Snapshot,可以發現核心配置設定的 Context 已經釋放了絕大部分的紋理(隻保留一些内部作為 placeholder 使用),而第四個 Context 沒有釋放紋理。再進入小程式後再抓一次 Snapshot,發現該 Context 重複配置設定了同樣的紋理,進而可以确定是這個 Context 發生了洩漏。把這個 Context 配置設定的紋理截圖發給同僚,很快就确認了是應用的一個 Native 元件自己配置設定的 GL Context 發生了洩漏。

一些 takeaway:

  1. Chromium 核心本身隻會配置設定一個實體 GL Context,WebGL,Canvas,合成器,光栅化器都是共用同一個 Context(一般是通過 Command Buffer 進行多路複用);
  2. 超級 App 通常整合了多個不同元件,這些元件有可能使用了不同的渲染引擎,有自己的 GL Context 和紋理緩存池,如果發生 GPU 記憶體洩漏使用一些底層的 Profiler 工具外部工具進行對應用進行全面分析更容易找出問題;
  3. 因為嵌入式 View 和混合渲染的使用,網頁可能内嵌了其它 Native 元件,這些元件可能有自己的 GL Context;

關于 Snapdragon Profiler 使用過程碰到的常見問題的 Q&A:

  1. Snapdragon Profiler 支援 Windows/Mac/Linux,但是因為是使用 .Net 開發,在 Linux 下要安裝 Mono 架構,安裝和使用比較麻煩,建議使用 Mac 或者 Windows;
  2. 理論上現在使用高通晶片的手機都支援,如果不行可以使用 Pixel 系列;
  3. 雲真機這種 adb 通過網絡映射的連結,Snapshot 會無法擷取資料,需要使用資料線連結實機;Chromium 核心本身隻會配置設定一個實體 GL Context,WebGL,Canvas,合成器,光栅化器都是共用同一個 GL Context

繼續閱讀