簡要整理adb的使用方法:
Android 調試橋 (adb) 是一種功能多樣的命令行工具,可讓您與設備進行通信。adb 命令便於執行各種設備操作(例如安裝和調試應用),並提供對 Unix shell(可用來在設備上運行各種命令)的訪問權限。它是一種客戶端-服務器程序,包括以下三個組件:
- 客戶端:用於發送命令。客戶端在開發計算機上運行。您可以通過發出 adb 命令從命令行終端調用客戶端。
- 守護進程 (adbd):在設備上運行命令。守護進程在每個設備上作爲後臺進程運行。
- 服務器:管理客戶端和守護進程之間的通信。服務器在開發計算機上作爲後臺進程運行。
adb
包含在 Android SDK 平臺工具軟件包中。您可以使用 SDK 管理器下載此軟件包,管理器會將此軟件包安裝在 android_sdk/platform-tools/
。或者,如果您需要獨立的 Android SDK 平臺工具軟件包,可以點擊此處進行下載。
要了解如何連接設備以進行 adb 通信,包括如何使用 Connection Assistant 對常見問題進行排查,請參閱在硬件設備上運行應用。
adb 的工作原理
當您啓動某個 adb 客戶端時,客戶端會先檢查是否有 adb 服務器進程正在運行。如果沒有,它將啓動服務器進程。服務器在啓動後會與本地 TCP 端口 5037 綁定,並監聽 adb 客戶端發出的命令 - 所有 adb 客戶端均通過端口 5037 與 adb 服務器通信。
然後,服務器會與所有正在運行的設備建立連接。它通過掃描 5555 到 5585 之間(該範圍供前 16 個模擬器使用)的奇數號端口查找模擬器。服務器一旦發現 adb 守護進程 (adbd),便會與相應的端口建立連接。請注意,每個模擬器都使用一對按順序排列的端口 - 用於控制檯連接的偶數號端口和用於 adb 連接的奇數號端口。例如:
模擬器 1,控制檯:5554
模擬器 1,adb:5555
模擬器 2,控制檯:5556
模擬器 2,adb:5557
依此類推…
如上所示,在端口 5555 處與 adb 連接的模擬器與控制檯監聽端口爲 5554 的模擬器是同一個。
服務器與所有設備均建立連接後,您便可以使用 adb 命令訪問這些設備。由於服務器管理與設備的連接,並處理來自多個 adb 客戶端的命令,因此您可以從任意客戶端(或從某個腳本)控制任意設備。
在設備上啓用 adb 調試
要在通過 USB 連接的設備上使用 adb,您必須在設備的系統設置中啓用 USB 調試(位於開發者選項下)。
在搭載 Android 4.2 及更高版本的設備上,“開發者選項”屏幕默認情況下處於隱藏狀態。如需將其顯示出來,請依次轉到設置 > 關於手機,然後點按版本號七次。返回上一屏幕,在底部可以找到開發者選項。
在某些設備上,“開發者選項”屏幕所在的位置或命名方式可能有所不同。
現在,您已經可以通過 USB 連接設備。您可以從 adb devices
目錄執行 android_sdk/platform-tools/
,驗證設備是否已連接。如果已連接,您將看到設備名稱以“設備”形式列出。
注意:當您連接搭載 Android 4.2.2 或更高版本的設備時,系統會顯示一個對話框,詢問您是否接受允許通過此計算機進行調試的 RSA 密鑰。這種安全機制可以保護用戶設備,因爲它可以確保只有在您能夠解鎖設備並確認對話框的情況下才能執行 USB 調試和其他 adb 命令。
要詳細瞭解如何通過 USB 連接到設備,請參閱在硬件設備上運行應用。
通過 WLAN 連接到設備
一般情況下,adb 通過 USB 與設備進行通信,但您也可以在通過 USB 完成一些初始設置後通過 WLAN 使用 adb,如下所述。如果您開發的是 Wear OS 應用,則應改爲參閱調試 Wear OS 應用指南,其中提供了有關如何通過 WLAN 和藍牙使用 adb 的特別說明。
- 將 Android 設備和 adb 主機連接到這兩者都可以訪問的同一 WLAN 網絡。請注意,並非所有接入點都適用;您可能需要使用防火牆已正確配置爲支持 adb 的接入點。
- 如果您要連接到 Wear OS 設備,請關閉與該設備配對的手機上的藍牙。
- 使用 USB 數據線將設備連接到主機。
- 設置目標設備以監聽端口 5555 上的 TCP/IP 連接。
adb tcpip 5555
- 拔掉連接目標設備的 USB 數據線。
- 找到 Android 設備的 IP 地址。例如,對於 Nexus 設備,您可以在設置 > 關於平板電腦(或關於手機)> 狀態 > IP 地址下找到 IP 地址。或者,在 Wear OS 設備上,您可以在設置 > WLAN 設置 > 高級 > IP 地址下找到 IP 地址。
- 通過 IP 地址連接到設備。
adb connect device_ip_address
- 確認主機已連接到目標設備:
$ adb devices List of devices attached device_ip_address:5555 device
現在,您可以開始操作了!
如果 adb 連接斷開:
- 確保主機仍與 Android 設備連接到同一個 WLAN 網絡。
- 通過再次執行
adb connect
步驟重新連接。 - 如果上述操作未解決問題,重置 adb 主機:
adb kill-server
然後,從頭開始操作。
查詢設備
在發出 adb 命令之前,瞭解哪些設備實例已連接到 adb 服務器會很有幫助。您可以使用 devices
命令生成已連接設備的列表。
adb devices -l
作爲迴應,adb 會針對每個設備輸出此狀態信息:
- 序列號:由 adb 創建的字符串,用於通過端口號唯一標識設備。下面是一個序列號示例:
emulator-5554
- 狀態:設備的連接狀態可爲下列狀態之一:
offline
:設備未連接到 adb 或沒有響應。device
:設備已連接到 adb 服務器。請注意,此狀態並不表示 Android 系統已完全啓動並可正常運行,因爲在設備連接到 adb 時系統仍在啓動。不過,在啓動後,這將是設備的正常運行狀態。no device
:未連接到設備。
- 說明:如果包含
-l
選項,devices
命令會告知您設備是什麼。如果您連接了多個設備,此信息可幫助您區分這些設備。
以下示例展示了 devices
命令及其輸出。有三臺設備正在運行。列表中的前兩行表示模擬器,第三行表示連接到計算機的硬件設備。
$ adb devices
List of devices attached
emulator-5556 device product:sdk_google_phone_x86_64 model:Android_SDK_built_for_x86_64 device:generic_x86_64
emulator-5554 device product:sdk_google_phone_x86 model:Android_SDK_built_for_x86 device:generic_x86
0a388e93 device usb:1-1 product:razor model:Nexus_7 device:flo
模擬器未列出
adb devices
命令的極端命令序列會導致正在運行的模擬器不顯示在 adb devices
輸出中(即使在您的桌面上可以看到該模擬器)。當存在以下所有情況時,便會出現這種問題:
- adb 服務器沒有運行,以及
- 您在使用
emulator
命令時,將-port
或-ports
選項的端口值設爲 5554 到 5584 之間的奇數,以及 - 您選擇的奇數號端口處於空閒狀態,因此可以與指定端口號的端口建立連接,或者該端口處於忙碌狀態,模擬器切換到了符合第 2 條中要求的另一個端口,以及
- 啓動模擬器後才啓動 adb 服務器。
避免出現這種情況的一種方法是讓模擬器自行選擇端口,並且每次運行的模擬器數量不要超過 16 個。另一種方法是始終先啓動 adb 服務器,然後再使用 emulator
命令,如下例所示。
示例 1:在下面的命令序列中,adb devices
命令啓動了 adb 服務器,但是設備列表未顯示。
停止 adb 服務器,然後按照所示順序輸入以下命令。請提供系統中有效的 avd 名稱。要獲取 avd 名稱列表,請輸入 emulator -list-avds
。emulator
命令位於 android_sdk/tools
目錄下。
$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5555
$ adb devices
List of devices attached
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
示例 2:在下面的命令序列中,adb devices
顯示了設備列表,因爲先啓動了 adb 服務器。
要在 adb devices
輸出中查看模擬器,請停止 adb 服務器,然後在使用 emulator
命令後以及使用 adb devices
命令前重新啓動服務器,如下所示:
$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5557
$ adb start-server
$ adb devices
List of devices attached
emulator-5557 device
要詳細瞭解模擬器命令行選項,請參閱使用命令行參數。
將命令發送至特定設備
如果有多部設備在運行,則在發出 adb 命令時必須指定目標設備。爲此,請使用 devices
命令獲取目標設備的序列號。獲得序列號後,請結合使用 -s
選項與 adb 命令來指定序列號。如果您要發出很多 adb 命令,可以將 $ANDROID_SERIAL
環境變量設置爲包含序列號。如果您同時使用 -s
和 $ANDROID_SERIAL
,則 -s
會替換 $ANDROID_SERIAL
。
在以下示例中,adb 先獲得已連接設備的列表,然後使用其中一臺設備的序列號在該設備上安裝 helloWorld.apk
。
$ adb devices
List of devices attached
emulator-5554 device
emulator-5555 device
$ adb -s emulator-5555 install helloWorld.apk
注意:如果您在多臺設備可用時發出命令但未指定目標設備,則 adb 會生成錯誤。
如果有多個可用設備,但只有一個是模擬器,請使用 -e
選項將命令發送至該模擬器。同樣,如果有多個設備,但只連接了一個硬件設備,請使用 -d
選項將命令發送至該硬件設備。
安裝應用
您可以使用 adb 的 install
命令在模擬器或連接的設備上安裝 APK:
adb install path_to_apk
安裝測試 APK 時,必須結合使用 -t
選項和 install
命令。要了解詳情,請參閱 -t
。
要詳細瞭解如何創建可安裝在模擬器/設備實例上的 APK 文件,請參閱構建和運行應用。
請注意,如果您使用的是 Android Studio,則無需直接使用 adb 在模擬器/設備上安裝您的應用。Android Studio 會爲您執行應用的打包和安裝操作。
設置端口轉發
您可以使用 forward
命令設置任意端口轉發,將對特定主機端口上的請求轉發到設備上的其他端口。以下示例介紹瞭如何設置主機端口 6100 到設備端口 7100 的轉發:
adb forward tcp:6100 tcp:7100
以下示例介紹瞭如何設置主機端口 6100 到 local:logd 的轉發:
adb forward tcp:6100 local:logd
將文件複製到設備/從設備複製文件
您可以使用 pull
和 push
命令將文件複製到某個設備或從中複製文件。與 install
命令(僅將 APK 文件複製到特定位置)不同,pull
和 push
命令使您能夠將任意目錄和文件複製到設備中的任何位置。
要從設備中複製某個文件或目錄(及其子目錄),請使用以下命令:
adb pull remote local
要將某個文件或目錄(及其子目錄)複製到某個設備,請使用以下命令:
adb push local remote
將 local
和 remote
替換爲開發計算機(本地)和設備(遠程)上的目標文件/目錄的路徑。例如:
adb push foo.txt /sdcard/foo.txt
停止 adb 服務器
在某些情況下,您可能需要終止 adb 服務器進程,然後重新啓動以解決問題(例如,如果 adb 不響應命令)。
要停止 adb 服務器,請使用 adb kill-server
命令。然後,您可以通過發出任意其他 adb 命令重啓服務器。
adb 命令參考
您可以從開發計算機上的命令行發出 adb 命令,也可以通過腳本發出。用法如下:
adb [-d | -e | -s serial_number] command
如果只有一個模擬器在運行或者只連接了一個設備,則默認將 adb 命令發送至該設備。如果有多個模擬器在運行並且/或者連接了多個設備,則您需要使用 -d
、-e
或 -s
選項指定應向其發送命令的目標設備。
下表列出了所有支持的 adb 命令並解釋了它們的含義和用法。
表 1. 可用的 adb 命令和選項
全局選項 | 說明 |
---|---|
-a |
在所有網絡接口上監聽,而非只在 localhost 上監聽。 |
-d |
將 adb 命令發送至唯一連接的 USB 設備。如果連接了多個 USB 設備,則返回錯誤。 |
-e |
將 adb 命令發送至唯一運行的模擬器。如果有多個模擬器在運行,則返回錯誤。 |
-s serial_number |
將 adb 命令發送至以其 adb 分配的序列號命名的特定設備(如“emulator-5556”)。替換存儲在 $ANDROID_SERIAL 環境變量中的序列號值。請參閱將命令發送至特定設備。 |
-H server |
adb 服務器主機的名稱。默認值爲 localhost 。 |
-P port |
adb 服務器端口號。默認值爲 5037 。 |
-L socket |
在提供的 adb 服務器套接字上監聽。默認值爲 tcp:localhost:5037 。 |
常規命令 | 說明 |
devices [-l] |
輸出所有設備的列表。-l 選項用於包含設備描述。要了解詳情,請參閱查詢設備。 |
help |
輸出支持的 adb 命令及其描述的列表。 |
version |
輸出 adb 版本號。 |
run-as package_name |
在設備上將命令作爲應用運行(通過 package_name 指定)。因此,您在 adb 中運行命令就如同您指定的應用在運行相應命令一樣(即您擁有該應用所具有的設備訪問權限),無需請求 root 權限。在未取得 root 權限的設備或帶有 Play 商店映像的模擬器上使用 adb 時,這可能很有必要。應用必須可調試。 |
網絡命令 | 說明 |
connect host[:port] |
通過 TCP/IP 連接到設備。如果您未指定端口,則使用默認端口 5555 。 |
disconnect [host | host:port] |
斷開與在指定端口上運行的指定 TCP/IP 設備的連接。如果未指定主機或端口,則所有設備都將與所有 TCP/IP 端口斷開連接。如果指定了主機,但未指定端口,則使用默認端口 5555 。 |
forward --list |
列出所有轉發的套接字連接。 |
forward [--no-rebind] local remote |
將套接字連接從指定的本地端口轉發到設備上指定的遠程端口。您可以通過以下方式指定本地和遠程端口:
|
forward --remove local |
移除指定的轉發套接字連接。 |
reverse --list |
列出設備的所有反向套接字連接。 |
reverse [--no-rebind] remote local |
反向連接套接字。--no-rebind 選項表示如果指定的套接字已通過之前的 reverse 命令完成綁定,則反向連接失敗。您可以通過以下方式指定本地和遠程參數的端口:
|
reverse --remove remote |
從設備中移除指定的反向套接字連接。 |
reverse --remove-all |
從設備中移除所有反向套接字連接。 |
文件傳輸命令 | 說明 |
push local remote |
將文件和目錄從本地設備(計算機)複製到設備上的遠程位置。 |
pull [-a] remote local |
將遠程文件和目錄複製到設備中。-a 選項用於保留文件的時間戳和模式。 |
sync [system|vendor|oem|data|all] |
將本地編譯版本從 $ANDROID_PRODUCT_OUT 中的指定位置同步到設備。所有變更文件均從指定的分區複製。默認設置是同步所有分區。此命令僅在您編譯 Android 平臺源代碼時使用。應用開發者不需要使用此命令。
|
應用安裝命令 | 說明 |
install [options] package |
將軟件包推送到設備並進行安裝。可能的選項如下: |
install-multiple [options] packages |
具有和
|
uninstall [-k] package |
從設備中移除此應用軟件包。添加 -k 選項可保存數據和緩存目錄。 |
備份和恢復命令 | 說明 |
backup [-f file ] [-apk | -noapk ] [-obb | -noobb ] [-shared | -noshared ] [-all ] [-system | [-nosystem ] package_names |
將設備數據的歸檔寫入 file。如果您未指定文件名,則默認文件爲 backup.adb 。當您指定 -all 和 -shared 選項時,package 列表爲可選項。下面介紹了其他選項的用法:
|
restore file |
從 file 中恢復設備內容。 |
調試命令 | 說明 |
bugreport path |
將 bugreport 輸出到指定路徑。如果 path 是目錄,則錯誤報告使用默認文件名 bugreport.zip 保存到該目錄下。如果設備不支持壓縮格式的錯誤報告,則輸出到 stdout 。 |
jdwp |
輸出給定設備上可用的 JDWP 進程的列表。您可以使用 forward jdwp:pid 連接到特定的 JDWP 進程。例如:adb forward tcp:8000 jdwp:472 jdb -attach localhost:8000 |
logcat [-help] [option] [filter-spec] |
將日誌數據輸出到屏幕。要了解 logcat 命令和 $ANDROID_LOG_TAGS 環境變量,請參閱 Logcat 頁面上的過濾日誌輸出。
另請參閱 Logcat 命令行工具。 |
安全命令 | 說明 |
disable-verity |
在 userdebug 編譯版本上停用 dm-verity 檢查。dm-verity 選項可確保設備在用戶啓動後的狀態與上次使用時的狀態一樣。要了解詳情,請參閱驗證啓動。 |
enable-verity |
在 userdebug 編譯版本上重新啓用 dm-verity 檢查。dm-verity 選項可確保設備在用戶啓動後的狀態與上次使用時的狀態一樣。要了解詳情,請參閱驗證啓動。 |
keygen file |
生成 adb 公開和私有 RSA 加密密鑰。私鑰存儲在 file 中。公鑰存儲在 file.pub 中。首次使用 adb 通過 USB 進行連接時,需要 RSA 密鑰對。您必須接受主機的 RSA 密鑰,才能明確授予 adb 對設備的訪問權限。
您可以使用 當 adb 服務器需要密鑰時,它會先搜索 adb 服務器密鑰存儲庫目錄。如果找不到任何密鑰,它會接着檢查 默認情況下,adb 服務器生成的密鑰對以
|
腳本命令 | 說明 |
wait-for [-transport] -state |
等待設備處於指定狀態。
|
get-state |
輸出設備的 adb 狀態。adb 狀態可以是 print offline 、bootloader 或 device 。要了解詳情,請參閱查詢設備。 |
get-serialno |
輸出 adb 設備序列號字符串。要了解詳情,請參閱查詢設備。 |
get-devpath |
輸出 adb 設備路徑。 |
remount |
在讀寫模式下重新裝載 /system 、/vendor 和 /oem 分區。 |
reboot [bootloader | recovery | sideload | sideload-auto-reboot ] |
重新啓動設備。此命令默認啓動系統映像,但也支持 bootloader 和 recovery 。
|
sideload otapackage |
將指定的完整 OTA 軟件包旁加載(以 APK 格式安裝)到設備上。 |
root |
使用 root 權限重新啓動 adbd。 |
unroot |
在不使用 root 權限的情況下重新啓動 adbd。 |
usb |
重新啓動監聽 USB 的 adb 服務器。 |
tcpip port-number |
重新啓動監聽指定端口上的 TCP 的 adb 服務器。 |
內部調試命令 | 說明 |
start-server |
檢查 adb 服務器進程是否正在運行。 |
kill-server |
終止 adb 服務器進程。 |
reconnect |
從主機強制重新連接。 |
reconnect device |
從設備強制重新連接。 |
Shell 命令 | 說明 |
shell |
在目標設備中啓動遠程交互式 shell。要了解詳情,請參閱發出 shell 命令。 |
shell -e escape_char [-n] [-T] [-t] [-x] [command] |
在目標設備中發出 shell 命令,然後退出遠程 shell。您可以使用以下選項的任意組合:
要了解詳情,請參閱發出 shell 命令。 |
emu command |
運行模擬器控制檯命令。要了解詳情,請參閱通過命令行控制模擬器 |
發出 shell 命令
您可以在進入或不進入設備上的 adb 遠程 shell 的情況下,使用 shell
命令通過 adb 發出設備命令。要在不進入遠程 shell 的情況下發出單個命令,請使用如下 shell
命令:
adb [-d |-e | -s serial_number] shell shell_command
或者,使用如下命令進入設備上的遠程 shell:
adb [-d | -e | -s serial_number] shell
當您準備退出遠程 shell 時,請按 Ctrl + D 或輸入 exit
。
shell 命令二進制文件存儲在設備的文件系統中,其路徑爲 /system/bin/
。
注意:在 Android 平臺工具 23 及更高版本中,adb 與 ssh(1)
命令處理參數的方式相同。這項變更解決了很多命令注入方面的問題,還使安全執行包含 shell 元字符的命令(如 adb install Let\'sGo.apk
)成爲可能。不過,這項變更還意味着,對包含 shell 元字符的所有命令的解釋也發生了變化。例如,adb shell setprop foo 'a b'
命令現在會返回錯誤,因爲單引號 ('
) 會被本地 shell 消去,設備看到的是 adb shell setprop foo a b
。要使該命令正常運行,請引用兩次,一次用於本地 shell,另一次用於遠程 shell,與處理 ssh(1)
的方法相同。例如,adb shell setprop foo "'a b'"
。
調用 Activity 管理器 (am
)
在 adb shell 中,您可以使用 Activity 管理器 (am
) 工具發出命令以執行各種系統操作,如啓動某項 Activity、強行停止某個進程、廣播 intent、修改設備屏幕屬性,等等。在 shell 中,相應的語法爲:
am command
您也可以直接從 adb 發出 Activity 管理器命令,無需進入遠程 shell。例如:
adb shell am start -a android.intent.action.VIEW
表 2. 可用的 Activity 管理器命令
命令 | 說明 |
---|---|
start [options] intent |
啓動 intent 指定的 Activity 。
請參閱 intent 參數的規範。 具體選項包括:
|
startservice [options] intent |
啓動 intent 指定的 Service 。
請參閱 intent 參數的規範。 具體選項包括:
|
force-stop package |
強行停止與 package (應用的軟件包名稱)關聯的所有進程。 |
kill [options] package |
終止與 package (應用的軟件包名稱)關聯的所有進程。此命令僅終止可安全終止且不會影響用戶體驗的進程。
具體選項包括:
|
kill-all |
終止所有後臺進程。 |
broadcast [options] intent |
發出廣播 intent。
請參閱 intent 參數的規範。 具體選項包括:
|
instrument [options] component |
使用 Instrumentation 實例啓動監控。通常情況下,目標 component 是 test_package/runner_class 格式。
具體選項包括:
|
profile start process file |
啓動 process 的分析器,將結果寫入 file 。 |
profile stop process |
停止 process 的分析器。 |
dumpheap [options] process file |
轉儲 process 的堆,寫入 file 。
具體選項包括:
|
set-debug-app [options] package |
設置要調試的應用 package 。
具體選項包括:
|
clear-debug-app |
清除之前使用 set-debug-app 設爲調試目標軟件包的軟件包。 |
monitor [options] |
開始監控崩潰或 ANR。
具體選項包括:
|
screen-compat {on | off} package |
控制 package 的屏幕兼容性模式。 |
display-size [reset | widthxheight] |
替換設備顯示尺寸。此命令支持使用大屏設備模仿小屏幕分辨率(反之亦然),對於在不同尺寸的屏幕上測試應用非常有用。
示例: |
display-density dpi |
替換設備顯示密度。此命令支持使用低密度屏幕在高密度屏幕環境上進行測試(反之亦然),對於在不同密度的屏幕上測試應用非常有用。
示例: |
to-uri intent |
將指定的 intent 規範以 URI 的形式輸出。
請參閱 intent 參數的規範。 |
to-intent-uri intent |
將指定的 intent 規範以 intent: URI 的形式輸出。
請參閱 intent 參數的規範。 |
intent 參數的規範
對於採用 intent
參數的 Activity 管理器命令,您可以使用以下選項指定 intent:
全部顯示
調用軟件包管理器 (pm
)
在 adb shell 中,您可以使用軟件包管理器 (pm
) 工具發出命令,以對在設備上安裝的應用軟件包執行操作和查詢。在 shell 中,相應的語法爲:
pm command
您也可以直接從 adb 發出軟件包管理器命令,無需進入遠程 shell。例如:
adb shell pm uninstall com.example.MyApp
表 3. 可用的軟件包管理器命令。
命令 | 說明 |
---|---|
list packages [options] filter |
輸出所有軟件包,或者,僅輸出軟件包名稱包含 filter 中的文本的軟件包。
具體選項:
|
list permission-groups |
輸出所有已知的權限組。 |
list permissions [options] group |
輸出所有已知的權限,或者,僅輸出 group 中的權限。
具體選項:
|
list instrumentation [options] |
列出所有測試軟件包。
具體選項:
|
list features |
輸出系統的所有功能。 |
list libraries |
輸出當前設備支持的所有庫。 |
list users |
輸出系統中的所有用戶。 |
path package |
輸出指定 package 的 APK 的路徑。 |
install [options] path |
將軟件包(通過 path 指定)安裝到系統。
具體選項:
|
uninstall [options] package |
從系統中移除軟件包。
具體選項:
|
clear package |
刪除與軟件包關聯的所有數據。 |
enable package_or_component |
啓用指定軟件包或組件(表示爲“package/class”)。 |
disable package_or_component |
停用指定軟件包或組件(表示爲“package/class”)。 |
disable-user [options] package_or_component |
具體選項:
|
grant package_name permission |
嚮應用授予權限。在搭載 Android 6.0(API 級別 23)及更高版本的設備上,該權限可以是應用清單中聲明的任何權限。在搭載 Android 5.1(API 級別 22)及更低版本的設備上,該權限必須是應用定義的可選權限。 |
revoke package_name permission |
從應用中撤消權限。在搭載 Android 6.0(API 級別 23)及更高版本的設備上,該權限可以是應用清單中聲明的任何權限。在搭載 Android 5.1(API 級別 22)及更低版本的設備上,該權限必須是應用定義的可選權限。 |
set-install-location location |
更改默認安裝位置。具體位置值:
注意:此命令僅用於調試目的;使用此命令會導致應用中斷和其他意外行爲。 |
get-install-location |
返回當前安裝位置。具體返回值:
|
set-permission-enforced permission [true | false] |
指定是否應強制執行指定權限。 |
trim-caches desired_free_space |
減少緩存文件以達到指定的可用空間。 |
create-user user_name |
使用指定的 user_name 創建新用戶,輸出該用戶的新用戶標識符。 |
remove-user user_id |
移除具有指定 user_id 的用戶,從而刪除與該用戶關聯的所有數據 |
get-max-users |
輸出設備支持的最大用戶數。 |
調用設備政策管理器 (dpm
)
爲便於您開發和測試設備管理(或其他企業)應用,您可以向設備政策管理器 (dpm
) 工具發出命令。使用該工具可控制 Active Admin 應用,或更改設備上的政策狀態數據。在 shell 中,相應的語法爲:
dpm command
您也可以直接從 adb 發出設備政策管理器命令,無需進入遠程 shell:
adb shell dpm command
表 4. 可用的設備政策管理器命令
命令 | 說明 |
---|---|
set-active-admin [options] component |
將組件設置爲 Active Admin。
具體選項包括:
|
set-profile-owner [options] component |
將組件設置爲 Active Admin,並將其軟件包設置爲現有用戶的配置文件所有者。
具體選項包括:
|
set-device-owner [options] component |
將組件設置爲 Active Admin,並將其軟件包設置爲設備所有者。
具體選項包括:
|
remove-active-admin [options] component |
停用 Active Admin。應用必須在清單中聲明 android:testOnly 。該命令還會移除設備所有者和配置文件所有者。
具體選項包括:
|
clear-freeze-period-record |
清除設備的之前設置的系統 OTA 更新凍結期記錄。在開發管理凍結期的應用時,這有助於避免設備存在調度方面的限制。請參閱管理系統更新。
在搭載 Android 9.0(API 級別 28)或更高版本的設備上受支持。 |
force-network-logs |
強制系統讓任何現有網絡日誌隨時可供 DPC 檢索。如果有可用的連接或 DNS 日誌,則 DPC 會收到 onNetworkLogsAvailable() 回調。請參閱網絡活動日誌。
此命令有調用頻率限制。在搭載 Android 9.0(API 級別 28)或更高版本的設備上受支持。 |
force-security-logs |
強制系統向 DPC 提供任何現有安全日誌。如果有可用的日誌,則 DPC 會收到 onSecurityLogsAvailable() 回調。請參閱記錄企業設備活動。
此命令有調用頻率限制。在搭載 Android 9.0(API 級別 28)或更高版本的設備上受支持。 |
截屏
screencap
命令是一個用於對設備顯示屏進行屏幕截圖的 shell 實用程序。在 shell 中,相應的語法爲:
screencap filename
要從命令行使用 screencap
,請輸入以下命令:
adb shell screencap /sdcard/screen.png
以下屏幕截圖會話示例向您展示瞭如何使用 adb shell 抓取屏幕截圖,以及使用 pull
命令從設備下載此文件:
$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png
錄製視頻
screenrecord
命令是一個用於錄製設備(搭載 Android 4.4(API 級別 19)及更高版本)顯示屏的 shell 實用程序。該實用程序將屏幕 Activity 錄製爲 MPEG-4 文件。您可以使用此文件創建宣傳視頻或培訓視頻,或將其用於調試或測試。
在 shell 中,使用以下語法:
screenrecord [options] filename
要從命令行使用 screenrecord
,請輸入以下命令:
adb shell screenrecord /sdcard/demo.mp4
按 Ctrl + C(在 Mac 上爲 Command+C)停止屏幕錄製,否則,到三分鐘或 --time-limit
設置的時間限制時,錄製將自動停止。
要開始錄製設備屏幕,請運行 screenrecord
命令以錄製視頻。然後,運行 pull
命令從設備將此視頻下載到主機。下面是一個錄製會話示例:
$ adb shell
shell@ $ screenrecord --verbose /sdcard/demo.mp4
(press Control + C to stop)
shell@ $ exit
$ adb pull /sdcard/demo.mp4
screenrecord
實用程序能以您要求的任何支持的分辨率和比特率進行錄製,同時保留設備顯示屏的寬高比。默認情況下,該實用程序以本機顯示分辨率和屏幕方向進行錄製,時長不超過三分鐘。
screenrecord
實用程序的侷限性:
- 音頻不與視頻文件一起錄製。
- 無法在搭載 Wear OS 的設備上錄製視頻。
- 某些設備可能無法以它們的本機顯示分辨率進行錄製。如果在錄製屏幕時遇到問題,請嘗試使用較低的屏幕分辨率。
- 不支持在錄製時旋轉屏幕。如果在錄製期間屏幕發生了旋轉,則部分屏幕內容在錄製時將被切斷。
表 5. screenrecord
選項
選項 | 說明 |
---|---|
--help |
顯示命令語法和選項 |
--size widthxheight |
設置視頻大小:1280x720 。默認值是設備的本機顯示分辨率(如果支持);如果不支持,則使用 1280x720。爲獲得最佳效果,請使用設備的 Advanced Video Coding (AVC) 編碼器支持的大小。 |
--bit-rate rate |
設置視頻的視頻比特率(以 MB/秒爲單位)。默認值爲 4Mbps。您可以增加比特率以提升視頻品質,但這麼做會導致視頻文件變大。下面的示例將錄製比特率設爲 6Mbps:
|
--time-limit time |
設置最大錄製時長(以秒爲單位)。默認值和最大值均爲 180(3 分鐘)。 |
--rotate |
將輸出旋轉 90 度。此功能處於實驗階段。 |
--verbose |
在命令行屏幕顯示日誌信息。如果您不設置此選項,則該實用程序在運行時不會顯示任何信息。 |
讀取應用的 ART 配置文件
從 Android 7.0(API 級別 24)開始,Android Runtime (ART) 會收集已安裝應用的執行配置文件,這些配置文件用於優化應用性能。您可能需要檢查收集的配置文件,以瞭解在應用啓動期間,系統頻繁執行了哪些方法和使用了哪些類。
要生成文本格式的配置文件信息,請使用以下命令:
adb shell cmd package dump-profiles package
要檢索生成的文件,請使用:
adb pull /data/misc/profman/package.txt
重置測試設備
如果您在多個測試設備上測試應用,則在兩次測試之間重置設備可能很有用,例如,可以移除用戶數據並重置測試環境。您可以使用 testharness
adb shell 命令對運行 Android 10(API 級別 29)或更高版本的測試設備執行恢復出廠設置,如下所示。
adb shell cmd testharness enable
使用 testharness
恢復設備時,設備會自動備份 RSA 密鑰,該密鑰可通過持久位置上的當前工作站進行調試。也就是說,在重置設備後,工作站可以繼續調試並向設備發出 adb 命令,無需手動註冊新密鑰。
此外,爲了幫助您更輕鬆、更安全地繼續測試您的應用,使用 testharness
恢復設備還會更改以下設備設置:
- 設備會設置某些系統設置,以便不會出現初始設備設置嚮導。也就是說,設備會進入一種狀態,供您快速安裝、調試和測試您的應用。
- 設置:
- 停用鎖定屏幕。
- 停用緊急提醒
- 停用帳戶自動同步
- 停用自動系統更新
- 其他:
- 停用預裝的安全應用
如果您的應用需要檢測並適應 testharness
命令的默認設置,您可以使用 ActivityManager.isRunningInUserTestHarness()
。
其他 shell 命令
如需所有可用 shell 程序的列表,請使用以下命令:
adb shell ls /system/bin
大多數命令都提供幫助說明。
下表列出了一些比較常用的 adb shell 命令。
表 6. 一些其他 adb shell 命令
Shell 命令 | 說明 |
---|---|
dumpsys |
將系統數據轉儲到屏幕。要詳細瞭解此命令行工具,請閱讀 dumpsys |
dumpstate |
將狀態轉儲到文件。 |
logcat [option]... [filter-spec]... |
啓用系統和應用日誌記錄,並將輸出顯示到屏幕上。
另請參閱 Logcat 命令行工具。 |
dmesg |
將內核調試消息輸出到屏幕。 |
start |
啓動(重啓)設備。 |
stop |
停止執行設備。 |
sqlite3 |
啓動 sqlite3 命令行程序。
SQLite3 數據庫存儲在文件夾 例如:
|