來玩一下ADB

前言

Android 調試橋(Android Debug Bridge,簡稱ADB)是 Android 的一個通用命令行工具。它能夠幫助PC與模擬器實例或鏈接的 Android 設備進行通訊。它爲各類設備操做提供便利,如安裝和調試應用,並提供對 Unix shell 的訪問。java

工做方式

ADB是客戶端-服務端模式的程序,包含三個組件:android

  1. 客戶端:該組件發送命令,在開發計算機上運行。能夠經過發出 ADB 命令從命令行終端調用客戶端。
  2. 後臺程序:該組件在設備上運行命令。後臺程序在每一個模擬器或設備實例上做爲後臺進程運行。
  3. 服務器:該組件管理客戶端和後臺程序之間的通訊。服務器在開發計算機上做爲後臺進程運行。

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
複製代碼

am相關

在 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
複製代碼

pm相關

在 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相關

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
複製代碼

dumpsys示例

logcat相關

Logcat 是一個命令行工具,用於轉儲系統消息日誌,其中包括設備引起錯誤時的堆疊追蹤以及從您的應用使用 Log 類編寫的消息。

[adb] logcat [<option>] ... [<filter-spec>] ...
複製代碼

logcat命令參數

每一個 Android 日誌消息都有與其關聯的標記和優先級,咱們能夠對日誌進行過濾。
優先級由如下某個字符值表示(按從最低到最高優先級的順序排列):

  • V — 詳細(最低優先級)
  • D — 調試
  • I — 信息
  • W — 警告
  • E — 錯誤
  • F — 致命
  • S — 靜默(最高優先級,不會打印任何內容)

過濾器表達式遵循 tag:priority ... 這個格式,其中 tag 表示感興趣的標記,priority 表示將該標記報告的最低優先級。

adb logcat MainActivity:D *:S
複製代碼

該表達式將阻止除了帶有標記「MainActivity」、優先級等於或高於「調試」的日誌消息。最後一個元素 *:S 將全部標記的優先級設爲「靜默」,從而確保系統僅顯示帶有「MainActivity」標記的日誌消息。

示例log

第三方工具

ADB插件

在Android Studio中能夠添加一個ADB Idea插件,能夠方便的在IDE中調用ADB命令。

ADB Idea 1

ADB Idea 2

logcat

Android Studio中已經提供了logcat顯示區,這裏再推薦一個logcat命令行工具: PID Cat

經過 WLAN 鏈接到設備

除了使用USB使用ADB,還能夠經過WLAN使用,詳情見:ADB文檔(這個不算第三方工具)。

總結

ADB的命令很是豐富,遠不止上述的那些。經過adb shell ls /system/bin能夠查到可用的命令列表。咱們平常使用ADB時沒必要刻意去記這些命令,使用次數多了也就熟了。固然,要使用複雜的功能仍是得查資料的,畢竟腦瓜子記不住那麼多細節。

參考資料

  1. adb文檔
    developer.android.com/studio/comm…
  2. dumpsys文檔
    developer.android.com/studio/comm…
  3. logcat文檔
    developer.android.com/studio/comm…
  4. android adb經常使用命令收集
    www.jianshu.com/p/85066854c…
  5. Android adb 經常使用命令
    blog.csdn.net/Next_Second…
  6. ADB 經常使用命令
    wl9739.github.io/2017/05/22/…

關注微信公衆號,最新技術乾貨實時推送

image
相關文章
相關標籤/搜索