【AOSP】Android Dump 開發與調試指南

在 Android 系統開發與調試中,dump 是一個不可或缺的強大工具。它能夠提供關于系統服務、應用程序狀態以及底層硬件信息的詳細快照。對于希望深入了解 Android 系統內部工作原理、排查復雜問題或進行性能優化的開發者來說,掌握 dump 的使用至關重要。

在這里插入圖片描述

一、什么是 Android Dump?

Android Dump 是一種通過 dumpsys 工具獲取系統服務和應用程序狀態信息的調試技術。這些信息涵蓋了廣泛的領域,從電池狀態、內存使用、網絡連接,到窗口管理、活動堆棧等等。開發者可以通過 Android 調試橋 (adb) 從命令行調用 dumpsys,從而獲取到連接設備上運行的各種系統服務的診斷輸出。

例如,當你遇到應用無響應 (ANR) 問題時,系統會自動進行 dump 操作,生成包含當前所有線程堆棧信息的 traces.txt 文件,這對于分析卡死原因至關重要。

二、Android Dump 的工作原理

Android 的 dump 機制核心依賴于 Binder IPC (跨進程通信) 框架。Android 的系統服務各自運行在獨立的進程中,并通過 ServiceManager 進行注冊和管理。dumpsys 工具本身是一個運行在設備上的可執行文件,它并不直接了解各個服務的內部狀態。當用戶執行 adb shell dumpsys <service_name> 命令時,其實質上是啟動了 dumpsys 這個客戶端程序,其工作流程如下:

  1. 獲取 ServiceManager 代理dumpsys 進程首先會獲取到 ServiceManager 的一個代理對象。
  2. 查詢服務:通過這個代理對象,dumpsys 向 ServiceManager 查詢指定服務(例如 activitywindow 等)的 Binder 代理對象。
  3. 發起 Binder 調用dumpsys 通過獲取到的服務代理對象,調用一個名為 dump 的方法,并將需要傳遞的參數(如果有的話)一并發送。
  4. 服務端執行 dump:服務進程接收到這個 Binder 調用后,會在其自身的 dump 方法中實現具體的邏輯,將當前服務的內部狀態信息輸出到一個文件描述符(FileDescriptor)中。
  5. 數據回傳與顯示:輸出的數據通過 Binder 機制回傳給 dumpsys 進程,并最終顯示在你的命令行終端上。

簡而言之,dumpsys 充當了一個“信使”的角色,它通過 Binder 這座橋梁,請求并獲取了遠端系統服務的內部狀態信息。

為了更深入地理解 dump 的工作原理,我們來探究一下相關的源代碼。

2.1 dumpsys 命令的源碼實現

dumpsys 命令的源碼位于 AOSP (Android Open Source Project) 的 frameworks/native/cmds/dumpsys/ 目錄下。核心邏輯在 dumpsys.cppmain.cpp 文件中。

  • main.cpp: 這是 dumpsys 可執行文件的入口。它的主要作用是解析命令行參數,并調用 Dumpsys 類的 main 方法。

  • dumpsys.cpp: 這個文件包含了 dumpsys 的核心實現。在 Dumpsys::main 方法中,它會連接到 ServiceManager,并根據用戶傳入的服務名稱,獲取到對應服務的 IBinder 接口。

    // frameworks/native/cmds/dumpsys/dumpsys.cppsp<IServiceManager> sm = defaultServiceManager();
    ...
    if (sm != nullptr) {Vector<String16> services = sm->listServices();...sp<IBinder> service = sm->checkService(String16(serviceName));if (service != nullptr) {int err = service->dump(STDOUT_FILENO, args);...}
    }
    

    上述代碼片段展示了 dumpsys 如何通過 defaultServiceManager() 獲取 ServiceManager 的實例,然后通過 checkService 獲取到目標服務的 IBinder 代理對象。最后,調用該對象的 dump 方法,并將標準輸出的文件描述符 STDOUT_FILENO 和其他參數 args 傳遞過去。

2.2 系統服務的 dump 方法實現

每個提供 dump 功能的系統服務,都會在其代碼中實現 IBinder 接口的 dump 方法。我們以 ActivityManagerService (AMS) 為例,它的服務名稱是 activity。其源碼位于 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javapublic final class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {// ...@Overrideprotected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)!= PackageManager.PERMISSION_GRANTED) {pw.println("Permission Denial: can't dump ActivityManager from from pid="+ Binder.getCallingPid()+ ", uid=" + Binder.getCallingUid());return;}// ... a lot of logic to handle different arguments in 'args' ...if (args.length > 0) {String cmd = args[0];if ("activities".equals(cmd) || "a".equals(cmd)) {// dump activities stack} else if ("broadcasts".equals(cmd) || "b".equals(cmd)) {// dump broadcast state} else if ("services".equals(cmd) || "s".equals(cmd)) {// dump service state}// ... and so on for many other arguments} else {// default dump logic if no arguments are provided}}
}

ActivityManagerServicedump 方法中,我們可以看到:

  • 權限檢查:首先會檢查調用者是否擁有 android.Manifest.permission.DUMP 權限。這解釋了為什么我們通常需要通過 adb shell 來執行 dumpsys,因為 shell 用戶默認擁有這個權限。
  • 參數解析dump 方法會解析 args 字符串數組,根據不同的參數執行不同的 dump 邏輯。例如,如果第一個參數是 activitiesa,它就會輸出 Activity 的堆棧信息。
  • 信息輸出:通過傳入的 PrintWriter pw 對象,將服務的狀態信息格式化為字符串并輸出。

三、adb dump 的使用

3.1 adb dumpsys 的基本語法

adb shell dumpsys [service_name] [arguments]

常用命令示例

  • 列出所有可 dump 的服務

    adb shell dumpsys -l
    
  • 查看 Activity 管理器信息

    adb shell dumpsys activity
    

    這個命令會輸出非常多的信息,包括 Activity 堆棧、正在運行的服務、廣播隊列等。

  • 查看窗口管理器信息

    adb shell dumpsys window
    

    可以用來查看當前窗口的層級、焦點窗口、Surface 信息等,對于分析 UI 問題非常有幫助。

  • 查看內存使用情況

    adb shell dumpsys meminfo <package_name>
    

    可以獲取指定應用的詳細內存使用情況,是排查內存泄漏的重要工具。

  • 查看電池狀態

    adb shell dumpsys batterystats
    

    提供詳細的電池使用統計信息,幫助分析應用的耗電情況。

3.2 如何根據源碼使用 adb 查看對應信息

掌握 dumpsys 的精髓在于學會如何通過閱讀源碼來發現其強大的功能。下面我們通過一個實例來演示這個過程。

目標:我們想知道 ActivityManagerService 中最近的任務(Recent Tasks)列表。

步驟

  1. 定位到 ActivityManagerServicedump 方法
    我們已經知道其路徑在 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

  2. dump 方法中尋找與“最近任務”相關的代碼
    通過在 dump 方法中搜索關鍵詞 “recent”,我們可以找到類似如下的代碼:

    // In ActivityManagerService.java's dump method} else if ("recents".equals(cmd) || "r".equals(cmd)) {// dump recent activities
    }
    

    從這段代碼我們可以推斷出,要 dump 最近的任務列表,我們可以使用 recents 或者其縮寫 r 作為 dumpsys activity 的參數。

  3. 構造并執行 adb 命令
    根據上面的發現,我們可以在命令行中執行:

    adb shell dumpsys activity recents
    

    或者使用縮寫:

    adb shell dumpsys activity r
    
  4. 分析輸出結果
    執行上述命令后,你將會看到一個包含了最近任務信息的列表,其中有每個任務的 ID、關聯的 Activity、Intent 等詳細信息。

通過這個簡單的例子,你可以舉一反三,探索其他系統服務的 dump 方法,發現更多有用的調試選項。例如,你可以在 WindowManagerServicedump 方法中尋找與特定窗口或 Display 相關的 dump 選項,從而實現更精細化的 UI 調試。

四、總結

Android 的 dump 機制是一個功能強大且設計精巧的系統診斷工具。通過 adb dumpsys,開發者可以深入到系統的每一個角落,獲取到寶貴的狀態信息。理解其基于 Binder 的工作原理和核心代碼實現,不僅能夠幫助我們更有效地使用這個工具,更能加深我們對 Android 系統架構的理解。

更重要的是,通過將源碼閱讀與 adb 命令實踐相結合,你將能夠解鎖 dumpsys 的全部潛力,成為一名更出色的 Android 系統開發者和調試專家。希望這篇博客能夠為你打開一扇通往 Android 系統底層世界的大門。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94792.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94792.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94792.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt數據結構與編碼技巧全解析

文章目錄Qt中的數據結構QDebugqDebug函數QT的內置類型一般都會重載 << 運算符QT的幾何規則QString 字符串編碼變長 VS 定長QString 適合中轉數據嗎&#xff1f;Qstring 的底層使用寫時復制QString的具體使用QString 的構造函數格式化構造數值轉化為字符串字符串轉成數值增…

Ubuntu操作系統下MySQL、MongoDB、Redis

在開發和運維過程中&#xff0c;經常需要從Windows客戶端遠程連接到Ubuntu服務器上的數據庫。本文將詳細介紹如何在Ubuntu操作系統下安裝和配置MySQL、MongoDB和Redis&#xff0c;以允許從Windows客戶端進行遠程連接&#xff0c;并提供詳細的遠程連接命令和配置說明。一、MySQL…

校園勤工儉學微信小程序的設計與實現:基于數字化服務生態的賦能體系構建

在高等教育普及化與數字化校園建設的雙重驅動下&#xff0c;傳統校園勤工儉學管理模式正面臨深刻變革。當前高校勤工儉學工作普遍存在崗位匹配效率低下、過程管理粗放、數據孤島嚴重等痛點——根據教育部全國學生資助管理中心2022年統計數據&#xff0c;全國普通高校共有約450萬…

Apisix工作流程

是的,你的理解基本正確:當請求到達APISIX時,它會先根據請求的URI、Host、請求方法、 headers等信息匹配最合適的路由,然后執行路由關聯的插件邏輯,最后轉發到路由配置的上游服務。下面詳細講解APISIX處理請求的全鏈路及可能的情況。 一、請求全鏈路流程 APISIX處理請求的…

InnoDB存儲引擎底層拆解:從頁、事務到鎖,如何撐起MySQL數據庫高效運轉(上)

目錄 Page頁** B樹查詢 如何加快記錄的查詢&#xff1f; 索引** 聚簇索引(主鍵) 二級索引(非主鍵) 聯合索引——多列 bufferPool* Free鏈表 flush鏈表 Flush鏈表刷新方式有如下兩種&#xff1a; LRU鏈表 針對LRU鏈表方案缺點的優化 redoLog* redo簡單日志類型 redo復雜日志類型…

【人工智能99問】GPT4的原理是什么?(32/99)

【人工智能99問】GPT4的原理是什么&#xff1f;(32/99) 文章目錄GPT-4簡介一、結構與原理二、使用場景三、優缺點分析四、訓練技巧與關鍵改進五、示例說明六、總結GPT-4簡介 一、結構與原理 1. 架構設計 GPT-4基于Transformer解碼器架構&#xff0c;核心改進包括&#xff1a;…

//Q是一個隊列,S是一個空棧,實現將隊列中的元素逆置的算法。

#include<stdio.h> #include<stdbool.h> #include<stdlib.h> #define Size 6 typedef struct SqNode//隊列結點 {int data;struct SqNode* next; }LinkNode; typedef struct SqQueue//隊列 {LinkNode* front, * rear; //頭指針和尾指針 }LinkQueue; typedef …

畢馬威 —— 公眾對人工智能的信任、態度及使用情況調查

文章目錄 前言 一、背景介紹 二、對人工智能的信任與接受度 三、人工智能的使用與認知情況 四、人工智能的益處與風險 五、人工智能的監管與治理 六、工作場所的人工智能應用 七、人工智能對工作的影響 八、學生對人工智能的應用 九、核心啟示 1.新興經濟體在公眾與員工人工智能…

基于Spring Session + Redis + JWT的單點登錄實現

實現思路 用戶訪問受保護資源時&#xff0c;若未認證則重定向到認證中心認證中心驗證用戶身份&#xff0c;生成JWT令牌并存儲到Redis認證中心重定向回原應用并攜帶令牌應用驗證JWT有效性并從Redis獲取會話信息用戶在其他應用訪問時&#xff0c;通過相同機制實現單點登錄 代碼…

微服務Eureka組件的介紹、安裝、使用

微服務 Eureka 組件的介紹、安裝與使用詳解 在微服務架構中&#xff0c;服務注冊與發現是至關重要的一環&#xff0c;而 Eureka 作為 Netflix 開源的服務注冊中心&#xff0c;廣泛應用于 Spring Cloud 微服務體系中。本文將帶你全面了解 Eureka 的概念、安裝及在 Spring Boot …

【PostgreSQL內核學習:通過 ExprState 提升哈希聚合與子計劃執行效率(一)】

PostgreSQL內核學習&#xff1a;通過 ExprState 提升哈希聚合與子計劃執行效率&#xff08;一&#xff09;引言背景補丁的意義補丁概述JIT & LLVM實際例子&#xff08;以 PostgreSQL 為例&#xff09;提交信息提交描述引入 ExprState 進行哈希計算&#xff1a;支持 JIT 編譯…

web端播放flv視頻流demo(flv.js的使用)

需求&#xff1a;原本是需要前端播放RTMP視頻流的&#xff0c;但是現在的瀏覽器都不支持flash插件了&#xff0c;讓用戶安裝flash插件也不現實&#xff0c;所以直接讓后端將RTMP視頻流轉換成flv視頻流給到前端進行播放。 直接上demo&#xff0c;直接就能播放&#xff0c;如果遇…

【拍攝學習記錄】04-拍攝模式/曝光組合

曝光組合全自動半自動光圈優先手動擋【固定物體長時間不變時候、閃光燈時候、】手機上的光學變焦與數碼變焦是不同的&#xff0c;使用檔位推薦可以提升畫質。手機夜景模式長曝光【車流軌跡、星軌】HDR 大光比【日落時候使用】專業模式&#xff0c;【感光度iso、快門可以調節】…

新liunx部署mysql過程問題

首先看下是什么發行版 cat /etc/os-release CentOS Linux 7 ################################## 使用 yum下載包 發現不行 源不行 那就換成阿里的 # 進入 yum 源配置目錄 cd /etc/yum.repos.d/ # 備份所有默認 repo 文件&#xff08;以 CentOS 為例&#xff0c;其他系統…

Python 第三方庫:Beautiful Soup(HTML/XML 解釋提取)

Beautiful Soup 是一個 用于從 HTML 和 XML 文件中提取數據的 Python 第三方庫。它為復雜的網頁結構提供了簡單易用的解析接口&#xff0c;尤其適合網頁爬蟲和數據提取任務。Beautiful Soup 提供樹型結構訪問、標簽搜索、屬性提取等功能&#xff0c;并支持多種解析器&#xff0…

使用STM32CubeMX使用CAN驅動無刷電機DJI3508

簡介 文章為筆記性質 硬件包括 大疆C板 電機調速器C620 DJI3508電機 CAN知識介紹 CAN的概念 CAN是控制器區域網絡&#xff08;Controller Area Network&#xff09;的縮寫。CAN總線是一種適用于工業設備的高性能總線網絡。說白了就是也就是一種通訊方式而已。 把多個設…

Wi-Fi 802.11s自組網/EasyMesh自組網/802.11ah物聯網

一、前期調研結論 前面詳細探討了自組網和5G無線通信網絡、WiFi無線通信網絡的差異&#xff1a; 自組網 v.s 5G v.s WiFi-CSDN博客 從“分級道路”角度理解無線通信網絡拓撲包括從當前工業應用場景具體案例了解終端無線通信網絡&#xff1a; 5G無線通信網絡場景&#xff08;…

【基于hyperledger fabric的教育證書管理系統】

教育證書管理系統 系統概述 項目背景 隨著數字化轉型的深入推進&#xff0c;教育證書作為個人學術成就和專業資質的重要憑證&#xff0c;在就業市場、高等教育和職業發展中扮演著關鍵角色。然而&#xff0c;傳統教育證書管理體系面臨著數據孤島、證書偽造、驗證流程繁瑣以及跨機…

【Flask】測試平臺開發,集成禪道

概述&#xff1a; 由于公司多數測試人員還是在使用禪道&#xff0c;為了方便&#xff0c;就將禪道直接集成在我們的測試平臺中 一般可以有幾種實現方法 調用禪道的API集成集成本地部署的禪道-可能有跨域問題&#xff0c;需要解決 由于我這里已經部署了一臺本地的禪道系統&…

《UE5_C++多人TPS完整教程》學習筆記45 ——《P46 待機與跳躍(Idle And Jumps)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P46 待機與跳躍&#xff08;Idle And Jumps&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; St…