ADB
????????ADB,即?Android Debug Bridge?是一種允許模擬器或已連接的 Android 設備進行通信的命令行工具,它可為各種設備操作提供便利,如安裝和調試應用,并提供對 Unix shell(可用來在模擬器或連接的設備上運行各種命令)的訪問。
adb簡單命令
//查看版本
adb version
//查看已經連接的設備和開始連接設備命令
adb devices
adb connect
adb應用命令?
//查看所有應用
adb shell pm list packages
//查看系統應用
adb shell pm list packages -s
//?查看第三方應用
adb shell pm list packages -3
//?查看前臺 Activity?
adb shell dumpsys activity activities | grep mFocusedActivity//查看正在運行的 Services
adb shell dumpsys activity services [<package-name>]
//??查看應用詳細信息
adb shell dumpsys package <package-name>
//?查看應用安裝路徑
adb shell pm path <package-name>
1.WLAN 連接
借助 USB 通過 WiFi 連接來正常使用 adb 需要以下步驟:
操作步驟:
- ????????將 Android 設備與要運行 adb 的電腦連接到同一個 WiFi。
- ????????將設備與電腦通過 USB 線連接(可通過 adb devices 命令查看設備連接情況)。
- ????????通過 adb tcpip 5555 命令讓設備在 5555 端口監聽 TCP/IP 連接。
- ????????斷開 USB 連接。
- ????????找到設備的 IP 地址(可以在「設置」-「關于手機」-「狀態信息」-「IP地址」查看 IP 地址)。
- ????????通過 adb connect <device-ip-address> 命令使用 IP 地址將 Android 設備與電腦連接。
- ????????通過 adb devices 命令查看設備連接情況。
- ????????使用完畢后可通過 adb disconnect <device-ip-address> 命令斷開無線連接。
2.adb抓取ANR日志
1. 復現 ANR 并獲取錯誤報告
????????當應用出現 ANR 時,系統會生成錯誤報告并存儲在設備中。可通過以下方式獲取:
????????方法一:從設備直接導出
????????使用 ADB 拉取 ANR 日志:
adb pull /data/anr/traces.txt ~/Desktop/anr_traces.txt
????????ANR 日志通常存儲在?/data/anr/traces.txt
,包含應用卡死時的線程堆棧信息。
????????查看日志時間戳:
????????日志中會按時間順序記錄多個 ANR 事件,找到最新的時間戳(通常在文件末尾),確認與復現的問題匹配。
2.ADB 調試分析設備尺寸和分辨率
- 查看當前分辨率5:
????????使用命令adb shell wm size
,執行后會輸出設備當前的屏幕分辨率,如Physical size: 1080x1920
,若設備支持雙分辨率,可能會顯示Override size:2610x1920
等信息。
- 設置分辨率5:
????????若要修改分辨率,可使用命令adb shell wm size <寬度>x<高度>
,例如將分辨率設置為 720x1280,可輸入adb shell wm size 720x1280
。
????????設置完成后,通常需要重啟設備以使設置生效,可使用命令adb reboot
。若要恢復原始分辨率,執行adb shell wm size reset
即可。
- 獲取屏幕像素密度4:
????????使用命令adb shell wm density
,可查看屏幕的像素密度,單位為 dpi(dots per inch)。也可通過adb shell wm density <數值>
來設置像素密度,如adb shell wm density 160
,并使用adb shell wm density reset
恢復默認像素密度。
- 獲取有效顯示區域6:
????????獲取到設備的物理分辨率后,還可進一步計算有效顯示區域。
????????首先使用adb shell dumpsys window | grep -i 'statusbar'
獲取狀態欄高度,使用adb shell dumpsys window | grep -i 'navigation'
獲取導航欄高度。
????????假設狀態欄高度為statusBarHeight
,導航欄高度為navigationBarHeight
,屏幕寬度為screenWidth
,屏幕高度為screenHeight
,則有效顯示區域寬度為screenWidth
,有效高度為screenHeight - statusBarHeight - navigationBarHeight
。
3. 分析 ANR 日志內容
????????ANR 日志包含關鍵信息,重點關注以下部分:
????????(1)基本信息
????????Reason:ANR 原因,常見類型:
????????Input dispatching timed out
:輸入事件(如點擊、觸摸)處理超時
????????Service timeout
:Service 在主線程執行耗時操作(超過 20 秒)。
????????ContentProvider timeout
:ContentProvider 初始化超時(超過 10 秒)。
(2)主線程堆棧
????????日志中會顯示?main
?線程的調用棧,查看正在執行的方法:
"main" prio=5 tid=1 Blocked| group="main" sCount=1 dsCount=0 flags=1 obj=0x73b2c3c0 self=0x7f8a1c0000| sysTid=12345 nice=0 cgrp=default sched=0/0 handle=0x7f8a3009e0| state=S schedstat=( 0 0 0 ) utm=12 stm=3 core=0 HZ=100| stack=0x7fe5d1c000-0x7fe5d1e000 stackSize=8MB| held mutexes=at android.os.MessageQueue.nativePollOnce(Native method)- waiting to lock <0x12345678> (a android.os.MessageQueue) held by thread 2at android.os.MessageQueue.next(MessageQueue.java:326)at android.os.Looper.loop(Looper.java:181)at android.app.ActivityThread.main(ActivityThread.java:7050)...
重點排查:
????????是否在主線程執行網絡請求、文件讀寫等耗時操作。
????????是否存在死鎖(多個線程互相等待鎖釋放)。
(3)CPU 使用率
????????日志會顯示系統和應用的 CPU 使用情況,判斷是否因資源耗盡導致 ANR:
CPU usage from 0ms to 5000ms later:100% 12345/com.example.app: 90% user + 10% kernel20% 12346/RenderThread: 15% user + 5% kernel
Logcat
????????Android Studio 中的 Logcat 窗口是調試應用的重要工具,其核心功能在于實時顯示來自設備或模擬器的日志信息,包括應用通過Log
類添加的自定義消息、系統服務運行記錄(如垃圾回收),以及應用拋出異常時帶代碼行鏈接的堆棧跟蹤,能高效幫助開發者定位問題。
????????默認情況下日志會自動滾動到末尾,點擊或滾動鼠標可暫停該功能,如需恢復,可點擊工具欄的 “Scroll to the End” 圖標;同時,工具欄還提供清除、暫停、重啟日志等基礎操作選項。
????????每條日志條目包含豐富信息,涵蓋日期、時間戳、進程及線程 ID、標簽、包名稱、優先級(如FATAL
?ERROR
?WARNING
等)和具體消息,不同標簽有獨特顏色,便于區分日志類型。
1.優先級,日志優先級從低到高分以下幾種
v -verbose 最低級別,開發調試中的一些詳細信息,僅在開發中使用,不可出現在發布的產品中
D- debug 用于調試的信息,可以在與發布中關閉,比較常見
I -info 一般提示性的消息
W- warming 警告日志
E- error 錯誤:已經出現可影響運行的錯誤,比如crash時候輸出的日志
????????首先是基礎的鍵值篩選邏輯,Logcat 支持多種關鍵鍵名,每種鍵對應特定的篩選維度。
????????比如tag
鍵用于匹配日志條目的標簽字段,package
鍵針對日志所屬應用的包名,level
鍵可篩選出優先級大于或等于指定級別的日志(如level:INFO
會包含INFO
?WARNING
?ERROR
等更高優先級的日志,且級別不區分大小寫),age
鍵則根據時間戳篩選,格式為age:<數字><單位>
(s
秒、m
分鐘、h
小時、d
天),像age:30s
就是篩選過去 30 秒的日志,不過需注意時間對比以主機時間為準,設備時間錯誤可能影響結果。此外,還有is:crash
(匹配應用崩潰日志)、is:stacktrace
(匹配 Java 堆棧跟蹤)等特殊鍵,進一步拓展篩選場景。
2.查詢中使用的常用鍵:
tag
:與日志條目的?tag
?字段匹配。
package
:與日志記錄應用的軟件包名稱匹配。
process
:與日志記錄應用的進程名稱匹配。
message
:與日志條目的消息部分匹配。
level
:與指定或更高嚴重級別的日志匹配,例如?DEBUG
。
age
:如果條目時間戳是最近的,則匹配。值要指定為數字,后跟表示時間單位的字母:s
?表示秒,m
?表示分鐘,h
?表示小時,d
?表示天。例如,age: 5m
?只會過濾過去 5 分鐘內記錄的消息。
????????其次是高級篩選語法,讓篩選更精準靈活。否定篩選通過在鍵名前加-
實現,例如-tag:MyTag
可排除所有標簽為MyTag
的日志;正則表達式匹配則在鍵名后加~
,如tag~:My.*Tag
能匹配標簽以My
開頭、Tag
結尾的日志,且否定與正則可組合,如-tag~:My.*Tag
表示排除符合該正則的標簽日志。
????????邏輯運算符方面,&
代表 “與”、|
代表 “或”,且支持括號改變優先級,比如(tag:foo | level:ERROR) & package:mine
表示篩選標簽為foo
或級別為ERROR
,且包名為mine
的日志;若未顯式使用運算符,多個非否定條件默認按 “或” 處理(如tag:foo tag:bar
等價于tag:foo | tag:bar
),含否定條件則默認按 “與” 處理(如tag:foo -tag:bar
等價于tag:foo & -tag:bar
)。
????????最后是查詢的管理與優化,查詢歷史可通過點擊查詢字段旁的 “Show history” 查看,方便復用之前的篩選條件;點擊歷史記錄旁的星號可將查詢收藏,使其在所有項目中保留;使用name:
鍵為查詢命名(如name:MyFilter tag:foo
),能在歷史記錄中快速識別,提升篩選效率。這些功能結合起來,讓開發者能根據具體調試需求,快速定位所需日志信息。
整體總結:
????????ADB(Android Debug Bridge)是一種允許模擬器或已連接的 Android 設備進行通信的命令行工具,可提供安裝和調試應用、訪問 Unix shell 等設備操作便利,其簡單命令包括查看版本(adb version)、查看和連接設備(adb devices、adb connect)等,應用命令有查看所有 / 系統 / 第三方應用(adb shell pm list packages 及帶 - s、-3 參數)、查看前臺 Activity、正在運行的 Services、應用詳細信息和安裝路徑等;
????????借助 USB 通過 WiFi 連接 ADB 需將設備與電腦連同一 WiFi、用 USB 線連接后通過 adb tcpip 5555 讓設備在 5555 端口監聽 TCP/IP 連接,斷開 USB 后找到設備 IP,用 adb connect <device-ip-address>連接,結束后用 adb disconnect 斷開;抓取 ANR 日志可通過 adb pull /data/anr/traces.txt ~/Desktop/anr_traces.txt 拉取,日志包含基本信息(如 ANR 原因)、主線程堆棧和 CPU 使用率等關鍵內容;
????????Logcat 是 Android Studio 中調試應用的重要工具,可實時顯示設備或模擬器日志,包含日期、時間戳等豐富信息,日志優先級從低到高為 v(verbose)、D(debug)、I(info)、W(warming)、E(error),支持通過 tag、package 等鍵進行篩選,還有否定篩選、正則表達式匹配、邏輯運算符等高級篩選語法,以及查詢歷史管理、收藏等功能,助力開發者快速定位所需日志信息。