因維護老項目,項目中涉及SQL數據庫的存儲部分,在調試程序時因隨時需要查看數據走向,想起了DDMS這種調試工具,記得上一次使用已經是4年前了,畢竟在使用Eclipse開發Android的階段中DDMS早已存在,雖然現在AndroidStudio已經有了很多新的工具更新替代,但是很多好用的東西終究不會那麼輕易過時 ~
Sing:
場景
根據查詢得知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.啓動結果
查看數據庫
連接場景
- 真機
- 模擬器
- Stetho真機查看數據庫
查看方式
操作路徑: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了會有很多潛在風險