Android的adb使用方法指南

簡要整理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 的特別說明。

  1. 將 Android 設備和 adb 主機連接到這兩者都可以訪問的同一 WLAN 網絡。請注意,並非所有接入點都適用;您可能需要使用防火牆已正確配置爲支持 adb 的接入點。
  2. 如果您要連接到 Wear OS 設備,請關閉與該設備配對的手機上的藍牙。
  3. 使用 USB 數據線將設備連接到主機。
  4. 設置目標設備以監聽端口 5555 上的 TCP/IP 連接。
        adb tcpip 5555
    
  5. 拔掉連接目標設備的 USB 數據線。
  6. 找到 Android 設備的 IP 地址。例如,對於 Nexus 設備,您可以在設置 > 關於平板電腦(或關於手機)> 狀態 > IP 地址下找到 IP 地址。或者,在 Wear OS 設備上,您可以在設置 > WLAN 設置 > 高級 > IP 地址下找到 IP 地址。
  7. 通過 IP 地址連接到設備。
        adb connect device_ip_address
    
  8. 確認主機已連接到目標設備:
        $ adb devices
        List of devices attached
        device_ip_address:5555 device
    

現在,您可以開始操作了!

如果 adb 連接斷開:

  1. 確保主機仍與 Android 設備連接到同一個 WLAN 網絡。
  2. 通過再次執行 adb connect 步驟重新連接。
  3. 如果上述操作未解決問題,重置 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 輸出中(即使在您的桌面上可以看到該模擬器)。當存在以下所有情況時,便會出現這種問題:

  1. adb 服務器沒有運行,以及
  2. 您在使用 emulator 命令時,將 -port 或 -ports 選項的端口值設爲 5554 到 5584 之間的奇數,以及
  3. 您選擇的奇數號端口處於空閒狀態,因此可以與指定端口號的端口建立連接,或者該端口處於忙碌狀態,模擬器切換到了符合第 2 條中要求的另一個端口,以及
  4. 啓動模擬器後才啓動 adb 服務器。

避免出現這種情況的一種方法是讓模擬器自行選擇端口,並且每次運行的模擬器數量不要超過 16 個。另一種方法是始終先啓動 adb 服務器,然後再使用 emulator 命令,如下例所示。

示例 1:在下面的命令序列中,adb devices 命令啓動了 adb 服務器,但是設備列表未顯示。

停止 adb 服務器,然後按照所示順序輸入以下命令。請提供系統中有效的 avd 名稱。要獲取 avd 名稱列表,請輸入 emulator -list-avdsemulator 命令位於 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 將套接字連接從指定的本地端口轉發到設備上指定的遠程端口。您可以通過以下方式指定本地和遠程端口:
  • tcp:port。要選擇任何開放端口,請將 local 值設置爲 tcp:0
  • localabstract:unix_domain_socket_name
  • localreserved:unix_domain_socket_name
  • localfilesystem:unix_domain_socket_name
  • dev:character_device_name
  • jdwp:pid
forward --remove local 移除指定的轉發套接字連接。
reverse --list 列出設備的所有反向套接字連接。
reverse [--no-rebind] remote local 反向連接套接字。--no-rebind 選項表示如果指定的套接字已通過之前的 reverse 命令完成綁定,則反向連接失敗。您可以通過以下方式指定本地和遠程參數的端口:
  • tcp:port。要選擇任何開放端口,請將 remote 值設置爲 tcp:0
  • localabstract:unix_domain_socket_name
  • localreserved:unix_domain_socket_name
  • localfilesystem:unix_domain_socket_name
reverse --remove remote 從設備中移除指定的反向套接字連接。
reverse --remove-all 從設備中移除所有反向套接字連接。
文件傳輸命令 說明
push local remote 將文件和目錄從本地設備(計算機)複製到設備上的遠程位置。
pull [-a] remote local 將遠程文件和目錄複製到設備中。-a 選項用於保留文件的時間戳和模式。
sync  [system|vendor|oem|data|all] 將本地編譯版本從 $ANDROID_PRODUCT_OUT 中的指定位置同步到設備。所有變更文件均從指定的分區複製。默認設置是同步所有分區。此命令僅在您編譯 Android 平臺源代碼時使用。應用開發者不需要使用此命令。

$ANDROID_PRODUCT_OUT 環境變量由 Android 編譯系統自動設置,用於包含系統映像的位置。執行 adb sync 時通常不需要設置 $ANDROID_PRODUCT_OUT,但是如果您未使用編譯樹(但有編譯樹),或者在編譯樹之間進行同步(但不進行切換),這將很有幫助。

    $ANDROID_PRODUCT_OUT=/out/target/product/generic
    adb sync
    

 

應用安裝命令 說明
install [options] package 將軟件包推送到設備並進行安裝。可能的選項如下:
  • --abi abi-identifier:針對特定 ABI 強制安裝應用。
  • -l:具有轉發鎖定功能的應用。
  • -r:替換現有應用。
  • -t:允許安裝測試軟件包。如果使用開發者預覽版 SDK(如果 targetSdkVersion 是字母,而非數字)編譯 APK,則安裝測試 APK 時必須在 install 命令中包含 -t 選項。要了解詳情,請參閱 -t 選項
  • -s:在 SD 卡上安裝應用。
  • -d:允許版本代碼降級(僅用於調試軟件包)。
  • -g:授予所有運行時權限。
install-multiple [options] packages

具有和 install 相同的選項,並且增加了以下選項:

-p:對應用進行部分安裝。

uninstall [-k] package 從設備中移除此應用軟件包。添加 -k 選項可保存數據和緩存目錄。
備份和恢復命令 說明
backup [-f file] [-apk | -noapk] [-obb | -noobb] [-shared | -noshared] [-all] [-system | [-nosystempackage_names 將設備數據的歸檔寫入 file。如果您未指定文件名,則默認文件爲 backup.adb。當您指定 -all 和 -shared 選項時,package 列表爲可選項。下面介紹了其他選項的用法:
  • -apk | -noapk:備份或不備份 .apk 文件。默認值爲 -noapk
  • -obb | -noobb:備份或不備份 .obb 文件。默認值爲 -noobb
  • -shared | -noshared:備份或不備份共享的存儲空間。默認值爲 -noshared
  • -all:備份所有已安裝的應用。
  • -system | -nosystem:備份所有已安裝應用 (-all) 時包含或不包含系統應用。默認值爲 -system
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 頁面上的過濾日誌輸出

$ADB_TRACE 環境變量包含要記錄的調試信息列表(以英文逗號分隔)。具體值可以是 alladbsocketspacketsrwxusbsyncsysdepstransport 和 jdwp 的任意組合。

另請參閱 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 對設備的訪問權限。

您可以使用 $ANDROID_VENDOR_KEYS 環境變量指向某個文件或目錄,其中包含使用 keygen 命令生成的 2048 位 RSA 身份驗證密鑰對。這些密鑰對是對 adb 服務器生成的 RSA 密鑰對的補充。

當 adb 服務器需要密鑰時,它會先搜索 adb 服務器密鑰存儲庫目錄。如果找不到任何密鑰,它會接着檢查 $ANDROID_VENDOR_KEYS 環境變量以尋找位置。如果還是找不到任何密鑰,本地 adb 服務器會生成一個新密鑰對,並將其保存在 adb 服務器密鑰存儲庫目錄中。因此,只有生產全新 Android 設備的 OEM 需要自己運行 'adb keygen'

默認情況下,adb 服務器生成的密鑰對以 adbkey(私鑰)和 adbkey.pub(公鑰)的形式存儲在以下密鑰存儲庫目錄中:

  • Linux 和 Mac:$HOME/.android
  • Windows:%USERPOFILE%\.android
腳本命令 說明
wait-for [-transport] -state 等待設備處於指定狀態。
  • state:值可以是 devicerecoverysideload 或 bootloader
  • transport:值可以是 usblocal 或 any
get-state 輸出設備的 adb 狀態。adb 狀態可以是 print offlinebootloader 或 device。要了解詳情,請參閱查詢設備
get-serialno 輸出 adb 設備序列號字符串。要了解詳情,請參閱查詢設備
get-devpath 輸出 adb 設備路徑。
remount 在讀寫模式下重新裝載 /system/vendor 和 /oem 分區。
reboot [bootloader | recovery | sideload | sideload-auto-reboot ] 重新啓動設備。此命令默認啓動系統映像,但也支持 bootloader 和 recovery
  • bootloader 選項重新啓動到引導加載程序。
  • recovery 選項重新啓動到恢復模式。
  • sideload 選項重新啓動恢復模式並啓動 sideload 模式。
  • sideload-auto-reboot 選項與 sideload 一樣,但它在完成旁加載後會重新啓動。
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。您可以使用以下選項的任意組合:
  • -e:用於指定轉義字符;如果您不想使用轉義字符,則使用值 none。如果您未提供值,則使用默認的轉義字符(破折號 (-))。
  • -n:不從 stdin 讀取數據。
  • -T:停用僞終端實用程序 (PTY) 分配。
  • -t:強制進行 PTY 分配。
  • -x:停用遠程退出代碼和 stdout/stderr 分隔符。

要了解詳情,請參閱發出 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 參數的規範

具體選項包括:

  • -D:啓用調試。
  • -W:等待啓動完成。
  • --start-profiler file:啓動分析器並將結果發送到 file
  • -P file:類似於 --start-profiler,但當應用進入空閒狀態時分析停止。
  • -R count:重複啓動 Activity count 次。在每次重複前,將完成頂層 Activity。
  • -S:啓動 Activity 前強行停止目標應用。
  • --opengl-trace:啓用對 OpenGL 函數的跟蹤。
  • --user user_id | current:指定要作爲哪個用戶運行;如果未指定,則作爲當前用戶運行。
startservice [options] intent 啓動 intent 指定的 Service

請參閱 intent 參數的規範

具體選項包括:

  • --user user_id | current:指定要作爲哪個用戶運行;如果未指定,則作爲當前用戶運行。
force-stop package 強行停止與 package(應用的軟件包名稱)關聯的所有進程。
kill [options] package 終止與 package(應用的軟件包名稱)關聯的所有進程。此命令僅終止可安全終止且不會影響用戶體驗的進程。

具體選項包括:

  • --user user_id | all | current:指定要終止哪個用戶的進程;如果未指定,則終止所有用戶的進程。
kill-all 終止所有後臺進程。
broadcast [options] intent 發出廣播 intent。

請參閱 intent 參數的規範

具體選項包括:

  • [--user user_id | all | current]:指定要發送給哪個用戶;如果未指定,則發送給所有用戶。
instrument [options] component 使用 Instrumentation 實例啓動監控。通常情況下,目標 component 是 test_package/runner_class 格式。

具體選項包括:

  • -r:輸出原始結果(否則對 report_key_streamresult 進行解碼)。與 [-e perf true] 結合使用以生成性能測量值的原始輸出。
  • -e name value:將參數 name 設爲 value。對於測試運行器,通用格式爲 -e testrunner_flag value[,value...]
  • -p file:將分析數據寫入 file
  • -w:先等待插樁完成,然後再返回。測試運行器需要使用此選項。
  • --no-window-animation:運行時關閉窗口動畫。
  • --user user_id | current:指定以哪個用戶身份運行插樁;如果未指定,則以當前用戶身份運行。
profile start process file 啓動 process 的分析器,將結果寫入 file
profile stop process 停止 process 的分析器。
dumpheap [options] process file 轉儲 process 的堆,寫入 file

具體選項包括:

  • --user [user_id | current]:提供進程名稱時,指定要轉儲的進程的用戶;如果未指定,則使用當前用戶。
  • -n:轉儲原生堆,而非託管堆。
set-debug-app [options] package 設置要調試的應用 package

具體選項包括:

  • -w:應用啓動時等待調試程序。
  • --persistent:保留此值。
clear-debug-app 清除之前使用 set-debug-app 設爲調試目標軟件包的軟件包。
monitor [options] 開始監控崩潰或 ANR。

具體選項包括:

  • --gdb:在崩潰/ANR 時在指定端口上啓動 gdbserv。
screen-compat {on | off} package 控制 package 的屏幕兼容性模式。
display-size [reset | widthxheight] 替換設備顯示尺寸。此命令支持使用大屏設備模仿小屏幕分辨率(反之亦然),對於在不同尺寸的屏幕上測試應用非常有用。

示例:
am display-size 1280x800

display-density dpi 替換設備顯示密度。此命令支持使用低密度屏幕在高密度屏幕環境上進行測試(反之亦然),對於在不同密度的屏幕上測試應用非常有用。

示例:
am display-density 480

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 中的文本的軟件包。

具體選項:

  • -f:查看它們的關聯文件。
  • -d:進行過濾以僅顯示已停用的軟件包。
  • -e:進行過濾以僅顯示已啓用的軟件包。
  • -s:進行過濾以僅顯示系統軟件包。
  • -3:進行過濾以僅顯示第三方軟件包。
  • -i:查看軟件包的安裝程序。
  • -u:還包括卸載的軟件包。
  • --user user_id:要查詢的用戶空間。
list permission-groups 輸出所有已知的權限組。
list permissions [options] group 輸出所有已知的權限,或者,僅輸出 group 中的權限。

具體選項:

  • -g:按組進行整理。
  • -f:輸出所有信息。
  • -s:簡短摘要。
  • -d:僅列出危險權限。
  • -u:僅列出用戶將看到的權限。
list instrumentation [options] 列出所有測試軟件包。

具體選項:

  • -f:列出測試軟件包的 APK 文件。
  • target_package:僅列出此應用的測試軟件包。
list features 輸出系統的所有功能。
list libraries 輸出當前設備支持的所有庫。
list users 輸出系統中的所有用戶。
path package 輸出指定 package 的 APK 的路徑。
install [options] path 將軟件包(通過 path 指定)安裝到系統。

具體選項:

  • -l:安裝具有轉發鎖定功能的軟件包。
  • -r:重新安裝現有應用,保留其數據。
  • -t:允許安裝測試 APK。如果您只運行或調試了應用,或者使用了 Android Studio 的 Build > Build APK 命令,Gradle 便會生成一個測試 APK。如果使用開發者預覽版 SDK(如果 targetSdkVersion 是字母,而非數字)編譯 APK,則安裝測試 APK 時必須在 install 命令中包含 -t 選項
  • -i installer_package_name:指定安裝程序軟件包名稱。
  • -s:在共享的大容量存儲設備(如 sdcard)上安裝軟件包。
  • -f:在內部系統內存上安裝軟件包。
  • -d:允許版本代碼降級。
  • -g:授予應用清單中列出的所有權限。
uninstall [options] package 從系統中移除軟件包。

具體選項:

  • -k:移除軟件包後保留數據和緩存目錄。
clear package 刪除與軟件包關聯的所有數據。
enable package_or_component 啓用指定軟件包或組件(表示爲“package/class”)。
disable package_or_component 停用指定軟件包或組件(表示爲“package/class”)。
disable-user [options] package_or_component

具體選項:

  • --user user_id:要停用的用戶。
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 更改默認安裝位置。具體位置值:
  • 0:自動 - 讓系統決定最合適的位置。
  • 1:內部 - 在內部設備存儲上安裝。
  • 2:外部 - 在外部媒體上安裝。

注意:此命令僅用於調試目的;使用此命令會導致應用中斷和其他意外行爲。

get-install-location 返回當前安裝位置。具體返回值:
  • 0 [auto]:讓系統決定最合適的位置
  • 1 [internal]:在內部設備存儲上安裝
  • 2 [external]:在外部媒體上安裝
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。

具體選項包括:

  • --user user_id:指定目標用戶。您也可以傳遞 --user current 以選擇當前用戶。
set-profile-owner [options] component 將組件設置爲 Active Admin,並將其軟件包設置爲現有用戶的配置文件所有者。

具體選項包括:

  • --user user_id:指定目標用戶。您也可以傳遞 --user current 以選擇當前用戶。
  • --name name:指定簡單易懂的組織名稱。
set-device-owner [options] component 將組件設置爲 Active Admin,並將其軟件包設置爲設備所有者。

具體選項包括:

  • --user user_id:指定目標用戶。您也可以傳遞 --user current 以選擇當前用戶。
  • --name name:指定簡單易懂的組織名稱。
remove-active-admin [options] component 停用 Active Admin。應用必須在清單中聲明 android:testOnly。該命令還會移除設備所有者和配置文件所有者。

具體選項包括:

  • --user user_id:指定目標用戶。您也可以傳遞 --user current 以選擇當前用戶。
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:
screenrecord --bit-rate 6000000 /sdcard/demo.mp4

 

--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 工具包含用於輸出表格內容的 .dump 以及用於輸出現有表格的 SQL CREATE 語句的 .schema 等命令。您也可以隨時執行 SQLite 命令。

SQLite3 數據庫存儲在文件夾 /data/data/package_name/databases/ 中。

例如:

    $ adb -s emulator-5554 shell
    $ sqlite3 /data/data/com.example.app/databases/rssitems.db
    SQLite version 3.3.12
    Enter ".help" for instructions

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章