文章目錄
- 1. -d
- 2. -e
- 3. -s
- 4. -t
- 5. -H
- 6. -P
- 7. -L
- 8. --one-device
- 9. --exit-on-write-error
- 10. connect / disconnect
- 11. pair
- 12. forward
- 13. forward --list
- 14. reverse
- 15. mdns check
- 16. mdns services
- 17. push
- 18. pull
- 19. sync
- 20.shell
- 21. install
- 22. uninstall
- 23. bugreport
- 24. jdwp
- 25. logcat
- 26. disable-verity / enable-verity
- 27. keygen FILE
- 28. wait-for[-TRANSPORT]-STATE...
- 29. get-state
- 30. get-serialno
- 31. get-devpath
- 32. remount -R
- 33. reboot
- 34. sideload
- 35. root
- 36. unroot
- 37. usb
- 38. tcp/ip PORT
- 39. Restart-server/kill-server
- 40. reconnect
- adb環境變量詳解
- 1. ADB_TRACE
- 2. ANDROID_SERIAL
- 3. ANDROID_ADB_SERVER_PORT
- 4. ADB_VENDOR_KEYS
- 5. ANDROID_HOME
- 6. 包含 ADB 可執行文件的路徑
- 7. ADB_LOCAL_TRANSPORT_MAX_PORT
- 8. export ADB_MDNS_AUTO_CONNECT=1
1. -d
adb -d install app.apk
d
代表device
,具體含義為指定 ADB 命令應該作用于唯一連接的 USB 設備。
這個參數通常用于以下場景:
- 多設備環境:當你有多個 Android 設備(或模擬器)連接到計算機時,使用
-d
可以確保命令只作用于通過 USB 連接的物理設備。 - 排除模擬器:當你同時運行模擬器和連接了物理設備時,使用
-d
可以確保命令只針對物理設備執行。 - 提高效率:在只有一個 USB 設備連接的情況下,使用
-d
可以避免 ADB 搜索其他可能的連接(如網絡設備或模擬器)。
2. -e
adb -e install app.apk
e
代表emulator
, 用于連接唯一運行的模擬器實例。
這個參數通常用于以下場景:
- 多設備環境:當你同時有物理設備和模擬器運行時,使用
-e
可以確保命令只作用于模擬器。 - 多模擬器環境:如果你只運行了一個模擬器實例,使用
-e
可以快速指向該模擬器,而不需要指定模擬器的名稱或端口。 - 測試和開發:在進行應用開發和測試時,經常需要在模擬器上運行命令,
-e
參數可以簡化這個過程。
3. -s
adb -s install app.apk
-s
參數代表 “serial”, 用于連接指定序列號的設備。
這個參數通常用于以下場景:
- 多設備環境:當你同時連接了多個 Android 設備或模擬器時,使用
-s
可以精確指定要操作的設備。 - 自動化腳本:在編寫自動化測試或部署腳本時,使用
-s
可以確保命令作用于正確的設備。 - 特定設備操作:當你需要在多個設備中對特定設備執行操作時,
-s
參數非常有用。
4. -t
adb -t <transport_id> shell
-t
參數代表 “transport_id”, 作用于特定傳輸 ID 的設備。
這個參數通常用于以下場景:
- 高級調試:當設備有多個傳輸通道時(例如,同時通過 USB 和網絡連接),可以使用
-t
來指定特定的傳輸通道。 - 特殊開發環境:在某些復雜的開發或測試環境中,可能需要精確控制 ADB 使用的傳輸通道。
- 系統級開發:對 Android 系統本身進行開發或調試時,可能會用到這個參數。
當然這個transport_id
是一個內部序列號,不像設備序列號那樣容易獲取或識別。它主要用于一些比較特殊的狀況,大多數日常 Android 開發和調試工作不需要使用它。
5. -H
adb -H 192.168.1.12 devices
-H
參數代表 “host”, 用于指定運行的主機名或 IP 地址。
這個參數通常用于以下場景:
- 遠程調試:當 ADB 服務器運行在遠程機器上,而不是本地機器時。
- 網絡環境:在復雜的網絡設置中,可能需要明確指定 ADB 服務器的位置。
- 自定義開發環境:某些特殊的開發或測試環境可能需要連接到特定主機上的 ADB 服務器。
使用 -H
參數時需要注意:
- 默認情況下,ADB 客戶端連接到本地(localhost)的 ADB 服務器。
- 使用遠程 ADB 服務器時,需要確保網絡連接正常,且遠程主機允許 ADB 連接。
- 在某些情況下,可能還需要配合使用
-P
參數來指定端口號。
6. -P
adb -P 5037 devices
-P
參數代表 “port”, 指定要連接的 ADB 服務器的端口號。
這個參數通常用于以下場景:
- 自定義端口:當 ADB 服務器運行在非默認端口上時(adb默認端口是5037)。
- 多 ADB 服務器:在同一臺機器上運行多個 ADB 服務器實例,每個使用不同的端口。
- 網絡調試:通過網絡連接到遠程 ADB 服務器時,可能需要指定特定的端口。
- 防火墻配置:在某些網絡環境中,可能只有特定端口允許 ADB 通信。
adb -P 5037 devices
這條命令會連接到本地運行在 5037 端口(ADB 的默認端口)上的 ADB 服務器,并列出連接的設備。
adb -H 192.168.1.100 -P 5555 shell
這條命令會連接到 IP 地址為 192.168.1.100,端口號為 5555 的 ADB 服務器,并在連接的設備上啟動一個 shell 會話。
注意事項:
- ADB 的默認端口是 5037。如果不指定
-P
參數,ADB 會嘗試連接到這個默認端口。 -P
參數通常與-H
參數一起使用,特別是在連接到遠程 ADB 服務器時。- 使用非默認端口時,需要確保該端口未被其他服務占用,并且在必要的防火墻中開放。
7. -L
adb -L tcp:xxx
-L
參數代表 “listen”,用于指定一個地址和端口,讓 ADB 服務器監聽這個地址和端口上的連接。
這個參數主要用于以下場景:
- 遠程調試:允許其他機器通過網絡連接到這個ADB服務器;
- 自定義網絡配置:在特定的網絡環境中,可能需要ADB服務器監聽特定的地址或者端口;
- 安全性考慮:可以限制ADB服務器只監聽特定的網絡接口。
adb -L tcp:5037
這條命令會讓 ADB 服務器監聽所有網絡接口的 5037 端口(ADB 的默認端口)。
adb -L tcp:192.168.1.100:5555
這條命令會讓 ADB 服務器只在 IP 地址 192.168.1.100 的 5555 端口上監聽連接。
注意事項:
- 使用
-L
參數時,ADB 服務器會重新啟動并開始監聽指定的地址和端口。 - 這個參數主要用于 ADB 服務器的配置,而不是用于執行常規的 ADB 命令。
- 使用此參數可能會帶來安全風險,因為它可能允許網絡上的其他設備連接到你的 ADB 服務器。在使用時應確保網絡環境是安全的。
- 在某些情況下,你可能需要配合使用防火墻規則來控制對這個端口的訪問。
8. --one-device
adb --one-device install app.apk
只在單個設備上執行,即使有多個設備連接到計算機。經常看到錯誤日志more than one devices
的問題,那么就可以使用one-device
參數了。
使用場景是:
-
自動化腳本:確保腳本在單一設備環境中運行。
-
快速測試:當你知道只應該有一個設備連接時,可以使用此參數進行快速檢查。
9. --exit-on-write-error
adb --exit-on-write-error push large_file.dat /sdcard/
遇到寫入錯誤時,立即退出 ADB 命令. 比如以上命令是嘗試將 large_file.dat 推送到設備的 /sdcard/ 目錄。如果在傳輸過程中遇到任何寫入錯誤,命令將立即退出。
使用場景:
-
大文件傳輸:確保大文件完整無誤地傳輸到設備。
-
自動化腳本:在文件同步或安裝過程中快速捕獲并響應錯誤。
-
關鍵數據操作:當數據完整性至關重要時。
這個參數在需要嚴格控制數據完整性的情況下特別有用,比如在系統更新、重要數據備份或其他關鍵文件傳輸操作中。它提供了一種快速失敗的機制,有助于及時發現和處理傳輸錯誤。
10. connect / disconnect
adb connect 127.0.0.1:2333
adb disconnect 127.0.0.1:2333
通過 Wi-Fi 或以太網連接到 Android 設備,而不是使用 USB 連接. 如果不指定端口,默認端口是5555
11. pair
adb pair <ip_address>:<port> [pairing code]
用于與 Android 11(API 級別 30)及更高版本的設備進行無線調試配對。這是一個更安全的無線調試方法。
使用步驟:
a. 在 Android 設備上啟用無線調試(在開發者選項中)。
b. 在設備上獲取配對碼和 IP 地址:端口。
c. 在電腦上使用 adb pair
命令進行配對。
使用實例:
adb pair 192.168.1.100:37000
然后按提示輸入設備顯示的配對碼。或者直接在命令中包含配對碼:
adb pair 192.168.1.100:37000 123456
注意事項:
-
僅適用于 Android 11 及更高版本。
-
配對過程有時間限制,通常需要在設備顯示配對碼后的短時間內完成。
-
配對成功后,還需要使用
adb connect
來建立實際的調試連接。
12. forward
forward
是一個用于設置端口轉發的 ADB 命令。它允許你將主機(可以理解為電腦)上的端口轉發到連接的 Android 設備或模擬器上的端口。
主要用途:
- 創建從主機(電腦)到 Android 設備的端口轉發;
- 允許主機(電腦)上運行的應用與設備上的服務進行通信。
基本語法:
adb forward <local> <remote>
其中 是主機上的規范,是設備上的規范。
常見的規范類型為:
tcp:<port>
: TCP 端口localabstract:<unix domain socket name>
: Android 的抽象 Unix 域套接字localreserved:<unix domain socket name>
: 保留的 Unix 域套接字localfilesystem:<unix domain socket name>
: Unix 域套接字dev:<character device name>
: 字符設備
使用實例:
adb forward tcp:27042 tcp:27042
將主機上的 27042 端口轉發到設備上的 27042 端口, 這個命令就是frida
框架需要的命令
adb forward tcp:6100 localabstract:debug_socket
將主機上的 6100 端口轉發到設備上名為 “debug_socket” 的抽象 Unix 域套接字.
另外
adb forward --remove:用于刪除特定的轉發規則。
adb forward --remove-all:用于刪除所有轉發規則。
adb forward --no-rebind: 如果指定的本地規范已經被使用,則不重新綁定它。
13. forward --list
用于列出所有已設置的端口轉發規則的 ADB 命令。
$ adb forward --list
emulator-5554 tcp:5000 tcp:6000
1234567890ABCDEF tcp:8080 tcp:9090
輸出的每一行都包含三個部分:設備序列號、本地規范和遠程規范。
14. reverse
與forward 功能一致,但是轉發方向是相反的,用于設置從 Android 設備到主機(電腦)的端口轉發。
adb reverse <remote> <local>
其中 <remote>
是設備上的規范,<local>
是主機上的規范。
使用場景:
- Web 開發:允許設備上的應用訪問主機上運行的開發服務器。
- 調試:使設備能夠連接到主機上運行的調試工具。
- 測試:設備上的應用可以訪問主機上的模擬服務。
使用例子:
adb reverse tcp:8081 tcp:8081
意味著將設備上的 8081 端口轉發到主機上的 8081 端口。熟悉 React Native 開發的人應該經常用這個命令。
當然后面的 --remove
, --remove-all
和--no-rebind
功能與forward
功能一致。
15. mdns check
用于檢查設備 mDNS(多播 DNS)服務狀態的 ADB 命令,主要用于無線調試相關的功能。
主要用途:
- 檢查設備上的 mDNS 服務是否正在運行和廣播;
- 用于無線調試功能的診斷。
使用場景:
- 設置無線調試時的故障排除
- 驗證設備是否準備好進行無線配對和連接
- 診斷無線 ADB 連接問題
如果 mDNS 服務正常運行并廣播,可能會顯示類似 “OK” 或詳細的狀態信息;如果存在問題,會顯示錯誤信息或狀態說明
使用方式:
adb mdns check
16. mdns services
用于列出設備上當前廣播的 mDNS(多播 DNS)服務,主要用于無線調試和網絡服務發現相關的功能。
主要用途:
-
列出設備上當前正在廣播的 mDNS 服務。
-
用于診斷和驗證無線調試和其他網絡服務。
使用場景:
- 驗證無線調試服務是否正在廣播
- 檢查設備上其他使用 mDNS 的應用或服務
- 網絡服務發現和診斷
$ adb mdns services
registered service: _adb-tls-connect._tcp. 'ABCD1234' port=37401
registered service: _dartobservatory._tcp. 'Dart VM Observatory' port=54321
這個輸出顯示了兩個服務:一個是 ADB 無線調試服務,另一個是 Dart VM Observatory(常見于 Flutter 開發).
17. push
將文件或目錄從計算機復制到 Android 設備:
push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE
-
[--sync]
-
意義:同步模式
-
功能:只復制新的或已修改的文件,跳過已存在且未更改的文件
-
用途:提高效率,特別是在推送大量文件或頻繁更新時
-
-
[-z ALGORITHM]
-
意義:壓縮傳輸
-
功能:使用指定的算法壓縮數據進行傳輸
-
ALGORITHM 可以是:
brotli
lz4
zstd
-
用途:減少傳輸時間,特別是在網絡帶寬有限的情況下
-
-
[-Z]
-
意義:禁用壓縮
-
功能:即使默認啟用了壓縮,也強制不使用壓縮
-
用途:當傳輸已經壓縮的文件(如 zip、jpeg)時,避免不必要的壓縮處理
-
-
LOCAL...
-
意義:本地源文件或目錄
-
功能:指定要推送的本地文件或目錄
-
注意:
...
表示可以指定多個本地源
-
-
REMOTE
- 意義:遠程目標路徑
- 功能:指定 Android 設備上的目標位置
18. pull
pull [-a] [-z ALGORITHM] [-Z] REMOTE... LOCAL
從 Android 設備拉取(復制)文件或目錄到本地計算機。詳細解析這些參數:
-
[-a]
-
意義:保留文件時間戳
-
功能:保持原文件的時間戳不變,而不是使用當前時間
-
用途:在需要保持文件原始時間屬性的情況下很有用,如備份或同步操作
-
-
[-z ALGORITHM]
-
意義:壓縮傳輸
-
功能:使用指定的算法壓縮數據進行傳輸
-
ALGORITHM 可以是:
brotli
lz4
zstd
-
用途:減少傳輸時間,特別是在網絡帶寬有限的情況下
-
-
[-Z]
-
意義:禁用壓縮
-
功能:即使默認啟用了壓縮,也強制不使用壓縮
-
用途:當傳輸已經壓縮的文件(如 zip、jpeg)時,避免不必要的壓縮處理
-
-
REMOTE...
-
意義:Android 設備上的源文件或目錄
-
功能:指定要拉取的設備上的文件或目錄
-
注意:
...
表示可以指定多個遠程源
-
-
LOCAL
- 意義:本地目標路徑
- 功能:指定文件或目錄在本地計算機上的保存位置
19. sync
用于在本地開發機和 Android 設備之間同步文件系統。這個命令主要用于系統級開發,如定制 ROM 或系統應用開發。使用模式如下:
sync [-l] [-z ALGORITHM] [-Z] [all|data|odm|oem|product|system|system_ext|vendor]
參數如下:
-
[-l]
-
意義:列表模式(List only)
-
功能:只列出要同步的文件,但不實際執行同步操作
-
用途:預覽將要同步的內容,用于檢查和驗證
-
-
[-z ALGORITHM]
-
意義:壓縮傳輸
-
功能:使用指定的算法壓縮數據進行傳輸
-
ALGORITHM 可以是:
brotli
lz4
zstd
-
用途:減少傳輸時間,特別是在同步大量數據時
-
-
[-Z]
-
意義:禁用壓縮
-
功能:即使默認啟用了壓縮,也強制不使用壓縮
-
用途:當同步已壓縮的文件時,避免不必要的壓縮處理
-
-
同步選項:
all
: 同步所有分區data
: 同步 /data 分區odm
: 同步 /odm 分區(設備特定的修改)oem
: 同步 /oem 分區(原始設備制造商修改)product
: 同步 /product 分區(產品特定的配置)system
: 同步 /system 分區system_ext
: 同步 /system_ext 分區(系統擴展)vendor
: 同步 /vendor 分區(供應商特定的修改)
使用實例:
-
列出需要同步的系統文件:
adb sync -l system
-
使用壓縮同步所有分區:
adb sync -z zstd all
-
同步 vendor 分區但不使用壓縮:
adb sync -Z vendor
-
同步 data 分區:
adb sync data
注意事項:
- 權限要求:
- 同步系統分區通常需要設備有 root 權限或處于解鎖狀態。
- 對于生產設備,許多分區可能是只讀的,無法同步。
- 使用場景:
- 主要用于系統開發、ROM 定制和 OEM 開發。
- 不適用于常規應用開發或用戶級操作。
- 數據安全:
- 同步操作可能會覆蓋設備上的現有數據,使用時需謹慎。
20.shell
用于在連接的 Android 設備上啟動一個交互式 shell 會話或執行特定的 shell 命令。這是一個非常強大的工具,允許開發者直接與 Android 設備的底層系統交互。我們來看一下其詳細參數:
adb shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND...]
-
[-e ESCAPE]
-
意義:設置escape字符
-
功能:指定用于終止 adb shell 會話的轉義字符
-
默認值:
~
(波浪號) -
用途:當默認的轉義字符與您的輸入沖突時,可以自定義
-
-
[-n]
-
意義:不讀取或執行 rc 文件
-
功能:啟動 shell 時不讀取和執行 shell 的啟動文件(如 .bashrc)
-
用途:獲得一個"干凈"的 shell 環境,不受本地配置影響
-
-
[-T]
-
意義:強制使用原始終端模式
-
功能:禁用 PTY(偽終端)分配
-
用途:在某些腳本或自動化場景中有用,可以避免某些終端相關的問題
-
-
[-t]
-
意義:強制使用終端模式
-
功能:強制分配一個 PTY
-
用途:確保獲得一個完整的交互式 shell
-
-
[-x]
-
意義:禁用遠程 shell 協議
-
功能:使用簡單的 stdin/stdout 傳輸,而不是更高級的 shell 協議
-
用途:在某些兼容性問題或調試場景中有用
-
-
[COMMAND...]
- 意義:要在設備上執行的 shell 命令
- 功能:直接執行指定的命令,而不是啟動交互式 shell
- 用途:快速執行單個或一系列命令
使用實例:
-
使用自定義轉義字符:
adb shell -e ^
-
強制使用原始終端模式執行命令:
adb shell -T "ps | grep com.example.app"
-
禁用遠程 shell 協議執行命令:
adb shell -x "echo Hello > /sdcard/test.txt"
21. install
adb install
命令用于將 Android 應用程序(APK 文件)安裝到連接的 Android 設備上。詳細參數為:
adb install [-lrtsdg] [--instant] PACKAGE
-
-l
: 鎖定應用程序-
意義:將應用程序安裝到 /data/app-private
-
用途:使應用程序無法被備份或移動到外部存儲
-
-
-r
: 替換已存在的應用程序-
意義:如果應用程序已經存在,則重新安裝并保留其數據
-
用途:更新已安裝的應用程序
-
-
-t
: 允許安裝測試 APK-
意義:允許安裝標記為測試的應用程序
-
用途:用于安裝專門用于測試的 APK 版本
-
-
-s
: 將應用程序安裝到 sdcard-
意義:將應用程序安裝到外部存儲(如 SD 卡)而不是內部存儲
-
用途:當設備內部存儲空間不足時使用
-
-
-d
: 允許版本降級-
意義:允許安裝比當前安裝版本更低版本的應用程序
-
用途:測試舊版本或特定版本的應用程序
-
-
-g
: 授予應用程序清單中列出的所有權限-
意義:自動授予應用程序請求的所有權限,無需用戶確認
-
用途:簡化測試過程,避免手動授權步驟
-
-
--instant
: 將應用程序作為即時應用安裝-
意義:安裝即時應用版本
-
用途:用于測試和部署即時應用
-
-
PACKAGE
: 要安裝的 APK 文件路徑- 意義:指定要安裝的 APK 文件的位置
- 可以是設備上的路徑,也可以是本地計算機上的路徑
實例:
-
基本安裝:
adb install app.apk
-
替換已存在的應用:
adb install -r app.apk
-
安裝測試 APK 并自動授予權限:
adb install -t -g test_app.apk
-
允許降級安裝:
adb install -d older_version.apk
另外,在存在install-multiple
命令:
install-multiple [-lrtsdpg] [--instant] PACKAGE...
用于同時安裝多個 APK文件到 Android 設備上,其命令已經介紹,舉個例子:
adb install-multiple base.apk split_config.arm64_v8a.apk split_config.en.apk
但是需要注意的事項為:
- 這個命令主要用于處理拆分 APK 或應用包(App Bundles)生成的多個 APK 文件;
- 所有指定的 APK 必須屬于同一個應用(具有相同的包名);
- 使用
-p
選項時要確保安裝的 APK 組合是有效的,否則可能導致應用無法正常運行; - 安裝多個 APK 可能需要更長的時間,特別是在較舊或性能較低的設備上;
- 不是所有 Android 設備或 ADB 版本都支持所有這些選項,使用前可能需要驗證兼容性;
install-multiple
命令在處理現代 Android 應用分發格式(如 App Bundles)時特別有用,它允許開發者更靈活地管理復雜的應用結構和不同的設備配置。
當然,我們還可以同時安裝不同包名的app,命令為:
install-multi-package [-lrtsdpg] [--instant] PACKAGE...
舉例為:
adb install-multi-package app1.apk app2.apk app3.apk
22. uninstall
卸載指定的應用
adb uninstall -k packagename
-k : 保留緩存文件和數據文件夾
23. bugreport
一個非常有用的 Android 調試工具,用于生成設備的詳細診斷報告。這個命令會收集大量的系統信息和日志,對于開發者和技術支持人員來說非常有價值。
主要用法很簡單,直接
adb bugreport
用于收集設備的全面診斷信息,并生成一個包含系統狀態、日志和其他重要數據的報告。
主要生成包括:
- 系統日志(logcat)
- 系統屬性
- 進程列表
- 內存使用情況
- CPU 使用情況
- 網絡統計
- 電池統計
- 崩潰報告
- 安裝的應用列表
- 硬件信息
- 等等…
24. jdwp
是與 Java Debug Wire Protocol (JDWP) 相關的一個重要調試工具,用于列出和操作設備上可調試的 Java 進程。命令為:
adb jdwp
25. logcat
直接輸出andorid的logcat
adb logcat
即可查看android logcat日志
26. disable-verity / enable-verity
命令用于禁用 Android 設備上的 dm-verity(設備映射完整性驗證)。這是一個高級命令,主要用于開發和測試目的。
命令行為:
adb disable-verify
-
dm-verity 簡介:
-
一種 Linux 內核安全特性
-
用于驗證塊設備(如系統分區)的完整性
-
防止未經授權的系統修改
-
-
使用場景:
-
系統級開發和測試
-
修改系統文件或分區
-
安裝某些需要系統級修改的應用或模塊
-
-
執行效果:
-
禁用后,系統將不再驗證系統分區的完整性
-
允許對系統分區進行寫入操作
-
-
注意事項:
-
需要設備已解鎖 bootloader
-
通常需要 root 權限
-
會降低設備的安全性
-
可能導致 OTA 更新失敗
-
-
重要警告:
-
禁用 dm-verity 可能使設備更容易受到攻擊
-
不建議在個人使用的設備上禁用
-
-
相關命令:
-
adb enable-verity
: 重新啟用 dm-verity -
adb reboot
: 在禁用/啟用 verity 后需要重啟設備
-
-
使用步驟:
a. 確保設備已解鎖 bootloader 并啟用 USB 調試
b. 執行adb disable-verity
c. 重啟設備:adb reboot
27. keygen FILE
keygen FILE
命令用于生成 ADB(Android Debug Bridge)認證密鑰。這個命令在 ADB 安全性和設備認證方面扮演著重要角色,使用方式如下:
adb keygen FILE
-
功能:
-
生成一個新的 ADB 私鑰-公鑰對
-
將生成的密鑰保存到指定的文件中
-
-
參數:
- FILE: 指定生成的密鑰文件的路徑和名稱
-
生成的文件:
-
私鑰文件:指定的 FILE
-
公鑰文件:FILE.pub
-
-
用途:
-
用于 ADB 客戶端和 Android 設備之間的安全認證
-
替換默認的 ADB 密鑰對
-
-
安全性:
-
增強 ADB 連接的安全性
-
允許自定義和管理 ADB 認證密鑰
-
-
使用場景:
-
設置新的開發環境
-
增強 ADB 連接的安全性
-
在多個開發者之間共享一個通用的 ADB 密鑰
-
-
密鑰工作原理:
-
私鑰保存在開發機器上
-
公鑰需要添加到 Android 設備的授權密鑰列表中
-
-
后續步驟:
-
生成密鑰后,需要將公鑰添加到 Android 設備
-
通常通過將公鑰復制到設備的
/data/misc/adb/adb_keys
文件中
-
-
注意事項:
-
生成新密鑰后,可能需要重新授權 ADB 連接
-
保護生成的私鑰文件的安全,不要分享給他人
-
-
相關命令:
-
adb pubkey
: 顯示 ADB 公鑰 -
adb connect
: 使用新密鑰連接到設備
-
-
最佳實踐:
-
定期更新 ADB 密鑰以提高安全性
-
在共享開發環境中使用自定義密鑰
-
妥善保管生成的私鑰文件
-
-
密鑰管理:
-
可以為不同項目或環境生成不同的密鑰對
-
在多人開發團隊中,可以使用共享的密鑰對
-
-
故障排除:
-
如果新密鑰不工作,確保公鑰正確添加到設備
-
檢查 ADB 服務器是否正在使用新密鑰
-
-
安全建議:
- 不要在不受信任的網絡上使用 ADB
- 定期檢查已授權的 ADB 密鑰列表
使用實例:
adb keygen ~/.android/adbkey
這將在 ~/.android/
目錄下生成 adbkey
(私鑰)和 adbkey.pub
(公鑰)文件。
28. wait-for[-TRANSPORT]-STATE…
wait-for-[TRANSPORT]-STATE
命令是一個非常有用的工具,用于等待設備進入特定狀態。這個命令在自動化腳本和持續集成/持續部署(CI/CD)流程中特別有價值。讓我們詳細解析這個命令:
-
基本語法:
adb wait-for-[TRANSPORT]-STATE
-
TRANSPORT 選項:
-
device
: 等待任何設備 -
usb
: 只等待 USB 連接的設備 -
local
: 只等待通過 TCP/IP 連接的設備
-
-
STATE 選項:
-
device
: 設備已連接并可用 -
recovery
: 設備處于恢復模式 -
sideload
: 設備處于 sideload 模式 -
bootloader
: 設備處于 bootloader 模式 -
disconnect
: 設備斷開連接
-
-
功能:
-
阻塞執行,直到指定的設備狀態出現
-
當設備進入指定狀態時,命令返回
-
-
使用場景:
-
自動化測試腳本
-
設備刷機流程
-
CI/CD 管道中的設備操作
-
-
常見用法示例:
-
等待任何設備連接:
adb wait-for-device
-
等待 USB 設備進入 recovery 模式:
adb wait-for-usb-recovery
-
等待本地(TCP/IP)設備連接:
adb wait-for-local-device
-
-
超時行為:
-
命令默認沒有超時限制,會一直等待直到條件滿足
-
可以通過腳本或其他方式設置超時邏輯
-
-
腳本集成:
-
常用于 shell 腳本中,在執行其他 ADB 命令之前確保設備就緒
-
例如:
adb wait-for-device && adb shell some_command
-
-
調試用途:
-
幫助開發者跟蹤設備狀態變化
-
在復雜的設備操作流程中提供同步點
-
-
注意事項:
-
如果有多個設備連接,命令可能會對第一個匹配條件的設備響應
-
在使用
local
選項時,確保已正確設置 TCP/IP 連接
-
-
與其他命令結合:
-
常與
adb reboot
等命令配合使用 -
例如,重啟到 recovery 并等待:
adb reboot recovery && adb wait-for-recovery
-
-
在 CI/CD 中的應用:
-
確保設備在執行測試或部署前處于正確狀態
-
提高自動化流程的穩定性
-
-
故障排除:
-
如果命令似乎卡住,檢查設備連接和狀態
-
確保 ADB 服務器正在運行
-
-
最佳實踐:
-
在腳本中加入適當的超時機制
-
考慮添加錯誤處理邏輯,以應對設備未能進入預期狀態的情況
-
-
高級用法:
- 可以結合
adb devices
命令來處理多設備情況 - 在復雜的刷機或恢復流程中作為檢查點
- 可以結合
29. get-state
返回當前連接的 Android 設備的狀態
adb get-state
-
可能的輸出狀態:
-
device
: 設備已連接且可用 -
offline
: 設備已連接但不可用 -
unknown
: 設備狀態未知 -
bootloader
: 設備處于 bootloader 模式 -
recovery
: 設備處于恢復模式 -
sideload
: 設備處于 sideload 模式 -
unauthorized
: 設備已連接但未授權 ADB 連接
-
-
使用場景:
-
快速檢查設備狀態
-
在腳本中用于條件判斷
-
故障排除過程中確認設備連接狀態
-
-
特點:
- 簡潔:只返回一個單詞的狀態
- 快速:執行速度快,適合頻繁檢查
- 可靠:提供設備的當前狀態的準確信息
可以來個腳本:
if [ "$(adb get-state)" = "device" ]; thenecho "設備已就緒,開始操作"# 執行其他 ADB 命令
elseecho "設備未就緒,請檢查連接"
fi
30. get-serialno
用于獲取連接的 Android 設備的序列號
adb get-serialno
返回當前連接的 Android 設備的唯一序列號, 沒有設備連接返回"unknown".
31. get-devpath
獲取連接的 Android 設備的設備路徑。這個命令提供了設備在系統中的物理連接路徑信息.
adb get-devpath
對于 USB 連接的設備,可能返回類似 usb:337641472X ,對于模擬器或無線連接的設備,可能返回 unknown
.
32. remount -R
用于重新掛載設備的文件系統,通常是為了獲得對系統分區的寫入權限。
adb remount
adb remount -R
-
功能:
- 重新掛載系統分區為可讀寫模式
- 允許修改系統文件
-
-R
選項:- 在重新掛載后立即重啟設備
-
使用場景:
- 系統級開發和調試
- 修改系統文件或應用
- 進行需要root權限的操作
-
先決條件:
- 設備必須已root
- bootloader必須解鎖
- 在某些情況下,可能需要禁用 dm-verity
-
安全影響:
- 降低設備安全性,允許系統文件被修改
- 可能導致設備無法通過安全驗證
-
使用步驟:
a. 確保設備已root且USB調試已啟用
b. 執行adb remount
c. 如果使用-R
,設備將自動重啟 -
常見用途:
- 修改系統應用或框架
- 安裝或替換系統級應用
- 進行底層系統調試
-
注意事項:
- 不當使用可能導致設備變磚
- 可能影響OTA更新
- 在生產設備上使用極其危險
-
與其他命令結合:
-
通常與
adb push
和adb pull
一起使用來修改系統文件 -
例如:
basic
復制
adb remount adb push modified_file.so /system/lib/
-
-
恢復方法:
- 重啟設備通常會恢復只讀狀態
- 完全恢復可能需要重新刷入系統鏡像
-
在開發中的應用:
- 測試系統級修改
- 調試系統服務和框架
-
區別于普通root:
- 普通root允許獲取超級用戶權限
- remount允許直接修改系統分區
-
潛在風險:
- 可能導致系統不穩定
- 增加安全漏洞風險
- 可能違反設備保修條款
-
最佳實踐:
- 僅在開發設備上使用
- 在使用前備份重要數據
- 在完成必要操作后立即重啟設備
33. reboot
用于重啟 Android 設備,并可以指定重啟到特定模式。這是一個非常有用的命令,特別是在開發、測試和設備維護過程中。
adb rebot [mode]
- 可用的重啟模式:
- 默認(不帶參數):正常重啟到系統
- bootloader:重啟到 bootloader 模式
- recovery:重啟到 recovery 模式
- sideload:重啟到 sideload 模式
- sideload-auto-reboot:進入 sideload 模式后自動重啟
34. sideload
用于在 Android 設備上安裝系統更新包(OTA 包)的 ADB 命令。這是一種直接通過電腦向設備安裝系統更新的方法,特別適用于無法通過正常 OTA 更新或想要手動安裝特定版本系統的情況。
adb sideload <path_to_update.zip>
-
使用步驟:
a. 將設備重啟到 Recovery 模式
b. 在 Recovery 菜單中選擇 “Apply update from ADB”
c. 在計算機上執行adb sideload
命令 -
先決條件:
- 設備必須處于 Recovery 模式
- ADB 調試必須啟用
- 計算機上必須安裝 ADB 工具
-
OTA 包要求:
- 必須是針對特定設備型號的正確 OTA 包
- 通常是 .zip 格式的文件
-
使用場景:
- 手動更新系統版本
- 安裝官方 OTA 更新
- 在自動 OTA 更新失敗時使用
-
優點:
- 無需完整的系統鏡像
- 可以跳過等待 OTA 推送
- 適用于無法正常接收 OTA 更新的設備
-
注意事項:
- 確保使用正確的 OTA 包,否則可能導致設備問題
- 建議在操作前備份重要數據
- 過程中不要斷開設備連接
-
常見錯誤:
- 簽名驗證失敗:通常是由于使用了不兼容或被修改的 OTA 包
- 空間不足:確保設備有足夠的存儲空間
-
安全考慮:
- 只使用來自可信源的 OTA 包
- 避免使用未經驗證的第三方 OTA 包
-
與其他命令的結合:
adb reboot recovery # 手動在設備上選擇 "Apply update from ADB" adb sideload update.zip
-
在腳本中的應用:
adb reboot recovery sleep 30 # 等待設備進入 recovery 模式 adb sideload path/to/update.zip
-
故障排除:
- 如果 sideload 失敗,檢查 OTA 包的完整性
- 確保設備型號和 OTA 包匹配
- 檢查 ADB 連接是否穩定
-
與傳統刷機的區別:
- Sideload 通常只更新系統,不會清除用戶數據
- 比完整的系統刷寫更安全和快速
-
最佳實踐:
-
在執行 sideload 前為設備充足電
-
保持良好的 USB 連接,避免中斷
-
在執行更新后驗證系統的完整性
-
35. root
用于獲取 Android 設備 root 權限的 ADB 命令
36. unroot
root的反向操作,用于退出ADB的root模式。這個命令在完成需要 root 權限的操作后恢復正常的非 root 狀態時很有用。
37. usb
用于特定情況下重新啟動usb鏈接
adb usb
主要功能是:
- 重新啟動USB連接;
- 主要用于從無線(TCP/IP)模式切換回USB模式
使用場景:
- 當設備當前通過 Wi-Fi 連接到 ADB 時
- 需要從無線調試切換回 USB 調試時
38. tcp/ip PORT
adb tcp/ip PORT
用于設置無線 ADB 連接的重要命令,允許開發者通過 Wi-Fi 網絡連接到 Android 設備,而不是傳統的 USB 連接。
-
主要功能如下:
- 將 ADB 守護進程(adbd)重啟到指定的 TCP 端口
- 使設備準備好接受無線 ADB 連接
-
使用場景:
- 遠程調試 Android 設備
- 在不使用 USB 線的情況下連接設備
- 同時操作多個設備
-
執行步驟:
a. 通過 USB 連接設備
b. 運行adb tcpip 5555
c. 斷開 USB 連接
d. 使用adb connect IP_ADDRESS:5555
建立無線連接 -
優點:
- 提供更大的移動自由度
- 允許在不同位置的設備間快速切換
- 便于在多個設備上同時工作
-
注意事項:
- 設備必須與電腦在同一個 Wi-Fi 網絡
- 需要知道設備的 IP 地址
- 可能存在安全風險,應在受信任的網絡中使用
-
在腳本中應用:
adb tcpip 5555 adb connect 192.168.1.100:5555 # 執行無線調試操作 adb disconnect 192.168.1.100:5555
39. Restart-server/kill-server
用于管理adb服務器的重要命令,用于解決ADB連接問題和重置ADB狀態問題。
adb kill-server
停止當前運行的 ADB 服務器進程
adb restart-server
停止當前的 ADB 服務器,然后立即啟動一個新的服務器
在腳本中使用:
adb kill-server
sleep 2
adb start-server
# 或者直接使用
adb restart-server
40. reconnect
adb reconnect
嘗試重新連接當前已斷開或不穩定的 ADB 連接, 對所有連接的設備執行重新連接操作.
adb環境變量詳解
1. ADB_TRACE
用于控制 ADB 的調試輸出級別,設置方法為:
export ADB_TRACE=1
可能的值:
- 1: 基本信息
- 2: 詳細信息
- 3: 更詳細的信息
- 4: 最詳細的調試信息
用途:
- 調試 ADB 連接問題
- 了解 ADB 內部工作過程
- 排查復雜的設備通信問題
2. ANDROID_SERIAL
指定默認的 Android 設備,設置方法為:
export ANDROID_SERIAL=<device_serial_number>
在有多個設備連接時,無需每次指定設備
3. ANDROID_ADB_SERVER_PORT
export ANDROID_ADB_SERVER_PORT=<port_number>
指定 ADB 服務器使用的端口
4. ADB_VENDOR_KEYS
export ADB_VENDOR_KEYS=<path_to_keys>
指定 ADB 廠商密鑰的路徑
5. ANDROID_HOME
export ANDROID_HOME=<path_to_android_sdk>
指定 Android SDK 的安裝路徑
6. 包含 ADB 可執行文件的路徑
export PATH=$PATH:$ANDROID_HOME/platform-tools
包含 ADB 可執行文件的路徑
7. ADB_LOCAL_TRANSPORT_MAX_PORT
export ADB_LOCAL_TRANSPORT_MAX_PORT=<max_port_number>
設置本地傳輸的最大端口號
8. export ADB_MDNS_AUTO_CONNECT=1
export ADB_MDNS_AUTO_CONNECT=1
控制 ADB 是否自動連接到 mDNS 發現的設備