Android Studio Profiler的Native Memory功能,只用跟蹤通過 C/C++ 分配器(包括原生 JNI 對象)進行的分配,不會跟蹤Java對象的分配。UE5引擎集成了Android的Native Memory Profiler。
以下兩種包,可以使用Android Studio的Profile功能:
① Profileable包(Profile時性能高,需要Android 10及以上的系統 ,即TargetSDK要設置為29及以上。需Perfetto來抓取):App中AndroidManifest.xml中插入profileable android:shell="true"
<manifest ...> <application ...> <profileable android:shell="true" /> </application> </manifest>
② 調試包(Profile時性能差):App中AndroidManifest.xml中插入android:debuggable="true"
<manifest ...> <application android:debuggable="true" ...>
下文使用Android Studio 4.2.1來說明該功能。

Allocation Tracking的方式有:None(不跟蹤Allocation)、Sampled(按統計學方法跟蹤部分Allocation)和Full(跟蹤所有Allocation)。
如上圖所示,Full Tracking使用實心圓來表示起點,使用虛線來表示其持續的時長;Sampled Tracking使用空心半圓來表示起點;None Tracking使用空心圓來表示起點。
該選項只影響實時Profiler時的數據獲取,Record native allocations不受該選項影響,會抓取所有符合閾值的Native內存分配。
profiler配置

注1:Native memory sampling interval (bytes)為抓取的最小內存size,大於等於該值將被memory profiler記錄。 該值越小,抓取的數據量越大。uam大廳內存分析用的是512,局內用的是1024。
注2:勾選“Start this recording on startup”,並選擇“Native memroy activity(Requires API level >= 29)”,在launch profiler時,會自動開始Recorded Native Allocations
launch profiler
自動拉起手機上app,並開始profiler

attach profiler
手動在手機上手動啟動app,如果app時debuggable的話,會看到該app的進程

Table -- Arrange by allocation method視圖

注1:Allocations Size,Deallocations Size,Remaining Size的單位為byte
注2:Remaining Size(分配並沒有釋放的內存)
Total Count(分配並沒有釋放的調用次數)
Allocations Size(所有分配的調用次數)
Allocations(所有分配的內存)
注3:!!!0000!開頭的是顯存相關的分配
Table -- Arrange by callstack視圖

unknown
// 找不到函數符號

注1:development、debuggame、debug的libUE4.so中本身會包含大量符號,可以直接在堆棧中看到很多函數的名稱
注2:test、shipping的libUE4.so在沒有debug so時,絕大多數函數會找不到符號,而顯示unknown
test、shipping的libUE4.so配置debug so的方法
方法①:本地打test、shipping包,然后使用Andriod Studio打開對應的ue4 Android工程,然后launch profiler或attach profiler
方法②:打開之前老的ue4 Android工程,將對應版本的debug libUE4.so拷貝到Intermediate\Android\arm64\gradle\app\src\main\jniLibs\arm64-v8a目錄中,然后attach profiler

如果Module Name顯示libUE4.so!libUE4.so,需要將debug libUE4.so改名為libUE4.so!libUE4.so才能找到符號

方法③:對於Profile APK方式,配置debug libUE4.so,test、shipping需要調試一次之后,再launch profiler或attach profiler才能找到符號

加載heapprofd文件
要用最新版的Android Studio(如:2021.2.1 Patch 2)來Load from file加載heapprofd文件(需要symbolize過的heapprofd文件),否則libUE4.so會有很多函數為unknown。

顯示調用圖(Call Chart)全貌

① 一共有4個CallStack,棧頂函數分別為main、 __start_thread、unknown、ERROR 1
② 從上到下,形成一個層次結構的CallStack,上面的調用函數(Caller),下面為被調用函數(Callee),與調試器里面看到的CallStack一樣
③ 鼠標放在具體的色塊棧幀上,會有如下Tips信息:

焦點切到調用圖(Call Chart)上后,並將輸入法切為英文狀態
| 快捷操作 | 說明 | 充分展開后(左右方向),快捷操作是否失效 |
| W | 放大(左右方向) | Yes |
| S | 縮小(左右方向) | Yes |
| A | 水平滾動條左移 | Yes |
| D | 水平滾動條右移 | Yes |
| 鼠標滾輪 | 垂直滾動條上下移 | No |
| Ctrl+鼠標滾輪 | 以鼠標所在位置為中心,進行放大縮小(左右方向) | Yes |
注1:充分展開后(左右方向),只能通過鼠標來拖動水平滾動條進行左右移動
注2:充分展開后(左右方向),快捷操作失效后,可通過將下拉框重新選一下“Total Remaining Size”來恢復成瀑布圖全貌

在左側列表欄的Natvie Sampled上右鍵,可將數據導出保存到xxxxx.heapprofd文件中
參考
Native Memory Profiling with Android Studio 4.1
