Android進階之路 - DDMS調試之旅

因維護老項目,項目中涉及SQL數據庫的存儲部分,在調試程序時因隨時需要查看數據走向,想起了DDMS這種調試工具,記得上一次使用已經是4年前了,畢竟在使用Eclipse開發Android的階段中DDMS早已存在,雖然現在AndroidStudio已經有了很多新的工具更新替代,但是很多好用的東西終究不會那麼輕易過時 ~

場景

根據查詢得知AndroidStudio3.0/3.1之後因monitor功能用的基本比較少,Google就不想再佔用一個菜單,所以之前通過菜單欄操作已被弱化,當然弱化並不代表不存在 ~

自我需求:查看存儲於本地數據庫的數據內容

開發工具:AndroidStudio3.2

DDMS基本概念

關於一些基本概念,引用了一位較早道友的總結,本來想在原基礎上錦上添花,卻發現很容易畫蛇添足,故僅以個人理解稍加修飾

DDMS:Dalvik Debug Monitor Service

  • 每一個Android應用都運行在Dalvik虛擬機的實例中,同時每一個虛擬機的實例都是一個獨立的進程;
  • 因其內部的線程機制、內存機制等都依賴於底層的操作系統而實現,所以Android應用的線程都對應依賴一個Linux線程,因而虛擬機可以更多依賴操作系統的線程調度和管理機制

工作流程

  • DDMS啓動時會與ADB之間建立一個device monitoring service用於監控設備,當設備斷開或鏈接時,這個service就會通知DDMS
  • 當設備鏈接上之後,DDMS和ADB之間又會建立VM monitoring service用於監控設備上的虛擬機,
  • 通過ADB Deamon與設備上的虛擬機的debugger建立鏈接,這樣DDMS就開始與虛擬機對話了
  • 根據以上所述我們發現DDMS在IDE與設備中承擔着中間人的角色

DDMS功能介紹

一級菜單
  • Devices:查看到所有與DDMS連接的設備詳細信息,包含模擬器與手機,對應進程最右邊相調試器鏈接的端口
  • Thread:查看進程中線程情況
  • Heap:查看應用中內存(堆)使用情況
  • Allocation Tracker: 分配跟蹤器
  • NetWork Statistics: 網絡分析功能
  • File Exporler:File Exporler文件瀏覽器,查看Android模擬器中的文件,可以很方便的導入/出文件
  • Emulator Control:實現對模擬器的控制,如:接聽電話,根據選項模擬各種不同網絡情況,模擬短信發送及虛擬地址座標用於測試GPS功能等
  • LogCat :查看日誌輸入信息,可以對日誌輸入進行Filter過濾一些調試的信息篩選查看等
二級菜單
Devices
  • Debug: 實現使用DDMS對代碼進行調試,使用該功能的前提是IDE中具有該運行進程的源代碼,否則該按鈕爲灰色,功能無法使用
  • Update heap: 實現對進程中的堆進行更新的操作。只有當選擇這個按鈕後,在右側的功能面板中的heap選項卡中就能夠看見當前進程的堆使用情況: 點擊Cause GC 可以觸發虛擬機的垃圾回收機制
  • Dump HPROF file: 將當前進程堆使用情況生成文檔,使用這個功能可以更加詳細的分析當前堆的情況,有利於查找內存泄等問題。
  • Cause GC: 觸發垃圾回收機制,可以點擊後查看當前進程的堆使用情況
  • Update thread: 這個功能與update heap一樣,當點擊了這個按鈕才能在右側面板的thread選項卡中查看當前進程的所用的線程運行狀態
  • Start Method Profiling: 開始進行方法分析。這個功能比較重要,後面單獨寫文章分析
  • Stop: 終止當前選中的進程
  • Screen Capture: 截屏按鈕,捕獲當前設備的屏幕狀態,該功能具有一定的延時
Threads
  • ID:虛擬機分配的唯一的線程ID,在Dalvik裏,它們是從3開始的奇數。
  • Tid:linux的線程ID
  • Stauts:線程狀態,
  • running:正在執行程序代碼
  • sleeping:執行了Thread.sleep()
  • monitor:等待接受一個監聽鎖
  • wait:Object.wait()
  • native:正在執行native代碼
  • vmwait:等待虛擬機
  • zombie:線程在垂死的進程
  • init:線程在初始化(我們不可能看到)
  • starting:線程正在啓動(我們不可能看到)
  • utime:執行用戶代碼的累計時間
  • stime:執行系統代碼的累計時間
  • name:線程的名字

啓動DDMS

通用方式(適用As各版本)

1.獲取SDK存儲地址:File → Project Structure(Ctrl + Alt +Shift + S) → SDK Location
在這裏插入圖片描述
2.啓動cmd命令依次輸入以下命令
在這裏插入圖片描述
命令分解如下

  • 進入tools
    在這裏插入圖片描述
  • 執行monitor.bat
    在這裏插入圖片描述
    3.啓動結果
    在這裏插入圖片描述
較新方式(適用As3.1及之後版本)

1.View → Tool Windows → Device File Explorer
在這裏插入圖片描述
2.啓動結果
在這裏插入圖片描述

查看數據庫

連接場景
查看方式

操作路徑:File Explorer → data
在這裏插入圖片描述
如data下無任何數據,打開cmd命令進行以下操作

  • 模擬器可直接操作
  • 真機需在Root的情況下操作
//進入platform-tools文件夾下 (路徑不盡相同,根據之前提到的方式自行查看目錄地址)
cd C:\Users\Acer\AppData\Local\Android\Sdk\platform-tools

//打開對應的data權限
adb shell su -c "chmod 777 /data"
adb shell su -c "chmod 777 /data/data"

//逐步打開app、databases、db等對應權限文件
adb shell su -c "chmod 777 /data/data/包名"
adb shell su -c "chmod 777 /data/data/包名/databases"
adb shell su -c "chmod 777 /data/data/包名/databases/*"

如需導出選中文件,通過DDMS右上角的導出工具即可

啓動DDMS調試期間 - 所遇問題

8700端口占用問題

1.cmd輸入指令 netstat -a -o 8700 (主要查看是哪個進程佔用了端口)
在這裏插入圖片描述

2.cmd輸入 tasklist /fi "pid eq 5052 (尾部的5052進程名是通過上一步獲取的,每個人不盡相同)

通過進程號我們獲取了佔用該端口的應用程序,我們只需關閉該程序,重新嘗試啓動DDMS,即可正常啓動
注:這裏因我已操作完畢,故可正常啓動,如您當前進程運行的也是monitor.exe的程序的話就是正確的

在這裏插入圖片描述

權限不足問題 - /system/bin/sh: su: not found
  • 場景

此問題產生在獲取dada/dada文件夾權限期間

adb shell su -c "chmod 777 /data/data"
  • 解決

最直接的解決方式就是Root, 但是Root了會有很多潛在風險

找不到Hierarchy View 視圖工具

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章