Android 調試橋 (adb) 是一種功能多樣的命令行工具,可讓您與安卓手機進行通信。常用于輔助測試開發或定位問題。
一、adb的工作原理 🌟
- 啟動服務器進程:檢查是否adb服務器進程正在運行,若沒有則啟動。
- 啟動或關閉adb服務:
adb start-server
、adb kill-server
- 啟動或關閉adb服務:
- 綁定端口:服務器進程與本地TCP端口
5037
綁定。(所有 adb 客戶端均使用端口 5037 與 adb 服務器通信) - 監聽adb客戶端發出的命令
- 掃描查找模擬器:服務器掃描5555~5585之間的奇數號端口查找模擬器(供前 16 個模擬器使用)。
- 建立連接:服務器一旦發現 adb 守護程序 (
adbd
),便會與相應的端口建立連接。
PS:每個模擬器都使用一對按順序排列的端口:一個用于控制臺連接的偶數號端口,另一個用于 adb 連接的奇數號端口。(adb連接=奇數號,控制臺連接=奇數號-1
)- 自動連接:在設備的系統設置中啟用 USB 調試,用數據線連接到電腦,手機彈窗確認授權。
- 手動連接:
adb connect 設備序列號
- 可使用 adb 命令訪問設備
adb基礎命令
start-server
: 確保ADB服務器正在運行。kill-server
:終止正在運行的ADB服務器。-a
: 指定adb server監聽同一局域網下所有網絡接口,而不僅僅是localhost。-d
: 指定使用USB連接的設備。(多個會報錯)-e
: 指定使用TCP/IP連接的設備(多個會報錯)。-s SERIAL
: 通過設備的序列號指定要操作的設備。-H
: 指定adb server的主機名(默認是localhost)。-P
: 指定adb server的端口(默認是5037)。-L SOCKET
: 指定adb server監聽的socket(默認是tcp:localhost:5037)。help
: 顯示幫助信息。version
: 顯示adb的版本號。
二、設備連接與識別
1、連接設備
-
物理連接(USB) 🌟:
電腦啟動adb服務 + 手機開啟USB調試 + 使用數據線插入電腦USB插口 + 電腦上安裝USB驅動程序 + 手機確認授權 -
網絡連接 🌟(同一個局域網Wi-Fi下的TCP/IP連接):
物理連接成功 +adb tcpip <port>
設備上的守護進程(adbd)監聽指定端口 + 斷開USB連接 +adb connect <device_ip_address>:<port>
連接設備 -
網絡連接 - 反向連接 (Reverse Connection):本質還是建立在物理連接或者網絡連接的基礎之上,設備連接成功后,解決無法直接訪問開發機特定端口的問題,通過端口轉發,在設備上調試運行在開發機上的服務。
請求過程:USB連接 >>adb reverse tcp:<device_port> tcp:<local_port>
建立反向連接 >> 開發機上啟動服務監聽端口請求 >> 手機應用上發起API請求localhost:<設備端口>
時,將對應端口的請求轉發到開發機對應端口上 >> 開發機上的后端服務處理請求 >> 響應沿著原路(ADB 服務端 -> USB -> 設備 adbd -> 應用)返回給 Android 應用。 -
通過 Android 調試橋接工具 (如 scrcpy, Vysor),本質還是建立在物理連接或者網絡連接的基礎之上。
-
通過 Android Studio 的虛擬設備管理 (AVD Manager):Android Studio 在啟動模擬器時,會自動配置并連接到 adb。
-
特殊模式連接:
- Recovery 模式: USB連接,adb devices 可能能看到設備(序列號可能不同),狀態通常是
recovery
或sideload
而不是 device。用于刷寫第三方 Recovery、卡刷包、救磚等。 - Bootloader / Fastboot 模式: USB連接,adb devices 看不到設備,需要使用
fastboot devices
命令來查看設備,用于刷寫分區、解鎖 Bootloader 等底層操作。
- Recovery 模式: USB連接,adb devices 可能能看到設備(序列號可能不同),狀態通常是
連接方式 | 典型場景 | 優點 | 缺點/要求 | adb devices 輸出示例 |
---|---|---|---|---|
USB | 常規開發調試、刷機、文件傳輸 | 穩定、高速、安全 | 需要線纜、驅動/權限配置 | ABCDEF123456 device |
Wi-Fi (adb tcpip) | 無線調試、設備固定不便插線 | 無線自由、方便多設備 | 需初始USB授權、依賴網絡質量、稍慢、有安全風險 | 192.168.1.100:5555 device |
Wi-Fi (設備端開) | Android 11+ 無線調試、無USB線初始 | 無需初始USB線 | 可能需要Root/特定系統、依賴網絡、安全風險最高 | 192.168.1.100:42424 device (端口可能不同) |
反向連接 | 設備調試開發機上的服務 | 穿透 NAT/防火墻 | 不是設備控制連接,是端口轉發隧道 | (依賴基礎連接狀態) |
工具橋接 | 使用 Scrcpy/Vysor 等工具進行屏幕控制 | 圖形界面、功能集成 | 底層仍是 USB/WiFi | (同底層連接方式) |
Android Studio AVD | 使用 Android 模擬器開發 | 開箱即用、無縫集成 | 僅限模擬器 | emulator-5554 device |
Recovery | 刷寫第三方 Recovery、卡刷包、救磚 | 系統級操作 | 非所有設備支持、功能有限 | RECOVERY1234 recovery (可能) |
Fastboot | 解鎖 Bootloader、刷寫分區、線刷 | 底層操作必備 | adb 不可用,需 fastboot | (不可見,用 fastboot devices ) |
通過TCP/IP連接設備:
connect HOST[:PORT]
: 通過TCP/IP連接到設備,默認端口5555。disconnect [HOST[:PORT]]
:斷開指定TCP/IP設備的連接,如果不指定則斷開所有。reconnect
:從主機端強制重新連接設備。這個命令會斷開當前連接并嘗試重新連接設備。reconnect device
:從設備端強制重新連接。這個命令會通知設備斷開與當前主機的連接,然后重新連接。reconnect offline
:將離線(offline)或未授權(unauthorized)的設備重置,強制其重新連接。pair HOST[:PORT]
: 與設備進行配對,用于安全的TCP/IP通信(Android 11及以上)。
2、查看已連接設備
查看已連接設備:adb devices
支持-l
查看設備信息,格式為:<設備序列號> <連接狀態> <設備信息>
,輸出如下:
List of devices attached
127.0.0.1:5555 device product:cancro_x86_64 model:Mate_10_Pro device:x86_64 transport_id:1
- 物理設備:設備的硬件序列號(Serial Number, SN)
- 模擬器: 格式為
emulator-<端口號>
(例如 emulator-5554)。 - 網絡設備: 通過
adb connect <ip:port>
連接的設備會顯示其 IP 地址和端口號(如192.168.1.100:5555
)。
已連接多個設備時,通過-s <serial>
指定設備:adb -s 127.0.0.1:5555 ...
3、設備狀態識別
-
device
(已授權并可用):
正常可訪問的狀態。 -
offline
(設備未響應/未完成授權):
adbd 進程崩潰/未啟動、USB 線/端口問題、設備處于不穩定狀態(如剛啟動)、ADB 版本與設備不兼容。 -
unauthorized
(用戶未在設備上授權 USB 調試):
設備已連接,但用戶尚未在設備彈出的 “Allow USB debugging?” 對話框中點擊 “Allow”。 -
no permissions
(Linux/Mac 下常見權限問題):
ADB 沒有足夠的權限訪問 USB 設備。 -
no devices/empty list
:
沒有檢測到任何連接的設備或模擬器。
4、設備連接異常排查
確認連接方式相關聯的連接要素,有針對性的排查。
5、端口轉發
端口轉發:
forward --list
: 列出所有正向端口轉發。forward [--no-rebind] LOCAL REMOTE
: 建立端口轉發。- 如果使用
--no-rebind
,當本地端口已經被轉發時,命令會失敗。 - 支持的轉發類型比如
tcp:<端口號>
:TCP端口
- 如果使用
forward --remove LOCAL
: 移除指定的轉發。forward --remove-all
: 移除所有轉發。
反向端口轉發(reverse):
reverse --list
: 列出所有反向端口轉發(從設備到主機)。reverse [--no-rebind] REMOTE LOCAL
: 建立反向端口轉發。reverse --remove REMOTE
: 移除指定的反向轉發。reverse --remove-all
: 移除所有反向轉發。
三、應用包管理
1、安裝與卸載
adb install
命令
在主機(PC)上執行的命令,用于將PC上的APK文件安裝到設備。
- 安裝1個APK包:
install [-lrtsdg] [--instant] PACKAGE
- 安裝1個/多個APK包(空格隔開):
install-multi-package [-lrtsdpg] [--instant] PACKAGE...
- 為單個包安裝多個APK:
install-multiple [-lrtsdpg] [--instant] PACKAGE...
(拆解APKs的場景) - 卸載:
uninstall [-k] PACKAGE
參數說明:
-r
(replace): 覆蓋安裝-t
(test): 允許安裝測試包(針對AndroidManifest
中的android:testOnly
)-d
(downgrade): 允許降級安裝 (僅可調試的包可用)-p
(partial): 部分安裝 (僅安裝APKs可用)-g
(grant): 自動授予所有運行時權限(Android 6.0+)--instant
:應用無需完整安裝即可運行,但功能受限(不能使用后臺服務、開機啟動等)--no-streaming
:禁用流式安裝。將整個 APK 文件推送到設備后再觸發安裝--fastdeploy
:啟用快速部署,比較設備上現有 APK 和新 APK 的差異,僅推送差異部分--no-fastdeploy
:禁用快速部署-k
(keep):卸載但保留數據和緩存目錄(僅卸載可用)
adb shell pm install
命令
在設備shell中執行的命令,用于安裝設備上已經存在的APK文件。
pm install [-lrtsfd] [-i PACKAGE] [--user USER_ID] [PATH]
- 卸載:
pm uninstall [-k] [--user USER_ID] PACKAGE
adb install 與pm install的區別
1. 執行位置不同
2. 文件路徑處理
場景 | adb install | pm install |
---|---|---|
APK位置 | PC本地路徑 ( /path/to/app.apk ) | 設備存儲路徑 ( /sdcard/app.apk ) |
安裝流程 | 自動推送文件到設備 | 需手動提前推送文件 |
示例 | adb install app.apk | adb push app.apk /sdcard adb shell pm install /sdcard/app.apk |
3. 權限要求對比
操作 | adb install | pm install |
---|---|---|
普通安裝 | ? 無需特殊權限 | ? 普通權限 |
降級安裝 | ? (-d ) 普通權限 | 🔴 需ROOT |
自動授權 | ? (-g ) 普通權限 | 🔴 需ROOT |
系統應用操作 | 🔴 無法操作 | ? 需ROOT |
4. 功能覆蓋范圍
功能 | adb install | pm install |
---|---|---|
流式安裝 | ? (--streaming ) | ? |
快速部署 | ? (--fastdeploy ) | ? |
即時應用 | ? (--instant ) | ? (--ephemeral ) |
多用戶管理 | ? | ? (--user ) |
安裝來源控制 | ? | ? (-i ) |
pm install在自動化方向的優勢:
- 文件傳輸和安裝完全解耦,傳輸/安裝故障隔離,可分段處理,比如弱網超時可重試
- 錯誤信息處理:pm install返回系統級錯誤信息(含Java堆棧)
- CPU占用和內存波動較穩定
2、應用查詢
列出應用包名:adb shell pm list packages [-s3fi]
-s
:系統應用-3
:第三方應用-f
:顯示 APK 路徑-i
:顯示安裝來源
3、應用數據管理
adb shell pm clear PACKAGE
:清楚應用數據。adb shell pm path PACKAGE
:獲取 APK 包路徑。adb shell dumpsys package PACKAGE
:導出包數據。adb backup -f data.ab PACKAGE
:數據備份。adb restore data.ab
:恢復應用數據。
4、應用狀態控制
命令 | 作用 | 示例 |
---|---|---|
enable | 啟用應用/組件 | adb shell pm enable com.example.app |
disable | 禁用應用 | adb shell pm disable com.example.app |
disable-user | 用戶級禁用 | adb shell pm disable-user com.example.app |
hide | 隱藏應用 | adb shell pm hide com.example.app |
unhide | 取消隱藏 | adb shell pm unhide com.example.app |
suspend | 凍結應用 | adb shell pm suspend com.example.app |
unsuspend | 解凍應用 | adb shell pm unsuspend com.example.app |
組件級控制:
# 禁用特定 Activity
adb shell pm disable com.example.app/.MainActivity
5、權限管理
命令 | 作用 | 示例 |
---|---|---|
grant | 授予權限 | adb shell pm grant com.example.app android.permission.CAMERA |
revoke | 撤銷權限 | adb shell pm revoke com.example.app android.permission.CAMERA |
reset-permissions | 重置權限 | adb shell pm reset-permissions |
set-permission-enforcer | 設置權限策略 | adb shell pm set-permission-enforcer 0 (0=允許,1=拒絕) |
權限查詢:
# 查看應用權限狀態
adb shell dumpsys package com.example.app | grep -A 20 "Permissions:"
四、文件操作
1、文件上傳
從本地電腦端將文件傳至遠程設備上:push [--sync] [-zZ] LOCAL... REMOTE
--sync
:增量同步,僅傳輸更新文件-z
:啟用壓縮,傳輸時壓縮數據-Z
:禁用壓縮,原始數據傳輸
2、文件下載
從遠程設備上獲取文件到本地電腦端:pull [-azZ] REMOTE... LOCAL
-a
:保留元數據,包括時間戳和權限
五、日志與調試信息獲取
1、bugreport - 系統診斷報告
adb bugreport [PATH]
2、logcat - 日志分析工具
adb logcat [options] [filterspecs]
📝 基本輸出控制
-s
設置默認靜默過濾(等效于*:S
),推薦寫法:"*:S"
、\*:S
-v <format>
設置日志輸出格式,可選值:
brief
,color
,long
,printable
,process
,raw
,tag
,thread
,threadtime
,time
,usec
-D
在日志緩沖區之間打印分隔線
💾 文件輸出與輪轉
-f <filename>
將日志輸出到文件(默認 stdout)-r <kbytes>
按指定 KB 大小輪轉日志文件(需配合-f
)-n <count>
設置保留的輪轉日志文件數量(默認 4,需配合-f
)
🔍 日志讀取模式
-d
轉儲日志后立即退出(非阻塞模式)-c
清空整個日志緩沖區并退出-L
輸出上次重啟前的日志
? 篩選特定日志范圍
-t <count>
僅顯示最近<count>
行日志(隱含-d
)-t '<time>'
顯示指定時間后的日志(格式MM-DD hh:mm:ss.mmm
,隱含-d
)-T <count>
持續顯示最近<count>
行日志(不隱含-d
)-T '<time>'
持續顯示指定時間后的日志(不隱含-d
)
🎯 過濾規則(filterspecs)
優先級等級
V
:Verbose(最詳細,單個標簽默認優先級)D
:Debug(通配符*
默認優先級)I
:InfoW
:WarnE
:ErrorF
:FatalS
:Silent(完全屏蔽)
規則語法
<tag>[:priority]
示例:ActivityManager:I
→ 顯示該標簽 Info 及以上日志*:W
→ 顯示所有標簽 Warning 及以上日志
- 多規則組合:
adb logcat Tag1:I Tag2:D *:S
(顯示 Tag1 的 Info+ 和 Tag2 的 Debug+,屏蔽其他所有標簽) - 靜默過濾:
*:S
強制屏蔽所有日志(常配合其他規則使用)
六、其他
📋 ADB 環境變量
1. ADB_TRACE
作用:控制 ADB 調試信息的輸出級別
格式:逗號分隔的列表(可多選)
可選值:
all
:所有調試信息adb
:ADB 基礎命令sockets
:套接字通信packets
:數據包傳輸細節rwx
:文件讀寫操作usb
:USB 連接詳情sync
:文件同步過程sysdeps
:系統依賴操作transport
:傳輸層活動jdwp
:Java 調試協議
示例:
# 啟用 USB 和傳輸層調試
export ADB_TRACE=usb,transport
adb devices # 將顯示詳細調試日志
2. ADB_VENDOR_KEYS
作用:指定自定義 ADB 密鑰文件/目錄(用于設備認證)
格式:冒號分隔的路徑列表
典型場景:
- 使用非默認
adbkey
(如企業內部分發密鑰) - 多密鑰管理(同時支持個人和公司設備)
示例:
# 添加兩個密鑰位置
export ADB_VENDOR_KEYS=~/.android/company_key:/custom_keys
adb connect 192.168.1.10 # 使用指定密鑰認證
3. ANDROID_SERIAL
作用:設置默認連接的設備序列號(等效于 adb -s <序列號>
)
使用場景:
- 多設備連接時自動選擇目標設備
- CI/CD 流水線中指定特定測試設備
示例:
# 設置默認設備序列號
export ANDROID_SERIAL=emulator-5554
adb shell # 自動連接到 emulator-5554
4. ANDROID_LOG_TAGS
作用:預設 logcat 過濾規則(等效于 logcat <filterspecs>
)
格式:與 logcat 過濾規則相同(<tag>:<priority>
)
注意:優先級字母需大寫(V/D/I/W/E/F/S
)
示例:
# 只顯示 Error 及以上日志
export ANDROID_LOG_TAGS="*:E"
adb logcat # 自動應用過濾# 多規則組合
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
5. ADB_LOCAL_TRANSPORT_MAX_PORT
作用:設置本地傳輸掃描的最大端口號(用于檢測模擬器)
默認值:5585
計算規則:
- 端口范圍 =
5555
到5555 + 16*(N-1)
- 其中
N = ADB_LOCAL_TRANSPORT_MAX_PORT
最大支持模擬器數:16
(默認)
示例:
# 支持掃描 32 個模擬器
export ADB_LOCAL_TRANSPORT_MAX_PORT=32
adb devices # 可檢測更多模擬器
🛠? 使用技巧
-
臨時設置(當前終端有效):
export ANDROID_SERIAL=emulator-5556 adb shell
-
永久配置(添加到 shell 配置文件):
# 添加到 ~/.bashrc 或 ~/.zshrc echo 'export ANDROID_LOG_TAGS="*:W"' >> ~/.zshrc source ~/.zshrc
-
組合使用:
# 調試 USB 連接并指定設備 export ADB_TRACE=usb export ANDROID_SERIAL=84B7N163020000123 adb shell
?? 注意事項
- 優先級:命令行參數 > 環境變量 > 默認值
(如adb -s emulator-5554
會覆蓋$ANDROID_SERIAL
) - 端口限制:修改
ADB_LOCAL_TRANSPORT_MAX_PORT
需重啟 ADB 服務生效adb kill-server && adb start-server
- 密鑰安全:
ADB_VENDOR_KEYS
中的私鑰需設置600
權限chmod 600 ~/.android/custom_key
七、進階
adb shell
命令 = 標準 Linux Shell 命令 + Android 專用工具和命令