移動端性能監控探索:可觀測 Android 采集探針架構與實現
作者:路錦(小蘭)
背景介紹
Android 生態背景
在當今的移動應用市場,用戶體驗是決定產品成敗的關鍵因素。一個功能強大但頻繁崩潰、響應遲緩的應用,很難留住用戶。然而,Android 生態系統的復雜性給開發者帶來了巨大挑戰:
- 生態碎片化: Android生態從 2008 年發展至今,市面上存在著成百上千種不同的 Android 設備,它們擁有不同的屏幕尺寸、硬件性能和系統版本(系統 16+,API 版本 35+)。此外,各大手機廠商還會對 Android 系統進行深度定制。這種碎片化導致應用在開發和測試環境中表現良好,但在用戶的真實設備上卻可能出現各種意想不到的問題。
- 問題的不可見性: 應用發布后,它運行在一個個孤立的“黑盒”中。當用戶遇到崩潰、卡頓或功能異常時,開發者往往無法得知。傳統的日志和用戶反饋渠道效率低下,難以定位和復現問題。
- 性能優化的挑戰: 除了穩定性,應用的性能(如啟動速度、頁面加載速度、網絡請求耗時)也直接影響用戶體驗。沒有精確的數據度量,性能優化就如同“盲人摸象”,無從下手。
為了解決這些問題,真實用戶監控(Real User Monitoring, RUM)應運而生。RUM 的核心思想是,通過在應用中集成一個輕量級的 SDK,來采集每一位真實用戶在使用應用過程中的性能、穩定性和行為數據,并將其上報到數據分析平臺。
RUM 數據采集能力需求
為了有效應對上述挑戰,一個現代化的 RUM 解決方案需要具備體系化的數據采集與分析能力。它不僅要能發現問題,更要能提供足夠的信息來幫助開發者快速定位并解決問題。具體來說,其核心能力應覆蓋以下幾個方面:
- 全面的異常與穩定性監控: 能夠自動捕獲應用中的各類異常,包括 Java 崩潰、Native 崩潰、ANR(應用無響應)和自定義錯誤。通過詳細的堆棧信息和設備環境,幫助開發者快速定位代碼問題,并評估異常的影響范圍。
- 精細化的性能指標量化: 對影響用戶體驗的關鍵鏈路進行精確測量。這包括應用啟動耗時、頁面打開速度、網絡請求成功率與耗時、以及界面卡頓等。通過量化指標,開發者可以識別性能瓶頸,進行針對性優化。
- 可視化的用戶會話追蹤: 記錄用戶的完整操作軌跡與相關的性能事件。當問題發生時,能夠回溯用戶當時的操作路徑、API 調用和資源加載情況,為復現問題、理解用戶場景提供關鍵線索,實現從問題發現到根因定位的層層下鉆。
- 靈活的自定義數據上報: 除了標準的性能和異常數據,還應支持業務根據自身需求上報自定義的事件與日志,將用戶行為與業務指標相結合,賦能更深層次的產品分析與決策。
本 RUM Android SDK 正是為此目標而設計,它提供了一套完整、高效、低侵入的數據采集方案,幫助開發者洞察應用的真實表現,持續提升用戶體驗。
RUM Android 探針架構與實現
RUM SDK 旨在為 Android 應用提供全面的用戶體驗監控,通過在不同階段進行 Hook、插樁、和監聽,以實現對應用性能和穩定性的全面監控。通過一個輕量級的、模塊化的架構,實現了對應用穩定性、性能和用戶行為的無侵入式采集方案。
架構總覽

RUM Android SDK 的整體架構如圖所示:
- 接口層:最上層,對外暴露,供客戶調用的 API。
- 功能層:數據采集,具體包含網絡、交互、應用、卡頓、崩潰、自定義、Webview、頁面、應用等模塊。
- 核心層:基礎服務,工具類,日志,時間,數據協議。會話管理,配置管理,采集模塊管理。
- 網絡:Producer,用于發送數據包。
在核心的功能層中,為了高效、精準地捕獲各類事件,RUM SDK 深度結合了 Android平臺的系統特性與框架能力,構建了多樣化的采集方案。針對不同場景和數據類型,分別采用了最適合的技術手段,主要包括:基于 Android Native 信號量的采集、基于字節碼插樁的數據采集、以及基于標準 API 的采集。
基于 Native 信號量采集
- Android 應用可以包含 C/C++ 代碼(即 Native 代碼),這些代碼直接運行在設備硬件上。當這些代碼出現如訪問無效內存地址、執行非法指令等嚴重錯誤時,操作系統會向對應的進程發送一個 POSIX 信號(如 SIGSEGV 代表段錯誤, SIGILL 代表非法指令),默認行為是立即終止應用,即“閃退”。
- 同時,Android 系統的所有 UI 操作和大部分應用層回調都必須在“主線程”(UI Thread)中執行。如果主線程被耗時操作(如復雜的計算、磁盤 I/O、網絡請求、死循環等)阻塞,無法在規定時間內(對于輸入事件是5秒,對于廣播是10秒)響應用戶輸入或系統事件,系統就會認為該應用“無響應”,即 ANR (Application Not Responding)。
對于 Android 開發者,準確實時采集到 Native 的異常堆棧和 ANR 現場數據是非常必要的,這便于我們排查程序異常的根因。
技術原理:
在應用初始化時,注冊一個自定義的信號處理器來接管系統默認的處理器。當捕獲到崩潰信號或在系統判定 ANR 的精確時刻,它不會立即退出,而是先生成一個包含詳細崩潰信息(如線程堆棧、寄存器狀態、加載的庫等)的崩潰信息文件,然后再執行默認的崩潰流程。

采集能力:
Native 崩潰采集: 通過監聽 Native 信號量,在 APP 發生崩潰時采集 Native 堆棧、CPU、寄存器等生成快照文件,在 應用下次啟動時,掃描并解析崩潰信息并上報。
ANR 采集: 利用了系統發送 SIGQUIT 信號這一機制。通過在 Native 層使用 sigaction 函數監聽此信號,我們可以在系統判定 ANR 的精確時刻獲得通知,從而觸發信息收集流程。
基于字節碼插樁的數據采集
- 插樁(Instrumentation)是一種在程序運行時動態或靜態地修改其代碼的技術。在 Android 中,這通常指在編譯過程中,通過分析和修改 Java 編譯后的字節碼(Bytecode),來向現有方法中添加額外的功能(如日志、性能監控)。
使用 Transform/Instrumentatio API 結合 ASM 來實現主要的數據采集,它對應用開發者完全透明,無需手動修改業務代碼。
技術原理:
Transform/Instrumentation: google 提供了 Transform和Instrumentation API,允許第三方插件(Plugin)在 APP 打包成 .dex 文件之前的編譯過程中操作 .Class 文件。只需要實現一套轉換器,修改并替換原文件即可達到插入代碼的目的。
ASM: ASM 是一個功能比較齊全的 Java 字節碼操作與分析框架,能夠被用來動態生成類或者增強既有類的功能。
通過 Transform/Instrumentation + ASM 實現在 APP 打包流程中修改字節碼,注入日志采集代碼。

采集能力:
網絡資源請求采集: 通過插樁方式,對主流的網絡庫(如 HttpURLConnection, OkHttp2/3 等)的關鍵方法進行修改,以實現鏈路打通與采集網絡資源請求指標數據,采集如耗時、狀態碼、吞吐量和錯誤信息等性能數據。
webview 采集: 實現與 webview 的通信,并監聽了 webview 上的資源請求采集能力與頁面、異常等采集能力。
Action 采集: 監聽按鈕點擊事件,實現 action 采集能力。
基于標準 API 采集
除了底層的信號和字節碼插樁之外,SDK 還利用標準的 Java 和 Android API 來捕獲應用在運行時的關鍵事件。
技術原理:
Java API: Java 虛擬機(JVM)提供了一個標準的機制來處理未被捕獲的異常:Thread.UncaughtExceptionHandler。開發者可以設置一個全局的處理器,當任何線程因未捕獲的異常而即將終止時,該處理器會被調用。這是在應用崩潰前執行最后清理或記錄操作的唯一機會。
Android API: Android 框架層提供的生命周期回調機制,實現對頁面、用戶行為和應用啟動等事件的監控。以 Activity 為例,它是 Android 應用中用戶界面的基本單元,生命周期由一系列回調方法管理,清晰地定義了其從創建到銷毀的各個狀態。關鍵的生命周期狀態包括:

- onCreate(): Activity 首次創建,進行初始化。
- onStart(): Activity 可見,但還不能與用戶交互。
- onResume(): Activity 可見且位于前臺,可以與用戶交互。
- onPause(): Activity 即將進入后臺,通常在此停止動畫或釋放資源。
- onStop(): Activity 完全不可見。
- onDestroy(): Activity 被銷毀。
為了全局監控這些狀態,Android 提供了 Application.ActivityLifecycleCallbacks 接口,允許注冊一個監聽器來接收應用中所有 Activity 的生命周期事件。
采集能力:
Java Crash 采集: 本 SDK 通過Thread.setDefaultUncaughtExceptionHandler(this) 注冊全局異常處理器,在Java異常時收集異常類型、消息、堆棧以及當前會話、頁面等上下文信息的能力,并在應用下次啟動時上報異常信息。
卡頓采集: SDK 使用了 java 多線程能力,實現卡頓監聽。
view 采集: 通過 Android 標準回調接口,實現精確地追蹤用戶在各個頁面的活動。利用這些生命周期回調來計算頁面核心指標,例如:頁面加載時間和頁面停留時間。
Application 狀態采集: 通過監聽生命周期,實現 APP 冷熱啟動事件、前后臺切換事件采集能力。
結語
阿里云 RUM SDK 旨在為應用提供全面的用戶體驗監控,針對 Android 端實現了對應用性能、穩定性、和用戶行為的無侵入式采集方案。可以參考接入文檔 [ 1] 體驗使用。相關問題可以加入“RUM 用戶體驗監控支持群”(釘釘群號: 67370002064)進行咨詢。
參考資料:
https://developer.android.com/get-started/overview?hl=zh-cn
相關鏈接:
[1] 接入文檔
https://help.aliyun.com/zh/arms/user-experience-monitoring/access-to-android-applications
浙公網安備 33010602011771號