Android Studio Profiler(Native Memory)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM