Android 調試橋(Android Debug Bridge,簡稱ADB)是 Android 的一個通用命令行工具。它能夠幫助PC與模擬器實例或鏈接的 Android 設備進行通訊。它爲各類設備操做提供便利,如安裝和調試應用,並提供對 Unix shell 的訪問。java
ADB是客戶端-服務端模式的程序,包含三個組件:android
ADB工具在sdk/platform-tools
目錄下,通常都會加到環境變量中。
啓動一個 ADB 客戶端時,此客戶端首先檢查是否有已運行的 ADB 服務器進程。若是沒有,它將啓動服務器進程。當服務器啓動時,它與本地 TCP 端口 5037 綁定,並偵遵從 ADB 客戶端發送的命令—全部 ADB 客戶端均使用端口 5037 與 ADB 服務器通訊。
而後,服務器設置與全部運行的模擬器/設備實例的鏈接。它經過掃描 5555 到 5585 之間(模擬器/設備使用的範圍)的奇數號端口查找模擬器/設備實例。服務器一旦發現 ADB 後臺程序,它將設置與該端口的鏈接。請注意,每一個模擬器/設備實例將獲取一對按順序排列的端口,用於控制檯鏈接的偶數號端口和用於 ADB 鏈接的奇數號端口。
git
如上所示,在端口 5555 與 ADB 鏈接的模擬器實例與偵聽端口 5554 的控制檯的實例相同。
當服務器已設置與全部模擬器實例的鏈接後,就可使用 ADB 命令訪問這些實例。因爲服務器管理與模擬器/設備實例的鏈接,並處理來自多個 ADB 客戶端的命令,所以,能夠從任意客戶端(或從某個腳本)控制任意模擬器/設備實例。github
能夠經過adb help
來查看ADB的命令幫助,固然也能夠Google了。這裏只介紹平常開發和測試中使用頻率較高的命令。shell
// 輸出全部鏈接的模擬器/設備實例的列表。
// offline — 實例未鏈接到 adb 或不響應。
// device — 實例如今已鏈接到 adb 服務器。
// no device — 未鏈接模擬器/設備。
adb devices
// 檢查 adb 服務器進程是否在運行,若是未運行則啓動它。
adb start-server
// 終止 adb 服務器進程。
adb kill-server
// 在目標模擬器/設備實例中啓動遠程 shell。多設備時要加 「-s 設備名」
adb shell
複製代碼
// 安裝apk
// 多設備時加 「-s」
// 覆蓋安裝加 「-r」
adb install xxx.apk
// 卸載指定APP
// 若是想保留緩存文件加 「-k」
adb uninstall 包名
複製代碼
// remote: 模擬器/設備實例(遠程)上目標文件/目錄的路徑
// local:開發計算機(本地)目標文件/目錄的路徑
// 從模擬器或設備複製文件或目錄(及其子目錄)
adb pull remote local
// 將文件文件或目錄(及其子目錄)複製到模擬器或設備
adb push local remote
複製代碼
在 adb shell 中,可使用 Activity Manager (am) 工具發出命令以執行各類系統操做,如啓動 Activity、強行中止進程、廣播 intent、修改設備屏幕屬性及其餘操做。緩存
// shell環境中,command爲shell命令
am command
// 不進入shell時
adb shell am command
// 啓動Activity
// -a 表示 action,-c 表示 category ,-d 表示 data_uri,-e 表示添加額外 Key-Value 信息
// 除了默認啓動的 Activity 之外,打開其餘的 Activity 時,須要在 AndroidManifest 文件中添加 android:exported="true" 屬性
adb shell am start package/package-activity
// 啓動Service
adb shell am startservice [options] intent
// 發送廣播
adb shell am broadcast [options] intent
// 使用 Instrumentation 實例啓動監控。一般,目標 component 是表單 test_package/runner_class
adb shell am instrument [options] component
// 強行中止與 package(應用的包名稱)關聯的全部應用
adb shell am force-stop package
// 終止與 package(應用的包名稱)關聯的全部進程。僅終止可安全終止且不會影響用戶體驗的進程。
adb shell am kill [options] package
複製代碼
舉例:安全
// 啓動包名爲com.zjx.sample.proguard的APP中的MainActivity
// Service和這個相似
adb shell am start com.zjx.sample.proguard/.MainActivity
// 模擬發送一個屏幕打開的廣播
adb shell am broadcast -a adnroid.intent.action.ACTION_SCREEN_ON
// 強制關閉應用
adb shell am force-stop com.zjx.sample.proguard
複製代碼
在 adb shell 中,您可使用軟件包管理器 (pm) 工具發出命令,以對設備上安裝的應用軟件包進行操做和查詢。服務器
// 看是否在shell環境下,在則無需 adb shell
(adb shell) pm command
// 輸出全部軟件包,或者,僅輸出包名稱包含 filter 中的文本的軟件包
adb shell pm list packages [options] filter
// 輸出給定 package 的 APK 的路徑
adb shell pm path package
// 刪除與軟件包關聯的全部數據
adb shell pm clear package
複製代碼
舉例:微信
// 列出包名包含com.zjx的應用包名列表
adb shell pm list packages com.zjx
// 輸出com.zjx.sample.proguard應用的路徑
adb shell pm path com.zjx.sample.proguard
複製代碼
雖然如今有不少截屏和錄屏的軟件,可是使用命令也是很方便的,並且效果不錯。工具
// 截屏
adb shell screencap filename
// 錄屏
// 要求:Android 4.4(API 級別 19)及更高版本
// 此實用程序將屏幕 Activity 錄製到 MPEG-4 文件
// 按 Control + C 中止屏幕錄製,不然,到三分鐘或 --time-limit 設置的時間限制時,錄製將自動中止。
// 能夠任何支持的分辨率和所需的比特率進行錄製,同時保留設備顯示屏的縱橫比
// 不支持在錄製時旋轉屏幕。若是在錄製期間屏幕旋轉了,則部分屏幕的錄製將被切斷
adb shell screenrecord [options] filename
複製代碼
dumpsys功能很豐富,能夠將系統數據轉儲到屏幕。能夠經過adb shell service list
或者adb shell dumpsys -l
查看dumpsys支持的服務,經常使用的有:activity、package、window、input、alarm、meminfo等。
//查詢AMS服務相關信息
adb shell dumpsys activity
//查詢WMS服務相關信息
adb shell dumpsys window
//查詢CPU狀況
adb shell dumpsys cpuinfo
//查詢內存狀況
adb shell dumpsys meminfo
...
複製代碼
舉例:
// 打印com.zjx.sample.proguard應用的Activity信息
adb shell dumpsys activity com.zjx.sample.proguard
複製代碼
Logcat 是一個命令行工具,用於轉儲系統消息日誌,其中包括設備引起錯誤時的堆疊追蹤以及從您的應用使用 Log 類編寫的消息。
[adb] logcat [<option>] ... [<filter-spec>] ...
複製代碼
每一個 Android 日誌消息都有與其關聯的標記和優先級,咱們能夠對日誌進行過濾。
優先級由如下某個字符值表示(按從最低到最高優先級的順序排列):
過濾器表達式遵循 tag:priority ...
這個格式,其中 tag 表示感興趣的標記,priority 表示將該標記報告的最低優先級。
adb logcat MainActivity:D *:S
複製代碼
該表達式將阻止除了帶有標記「MainActivity」、優先級等於或高於「調試」的日誌消息。最後一個元素 *:S 將全部標記的優先級設爲「靜默」,從而確保系統僅顯示帶有「MainActivity」標記的日誌消息。
在Android Studio中能夠添加一個ADB Idea
插件,能夠方便的在IDE中調用ADB命令。
Android Studio中已經提供了logcat顯示區,這裏再推薦一個logcat命令行工具: PID Cat。
除了使用USB使用ADB,還能夠經過WLAN使用,詳情見:ADB文檔(這個不算第三方工具)。
ADB的命令很是豐富,遠不止上述的那些。經過adb shell ls /system/bin
能夠查到可用的命令列表。咱們平常使用ADB時沒必要刻意去記這些命令,使用次數多了也就熟了。固然,要使用複雜的功能仍是得查資料的,畢竟腦瓜子記不住那麼多細節。