來到了 DevTools 系列的第二章,上一篇我們講解了 Flutter Inspector 與 Performance 用法,使用工具瀏覽 Widget Tree 架構,並了解 UI Thread、Raster Thread 每幀表現,有效幫助我們定位出問題來源。本文延續到重要的 CPU Profiler、Memory 與 Logging,可以知道程式碼與函式的消耗時間,從中思考寫法上是否要改變,再來就是記憶體的使用情況,關乎 APP 運行情況的關鍵數據,透過這些工具去優化產品、改善體驗。如果不知道如何使用或不熟悉的話沒關係,跟著我快速認識並掌握它們!
監控 CPU 使用情況,錄製對 APP 的互動和操作,可以查看每個函式的執行時間,包含 Total Time 和個別的 Self Time,從花費最多時間的部分進行優先檢查和處理,太久可能會導致性能問題。
Record
,操作 APP 指定流程,點擊 Stop
,資訊會很快地載入出來右上角提供了其他操作,包含 Filter、Display guidelines、Expand All、Collapse All。很棒的是還能查看其他 Isolate 的運行狀況,從中間下方的選單挑選。
以範例來看,畫面是在執行動畫,所以可以看到相關的處理函式
搜尋框的旁邊有個幫助按鈕 ?
,說明可以執行的介面操作與顏色意義。
包含 Main isolate 和其他 isolates 的資訊,當要查看其他 isolate 的運作狀況時必須點擊,載入相關資料。
1,000 Hz
、4,000 Hz
和 20,000 Hz
,素率越高搜集的樣本越多在 low 模式,進行指定的操作路徑錄製,花費 2.2 秒,蒐集到 114 筆數據,平均51筆/秒
在 medium 模式,進行指定的操作路徑錄製,花費 1.5 秒,蒐集到 177 筆數據,平均118筆/秒
在 high 模式,進行指定的操作路徑錄製,花費 2.6 秒,蒐集到 453 筆數據,平均174筆/秒
可視化記憶體的使用情況,檢查物件和記憶體,嚴重可能導致 App 崩潰關閉。正常來說,Dart VM 會在物件創建時為它分配記憶體,並在 Object 不再使用時釋放內存、清除,這時候會需要 Dart GC。
什麼情境下需要使用:
適合 Profile 下使用 Memory 檢測,Debug mode 表現上會有些許差異
顯示熱視圖,可以放大並詳細查看正在處理、運算的內容
描述顏色意義,代表每個動作和事件
點擊虛線就會顯示指定時間點的記憶體資訊,包含裝置的紀錄時間。另外,如果剛好 Dart 有執行 GC 處理,就會多一個藍色點點。
顯示時間區段內的資料。點擊下拉式選單,可以控制圖表上顯示的時間區段,如果時間越長顯示的數據就會越多,可能就會讓操作有點遲緩。
在 DevTools 支援手動 Garbage Collecting,即時釋放記憶體資源。
如果發現有未使用的物件,那這些實體就是內存洩漏的原因,如果超過設備的可用記憶體容量,APP 就會崩潰。我們可以從表格觀察物件的 Instances count、Total Size、Dart Heap Size 了解記憶體使用狀況,透過欄位幫助排序,更快地找出原因。
可以導出 CSV 報告文件
根據當前的 APP 狀況進行快照,擷取所有記憶體使用資訊。可以搜集兩個場景的狀態,使用 Diff 進行比對,可以看到 Instance 數量和記憶體大小的變化,有差異的話前面會有正負號。
追蹤指定 Class 的變化,了解實體數量,並附帶佔比,讓我們更了解實際情況。經由 Bottom Up 和 Call Tree 瀏覽被使用的時機點,資訊被描述的很清楚。
使用方式:
以下圖示官方提供。實際使用時 DevTools 會崩潰,無法附上實際 APP 運作狀況,先回報官方等修復。
target
屬性,可能會是 null,要進行額外檢查factory constructor
、getter
、late initializer
dispose()
裡有準確釋放物件、資源dispose()
後給予 null,標示為可以被 GCKind
藍為辨識,例如:Dart GC、Flutter Framework、Image,還有我們的自定義的訊息k
代表,以逗點來設置多個關鍵字以下範例查看 Framework 相關資訊:
debugPrint()
,保持訊息的完整,不會被截斷stdout
針對 Production 環境設置,確保在正式環境不會紀錄 log 資料,避免資料洩漏:
void main() {
if (isProd && kReleaseMode) {
debugPrint = (String? message, {int? wrapWidth}) {};
}
}
相信到這裡大家應該更知道如何使用它們了,官方團隊持續地在進行優化,結合目前的 Material 3 設計,重點就是要讓開發者更方便地去使用,不管是 UI 還是檢測功能都完整了。我們當然不能忽視它,DevTools 的 CPU Profiler 與 Memory 是核心功能,APP 的效能表現一目了然,不要因為自己的手機順暢就覺得沒有問題,每位用戶的裝置、配備可是差異很大。有關 Object 數量、時間消耗、記憶體變化,每個環節都可能會導致應用卡頓,需要我們在開發時特別注意,所以效能調校、優化產品是非常重要的。我們不只要完成一個產品,還要完成一個好的產品,你說是吧!