Android ADB
Android 調試橋
本文內容
Android 調試橋 (adb) 是一個通用命令行工具,其允許您與模擬器實例或連接的 Android 設備進行通信。它可為各種設備操作提供便利,如安裝和調試應用,并提供對 Unix shell(可用來在模擬器或連接的設備上運行各種命令)的訪問。該工具作為一個客戶端-服務器程序,包括三個組件:
- 客戶端,該組件發送命令。客戶端在開發計算機上運行。您可以通過發出 adb 命令從命令行終端調用客戶端。
- 后臺程序,該組件在設備上運行命令。后臺程序在每個模擬器或設備實例上作為后臺進程運行。
- 服務器,該組件管理客戶端和后臺程序之間的通信。服務器在開發計算機上作為后臺進程運行。
您可以在?android_sdk/platform-tools/?中找到?adb?工具。
adb 的工作方式
啟動一個 adb 客戶端時,此客戶端首先檢查是否有已運行的 adb 服務器進程。如果沒有,它將啟動服務器進程。當服務器啟動時,它與本地 TCP 端口 5037 綁定,并偵聽從 adb 客戶端發送的命令—所有 adb 客戶端均使用端口 5037 與 adb 服務器通信。
然后,服務器設置與所有運行的模擬器/設備實例的連接。它通過掃描 5555 到 5585 之間(模擬器/設備使用的范圍)的奇數號端口查找模擬器/設備實例。服務器一旦發現 adb 后臺程序,它將設置與該端口的連接。請注意,每個模擬器/設備實例將獲取一對按順序排列的端口 — 用于控制臺連接的偶數號端口和用于 adb 連接的奇數號端口。例如:
模擬器 1,控制臺:5554
模擬器 1,adb:5555
模擬器 2,控制臺:5556
模擬器 2,adb:5557
以此類推...
如上所示,在端口 5555 與 adb 連接的模擬器實例與偵聽端口 5554 的控制臺的實例相同。
當服務器已設置與所有模擬器實例的連接后,您可以使用 adb 命令訪問這些實例。由于服務器管理與模擬器/設備實例的連接,并處理來自多個 adb 客戶端的命令,因此,您可以從任意客戶端(或從某個腳本)控制任意模擬器/設備實例。
在您的設備上啟用 adb 調試
要在通過 USB 連接的設備上使用 adb,您必須在設備系統設置中啟用?USB debugging(位于?Developer options?下)。
在運行 Android 4.2 及更高版本的設備上,Developer options 屏幕默認情況下處于隱藏狀態。如需將其顯示出來,請轉到?Settings > About phone?并點按?Build number?七次。返回上一屏幕,在底部可以找到?Developer options。
在某些設備上,Developer options 屏幕所在的位置或命名方式可能有所不同。
現在,您可以將設備與 USB 連接。可以從?android_sdk/platform-tools/?目錄執行?adb devices?來驗證設備是否連接。如果已連接,您將看到設備名稱以“設備”形式列示。
注:當您連接運行 Android 4.2.2 或更高版本的設備時,系統將顯示一個對話框,詢問您是否接受允許在這臺計算機上調試的 RSA 密鑰。這種安全機制可以保護用戶設備,因為它可以確保只有在您能夠解鎖設備并確認對話框的情況下才能執行 USB 調試和其他 ADB 命令。
如需了解有關通過 USB 連接到設備的詳細信息,請參閱在硬件設備上運行應用。
通過 WLAN 連接到設備
一般情況下,通過 USB 使用 adb。不過,也可以按照下面的說明通過 WLAN 使用它。
將 Android 設備和 adb 主計算機連接到這兩者都可以訪問的常用 WLAN 網絡。請注意,并非所有訪問點均適用;您可能需要使用已正確配置防火墻的訪問點以支持 adb 的訪問點。
注:如果您嘗試連接到 Android Wear 設備,則通過關閉與其連接的手機的藍牙強制將它連接到 WLAN。
現在,您可以開始操作了!
如果 adb 連接丟失:
然后,從頭開始操作。
查詢設備
在發出 adb 命令之前,知道哪些模擬器/設備實例已連接到 adb 服務器會很有幫助。您可以使用?devices?命令生成已連接的模擬器/設備的列表:
adb devices在響應時,adb 針對每個實例輸出此狀態信息:
- 序列號 — 一個由 adb 創建的字符串,用于通過其控制臺端口號唯一標識模擬器/設備實例。序列號的格式為?type-console-port。下面是一個序列號示例:emulator-5554
- 狀態 — 實例的連接狀態可為下列狀態之一:
- offline?— 實例未連接到 adb 或不響應。
- device?— 實例現在已連接到 adb 服務器。請注意,此狀態并不表示 Android 系統已完全啟動且可以運行,因為在此實例連接到 adb 時系統仍在啟動。不過,在啟動后,這將是模擬器/設備實例的正常運行狀態。
- no device?— 未連接模擬器/設備。
輸出的格式類似如下:
List of devices attached serial_number state以下示例向您展示了?devices?命令及其輸出:
adb devices List of devices attached emulator-5554??device emulator-5556??device emulator-5558??device將命令發送至特定設備
如果多個模擬器/設備實例正在運行,在發出 adb 命令時您必須指定一個目標實例。為此,請在命令中使用?-s?選項。以下是?-s?選項的用法:
adb -s serial_number command如上所示,您使用由 adb 分配的序列號為命令指定目標實例。您可使用?devices?命令獲取正在運行的模擬器/設備實例的序列號。例如:
adb -s emulator-5556 install helloWorld.apk注意,如果在多個設備可用時您未指定目標模擬器/設備實例就發出命令,那么 adb 將生成一個錯誤。
如果您有多個設備可用(硬件或模擬設備),但只有一個設備是模擬器,則使用?-e?選項將命令發送至該模擬器。同樣,如果有多個設備,但只連接了一個硬件設備,則使用?-d?選項將命令發送至該硬件設備。
安裝應用
您可以使用 adb 從開發計算機復制應用,并將其安裝到模擬器/設備實例上。為此,請使用?install?命令。使用此命令,您必須指定您要安裝的 APK 文件的路徑:
adb install path_to_apk如需有關如何創建可在模擬器/設備實例上安裝的 APK 文件的詳細信息,請參閱構建和運行您的應用。
請注意,如果使用 Android Studio,則無需直接使用 adb(或 aapt)在模擬器/設備上安裝您的應用。而是由 Android Studio 為您處理應用的打包和安裝。
設置端口轉發
您可以使用?forward?命令設置任意端口轉發 — 將對特定主機端口的請求轉發到模擬器/設備實例上的其他端口。下面向您介紹如何設置主機端口 6100 到模擬器/設備端口 7100 的轉發:
adb forward tcp:6100 tcp:7100您也可以使用 adb 設置傳輸到指定的抽象 UNIX 網域套接字的轉發,如下所示:
adb forward tcp:6100 local:logd將文件復制到設備/從設備復制文件
您可以使用 adb 命令?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 命令
| 目標設備 | -d | 將 adb 命令發送至唯一連接的 USB 設備。 | 如果連接了多個 USB 設備,將返回錯誤。 |
| -e | 將 adb 命令發送至唯一運行的模擬器實例。 | 如果有多個模擬器實例在運行,將返回錯誤。 | |
| -s?serial_number | 將 adb 命令發送至以其 adb 分配的序列號命名的特定模擬器/設備實例(如“emulator-5556”)。 | 請參閱將命令發送至特定模擬器/設備實例。 | |
| 常規 | devices | 輸出所有連接的模擬器/設備實例的列表。 | 如需了解詳細信息,請參閱查詢模擬器/設備實例。 |
| help | 輸出支持的 adb 命令的列表。 | ? | |
| version | 輸出 adb 版本號。 | ? | |
| 調試 | logcat?[option] [filter-specs] | 將日志數據輸出到屏幕。 | ? |
| bugreport | 將?dumpsys、dumpstate?和?logcat數據輸出到屏幕,以用于報告錯誤。 | ? | |
| jdwp | 輸出給定設備上可用的 JDWP 進程的列表。 | 您可以使用?forward jdwp:pid?端口轉發規范以連接到特定的 JDWP 進程。例如: adb forward tcp:8000 jdwp:472 jdb -attach localhost:8000 | |
| 數據 | install?path_to_apk | 將 Android 應用(使用 APK 文件的完整路徑表示)推送到模擬器/設備。 | ? |
| pull?remote?local | 從模擬器/設備實例將指定文件復制到開發計算機。 | ? | |
| push?local?remote | 從開發計算機將指定文件復制到模擬器/設備實例。 | ? | |
| 端口和網絡連接 | forward?local?remote | 將來自指定本地端口的套接字連接轉發到模擬器/設備實例上的指定遠程端口。 | 端口規范可使用以下架構:
|
| ppp?tty?[parm]... | 通過 USB 運行 PPP。
請注意,不得自動啟動 PPP 連接。 | ? | |
| 腳本 | get-serialno | 輸出 adb 實例序列號字符串。 | 如需了解詳細信息,請參閱查詢模擬器/設備實例。 |
| get-state | 輸出模擬器/設備實例的 adb 狀態。 | ||
| wait-for-device | 阻止執行,直至設備處于在線狀態,即直至此實例狀態為?device。 | 您可以將此命令附加到其他 adb 命令,在此情況下,adb 在發出其他命令前將處于等待狀態,直至模擬器/設備實例已連接。下面是一個示例: adb wait-for-device shell getprop 請注意,此命令不會使 adb 等待整個系統已完全啟動。因此,您不應將其追加到需要系統完全啟動的其他命令。例如,install?需要使用 Android 軟件包管理器,其僅在系統完全啟動后才可用。如下命令 adb wait-for-device install app.apk 在模擬器或設備實例連接到 adb 服務器時立即發出?install?命令,但 Android 系統還未完全啟動,因此,它將引發錯誤。 | |
| 服務器 | start-server | 檢查 adb 服務器進程是否在運行,如果未運行則啟動它。 | ? |
| kill-server | 終止 adb 服務器進程。 | ? | |
| Shell | shell | 在目標模擬器/設備實例中啟動遠程 shell。 | 如需了解詳細信息,請參閱發出 shell 命令。 |
| shell?shell_command | 在目標模擬器/設備實例中發出 shell 命令,然后退出遠程 shell。 |
發出 shell 命令
您可以使用?shell?命令通過 adb 發出設備命令,可以進入或不進入模擬器/設備實例上的 adb 遠程 shell。要在不進入遠程 shell 的情況下發出一個命令,請使用如下?shell?命令:
adb [-d|-e|-s serial_number] shell shell_command或者,使用如下命令進入模擬器/設備實例上的遠程 shell:
adb [-d|-e|-s serial_number] shell當您準備退出遠程 shell 時,按 Control + D 或輸入?exit。
shell 命令二進制文件存儲在模擬器或設備的文件系統中,其路徑為?/system/bin/。
調用 Activity Manager (am)
在 adb shell 中,您可以使用 Activity Manager (am) 工具發出命令以執行各種系統操作,如啟動 Activity、強行停止進程、廣播 intent、修改設備屏幕屬性及其他操作。在 shell 中,此語法為:
am command您也可以直接從 adb 發出 Activity Manager 命令,無需進入遠程 shell。例如:
adb shell am start -a android.intent.action.VIEW表 2.?可用的 Activity Manager 命令
| 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 參數的規范
調用軟件包管理器 (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 | 輸出設備支持的最大用戶數。 |
進行屏幕截圖
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按 Control + C 停止屏幕錄制,否則,到三分鐘或?--time-limit?設置的時間限制時,錄制將自動停止。
要開始錄制設備屏幕,請運行?screenrecord?命令以錄制視頻。然后,運行?pull?命令從設備將此視頻下載到主計算機。下面是一個錄制會話示例:
$ adb shell shell@ $ screenrecord --verbose /sdcard/demo.mp4 (press Control + C to stop) shell@ $ exit $ adb pull /sdcard/demo.mp4screenrecord?實用程序可以任何支持的分辨率和所需的比特率進行錄制,同時保留設備顯示屏的縱橫比。默認情況下,此實用程序以原生顯示分辨率和屏幕方向進行錄制,最大時長為三分鐘。
下面是?screenrecord?實用程序的一些已知限制,您在使用時應注意:
- 某些設備可能無法以它們的原生顯示分辨率進行錄制。如果在錄制屏幕時出現問題,請嘗試使用較低的屏幕分辨率。
- 不支持在錄制時旋轉屏幕。如果在錄制期間屏幕旋轉了,則部分屏幕的錄制將被切斷。
表 4.?screenrecord?選項
| --help | 顯示命令語法和選項 |
| --size?widthxheight | 設置視頻大小:1280x720。默認值是設備的原生顯示分辨率(如果支持),如果不支持,則使用 1280x720。為實現最佳結果,請使用設備的 Advanced Video Coding (AVC) 編碼器支持的大小。 |
| --bit-rate?rate | 設置視頻的視頻比特率(以兆比特每秒為單位)。默認值為 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其他 shell 命令
如需所有可用 shell 程序的列表,請使用以下命令:
adb shell ls /system/bin大多數命令都提供幫助說明。
表 5 列出了一些比較常用的 adb shell 命令。
表 5.?其他一些 adb shell 命令
| dumpsys | 將系統數據轉儲到屏幕。 | Dalvik Debug Monitor Server?(DDMS) 工具提供了一個集成調試環境,讓您用起來更方便。 |
| dumpstate | 將狀態轉儲到文件。 | |
| logcat?[option]...?[filter-spec]... | 啟用系統和應用日志記錄,并將輸出傳輸到屏幕。 | |
| dmesg | 將內核調試消息輸出到屏幕。 | |
| start | 啟動(重啟)模擬器/設備實例。 | ? |
| stop | 停止執行模擬器/設備實例。 | ? |
原文鏈接:https://developer.android.com/studio/command-line/adb.html#devicestatus
總結
以上是生活随笔為你收集整理的Android ADB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学真正的意义
- 下一篇: 快速解决 Android SDK Man