Android測試工具之強大的adb工具

2022-01-10 松勤軟體測試

Android調試橋接(adb)是電腦與設備(Android模擬器或者Android設備)進行通信的通用命令行工具。adb提供了各種各樣的設備命令,包括安裝、調試app以及在Unix shell中可以使用的大多數命令。adb是一個客戶端-服務端模式的程序,有以下三個組件:

1、客戶端,發送命令。客戶端運行在開發機上,我們可以從命令行終端運行adb命令調啟客戶端程序。

2、守護進程(adbd),運行在設備上的後臺程序。

3、服務端,管理客戶端和守護進程之間的通信,它作為後臺進程運行在我們的開發機上。

abb工具包含在Android SDK平臺工具包中(android_sdk/platform-tools/),可以使用SDK Manager下載。

adb是怎樣工作的?

運行adb客戶端的時候,首先會檢測adb服務端進程是否已經運行。如果服務端進程沒有運行,它會主動開啟服務端進程;如果服務端進程已經運行,它將會綁定本地TCP埠5037,同時監聽從客戶端發送出去的命令--所有的adb客戶端使用5037埠和adb服務端通信,然後服務端和所有可連接設備建立連接。

但對於模擬器而言,服務端進程將會掃描5555~5585之間的奇數作為埠,也就是最多可以連接16個模擬器。還有一點,服務端找到守護進程後就會連接掃描到的可用埠,不過從原理上講,每個模擬器使用一對順序的埠---一個偶數埠用語控制臺連接,一個奇數埠用於adb連接。例如:

Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557
... ...

一旦服務端連接上了可連接的所有設備,你就可以使用adb命令訪問這些設備,還可以開啟多個adb客戶端來控制多個設備的操作,adb的強大之處可見一斑。

adb安裝

brew cask install android-platform-tools

查看已連接設備

adb devices

在設備上開啟adb調試

使用adb連接到設備需要通過USB接口,我們必須開啟設備系統--設置--開發者選項中的USB調試功能。在Android4.2以後的版本中,開發者選項是默認隱藏的。為了讓它顯示,需要從'設置'--'關於手機'中找到'構建版本號',並且連續點擊7次,然後返回到設置頁面就可以在底部找到'開發者選項'。然而在一些設備上,開發者選項的命名和位置有可能不一樣。

怎麼知道通過USB連接上了自己的設備呢?在命令行終端使用'adb devices'(當然要設置android_sdk/platform-tools/目錄的環境變量),如果連接上設備,將會在終端下看到連接成功的信息。

注意: 在連接Android 4.2.2以上的設備中,系統將出現一個是否允許在當前開發機上開啟調試功能的對話框,這是一種保護用戶設備的安全機制。

通過Wi-Fi連接到設備

一般adb通過USB連接到設備,但是我們使用USB初始化某些設置之後,也可以通過Wi-Fi進行連接。如下描述Wi-Fi連接到設備的操作:

1、Android設備和開發主機連接到同一Wi-Fi網絡中,但不是所有的接入點都可以使用,有時你可能需要在開啟了防火牆的訪問點上配置訪問點支持adb。

2、如果Android設備連接到Android穿戴設備上,關閉Android 設備上的藍牙配對。

3、使用USB線纜連接Android設備到開發主機上。

4、設置目標設備使用TCP/IP連接到監聽埠5555上。

adb tcpip 5555

1、從目標設備斷開USB連接。

2、找到Android設備的IP位址。

3、adb連接到android設備的IP位址。

adb connectdevice_ip_address

1、查看開發機是否連接到Android設備。

$ adb devicesList of devices attacheddevice_ip_address:5555 device

如果adb連接中斷:

1、檢查你的開發機是否和Android設備在同一Wi-Fi網絡中

2、開發機執命令 adb connect 進行重連。

3、仍然不工作的話, 關閉並重新打開服務端管理程序:

adb kill-server

add start-server

設備查詢

在發送adb命令之前,一般先要檢查連接到adb端的設備是否正常,如下:

 adb devices -l  

在響應的信息中,adb將列印每個設備的狀態信息:

序列號: 能被adb埠號唯一識別設備的字符串,例如: emulator-5554

設備連接狀態包括: 

offline: 設備不能連接到adb,沒有響應。

device: 設備連接到了adb服務端。但在設備系統正在啟動的過程中不一定能正確反映它的狀態。

no device: 沒有設備連接

描述: 如果加上了-l 選項,devices命令將返回設備信息。這在有多個設備連接的情況下是比較有用的。

模擬器不再adb devices產生的列表中

adb devices在個別情況下的輸出是不會顯示模擬器運行狀況的,即使模擬器在開發機上是可見的,這樣的情形在如下條件下產生:

1、adb服務端沒有運行;

2、使用 emulator 命令中的-port 或者 -ports 選項的埠是介於5554和5584之間的奇數值;

3、選擇的奇數埠空閒,使得在連接模擬器的時候選擇了奇數埠;或者奇數埠處於繁忙狀態,模擬器切換到其他埠(就像第二條所描述的那樣);

4、模擬器啟動後adb服務端還沒有啟動。

避免這種條件的一種方法是:讓模擬器自己選擇埠,同時不要立刻運行超過16個模擬器;避免這種情況的另外一種方法是:總是在運行emulator命令之前啟動adb服務端。為什麼呢?

情形1:在接下來的命令執行序列中,直接使用 adb devices 命令啟動adb服務端,並沒有出現模擬器的設備信息列表。

那麼我們要做的是,使用下面的命令停止adb服務端。從系統中獲取一個有效的Android虛擬設備名稱(要想知道系統擁有的Android虛擬設備名稱,執行emulator -list-avds即可),並為它分配一個埠。

$ adb kill-server$ emulator -avd Nexus_6_API_25 -port 5555$ adb devicesList of devices attached* daemon not running. starting it now on port 5037 ** daemon started successfully *

情形2: 在接下來的命令執行序列中,adb devices 顯示了設備列表信息,因為我們先啟動了adb服務端。

我們看到了執行adb devices命令的輸出中顯示了模擬器信息,因為停止adb服務端後就接著啟動了adb服務端,如下所示:

$ adb kill-server$ emulator -avd Nexus_6_API_25 -port 5557$ adb start-server$ adb devicesList of devices attachedemulator-5557 device

發送命令到指定設備

如果多個設備同時運行,在運行adb命令的時候你必須指定目標設備。制定到目標設備後,使用devices命令獲取目標設備的序列號。一旦獲取了序列號,使用adb命令的 -s 選項指定到序列號。如果要運行很多adb命令,可以設置 $ANDROID_SERIAL 環境變量進行替換。

$ adb devicesList of devices attachedemulator-5554 deviceemulator-5555 device$ adb -s emulator-5555 install helloWorld.apk

注意: 多個設備同時運行的時候,如果不指定目標設備, adb會產生一個錯誤。

如果有多個Android設備可用,但只有一個模擬器,那麼使用 -e 選項發送命令到模擬器;如果有多個模擬器,但只有一個設備,那麼使用 -d 選項命令到Android設備。

安裝App

使用adb命令在模擬器上安裝一個APK或者使用安裝命令install連接設備:

adb installpath_to_apk

開始變易APK的時候, 你可以使用 build it with Gradle 或者 build and install it with Android Studio.

設置埠轉發

你可以使用 forward 命令設置任意的埠轉發,但需要指定從主機埠到設備上不同埠的轉發請求 :

adb forward tcp:6100 tcp:7100

如下設置主機轉發埠6100到local:logd:

adb forward tcp:6100 local:logd

設備文件的導入導出

使用 pull 和 push 命令從設備導入導出文件,它們不像 install 命令, 只能導出APK文件到指定的位置:

adb pullremotelocal

導入文件或目錄到設備的命令格式:

adb pushlocalremote

從開發機導入文件到設備的實際操作如下:

adb push foo.txt /sdcard/foo.txt

停止adb服務端

在某些情況下,可能需要終止adb服務端進程,然後重啟才能解決問題。

停止adb服務端,使用 adb kill-server 命令,然後使用其他adb命令重啟服務端進程。

adb命令引用

可以從開發機命令行或者腳本發送adb命令,如下:

adb [-d | -e | -sserial_number]command

如果只有一個模擬器運行或者一個設備連接,adb命令會默認發送目標。如果多個模擬器同時運行或者多個設備連接,需要使用 -d, -e, 或者-s 選項指定目標設備。

通過adb help命令查看選項及命令,如下:~$ adb help

發送shell命令

可以通過adb發送shell命令,像下面這樣使用 shell 命令: 

adb [-d |-e | -sserial_number] shellshell_command

或者在設備上建立一個遠程shell:

adb [-d | -e | -sserial_number] shell

如果想退出遠程shell, 按 Control + D 或者 輸入 exit. 

shell命令的可執行文件存儲在設備文件系統/system/bin/中。

調用 activity manager (am)

在adb shell中, 可以使用activity manager工具發送命令執行各種各樣的系統動作。比如開始一個activity,強制停止一個進程,廣播一個Intent,改變設備屏幕屬性,等等。在shell中的語法是:

amcommand

你可以通過adb直接發送一個activity manager命令而不需要進入遠程shell,例如:

adb shell am start -a android.intent.action.VIEW

activity manager命令的使用。連上設備,使用如下命令查看:$ adb shell am

調用 package manager (pm)

在adbshell中,可以使用package manager工具發送命令執行動作或查詢安裝在設備上的app, 在shell中的語法是:

pmcommand

你可以通過adb直接發送一個package manager命令而不需要進入遠程shell,例如:

adb shell pm uninstall com.example.MyApp

package manager命令的使用。連上設備,使用如下命令查看:$ adb shell pm

獲取截圖

screencap命令用於獲取設備顯示屏幕截圖。 在shell中的語法是:

screencapfilename

輸入如下內容,從命令行截圖:

adb shell screencap /sdcard/screen.png

這裡又一個截取圖像的例子, 使用adb shell 從設備截圖並拷貝到本地:

$ adb shellshell@ $ screencap /sdcard/screen.pngshell@ $ exit$ adb pull /sdcard/screen.png

錄製視頻

screenrecord命令是一個社

screenrecord命令用於獲取設備視頻錄製,支持系統版本Android 4.4 (API level 19) 以上,錄製視頻格式為MP4.

注意: 在視頻文件中不包含音頻文件.

開發者可以錄製視頻作為宣傳使用,在shell中的語法是:

screenrecord [options]filename

adb shell screenrecord /sdcard/demo.mp4

按下Control + C停止視頻錄製, 否則錄製超過3分鐘才能自動停止,或者使用--time-limit選項設置時間限制。

錄製和獲取文件到本地的命令如下:

$ adb shellshell@ $ screenrecord --verbose /sdcard/demo.mp4(press Control + C to stop)shell@ $ exit$ adb pull /sdcard/demo.mp4

screenrecord實用工具可以錄製任何解析度和bit率的視頻,適配設備顯示的寬高比,最大時長為3分鐘。

在使用screenrecord實用工具時,要知道它的一些限制:

1、一些設備時無法錄製它原始顯示解析度的,如果出現了問題,試著降低錄製解析度。

2、在錄製的時候,不允許旋轉屏幕,否則錄製的視頻圖像會被截掉一部分。

screenrecord命令的使用。連上設備,使用如下命令查看:$ adb shell screenrecord

相關焦點

  • Android壓力測試Monkey工具
    最近在Android程序測試過程中接觸到了自動化測試方法,對其中的一些工具、方法和框架做了一些簡單的整理,其中包括android測試框架、CTS、Monkey、Monkeyrunner其它test tool等等。因接觸時間很短,很多地方有不足之處,希望能和大家多多交流和指點在這裡簡單對monkey做簡單的介紹吧。
  • 安卓開發測試小工具-adb
    adb的全稱為Android Debug Bridge,它是是Android SDK裡的一個輔助工具,PC可以通過adb工具對手機或模擬器進行各種操作,如安裝軟體、系統升級、運行shell命令等。守護進程:運行在 Android 設備上的 adb 後臺進程adb環境配置1、下載android sdk,具體自行百度下載。
  • Android測試 常用adb 命令總結
    針對移動端 Android 的測試, adb 命令是很重要的一個點,必須將常用的 adb 命令熟記於心, 將會為 Android 測試帶來很大的方便,其中很多命令將會用於自動化測試的腳本當中。Android Debug Bridgeadb 其實就是 Android Debug Bridge, Android 調試橋的縮寫,adb 是一個 C/S 架構的命令行工具,主要由 3 部分組成:運行在 PC 端的 Client : 可以通過它對 Android 應用進行安裝、卸載及調試Eclipse 中的 ADT、SDK Tools 目錄下的 DDMS
  • 【Android測試】ADB的初識和用法
    於是決定利用工作之餘的時間將Android測試相關知識進行一個整理,一來鞏固一下自己學到的東西;二來可以讓想學習Android測試的同學進行學習(希望能幫到新手)。  由於我之前學的是C++沒有學過Java,因此可能有些東西理解的有偏差,希望大家能批評指正。當然我會儘量用最淺顯的話講明白Android測試的。
  • 軟體測試進階:玩轉ADB之手機操作命令
    本文來自牛鷺學院學員:陳金金ADB是什麼Adb的全稱為Android Debug Bridge:android調試橋梁,下圖為Android官方對adb的介紹:可以看出,Android的初衷是用adb這樣的一個工具來協助開發人員在開發android應用的過程中更快更好的調試apk,因此adb具有安裝卸載apk、拷貝推送文件、查看設備硬體信息、查看應用程式佔用資源、在設備執行shell命令等功能。
  • 「irom安卓刷機教程第一篇」初識adb工具
    刷機的時候會看到很多名詞,比如adb、bl、rec、twrp等等。這個adb就是指的Android開發中的adb工具。adb很強大,下面我們來認識下。用adb可以直接操作管理android模擬器或者真實的android設備。如何使用Fastboot和ADB由於Fastboot和ADB是刷機中常用的兩個工具,所以一般在網上下載的adb工具是類似下圖這樣的文件結構。
  • Android 通過adb shell am broadcast發送廣播
    舉例:-e class com.android.phone.FIncomingCallTests#testRejectCall-r作用:以原始形式輸出測試結果。該選項通常是在性能測試時與-e perf true一起使用。
  • 【Android基礎學習一】Android 常用 adb 命令總結
    針對移動端 Android 的測試, adb 命令是很重要的一個點,必須將常用的 adb 命令熟記於心, 將會為 Android 測試帶來很大的方便
  • Android APP安全測試入門
    有句古語:」工欲善其事,必先利其器」,我們要研究App安全,沒有幾款高大上的神器是會非常麻煩的,因此本文主要給大家分享一下筆者學到的一些基礎知識,主要是一些移動端測試輔助工具的使用。模擬器模擬器筆者經常使用有兩款,一款是BlueStacks,這款個人感覺是做的非常不錯的,一般安裝操作App非常流暢,不會有卡死的情況。
  • 【Sobug漏洞時間】Android APP安全測試入門
    年初單位來了一位對App安全略有研究的小夥伴,某日閒來無事教了筆者幾招,分享給大家。有句古語:」工欲善其事,必先利其器」,我們要研究App安全,沒有幾款高大上的神器是會非常麻煩的,因此本文主要給大家分享一下筆者學到的一些基礎知識,主要是一些移動端測試輔助工具的使用。
  • 利器 | AppCrawler 自動遍歷測試工具實踐(一)
    春節宅在家保平安,正好利用整塊時間提升測試開發技能!
  • Android ADB實例分析
    扭起屁股得意洋洋最近,我負責的項目因為臨近量產,把之前的userdebug版本關閉,轉成了user版本,增加selinux的權限,大家都洋溢在項目準備量產的興奮和喜悅之中不能自拔誰知,好景不長,user版本發布之後,各種bug接踵而來,但是因為user版本權限的原因,我們之前保留在/data/logs/下面的日誌不能pull出來,定位問題非常困難不得不想到的解決方案
  • 安卓自動化之ADB操作
    對於 Android 端的自動化測試
  • 34個Android常用adbshell命令匯總
    調試Android程序有時需要adb shell命令,adb全稱Android Debug Bridge,就是起到調試橋的作用。通過adb我們可以在Eclipse中通過DDMS來調試Android程序,說白了就是debug工具。adb通過監聽Socket TCP 5554等埠讓IDE和Qemu通訊。默認情況下當我們運行Eclipse時adb進程就會自動運行。
  • adb 使用指北
    作為刷機黨,最經常見到的工具就是是 adb 了,但作為新人可能對這些工具比較陌生,今天就來科普下 adb 以及使用方法。谷歌的解釋ADB全稱為:Android 調試橋, 是一種功能多樣的命令行工具,可讓您與設備進行通信。
  • ADB工具包2020年最新版下載-TWRP-recovery界面使用adb sideload...
    經常有人想要最新版本的ADB工具包,ROM樂園整理了最新版ADB工具包,也叫ADB工具箱ADB工具包到底有什麼用途呢,簡單的說,我們可以通過ADB工具包,運行ADB命令來調試我們的安卓手機,當然了,你的手機必須開啟了USB調試並且成功被電腦識別。這裡必須安裝好手機驅動才可以,怎麼安裝驅動?
  • APP自動化測試系列之adb連接真機和模擬器
    今天距2021年101天這是ITester軟體測試小棧第160次推文
  • 必須掌握的ADB命令 | 讓你的測試事半功倍
    運行在Android設備的後臺進程>>>>  ADB的作用ADB的功能異常強大,在測試過程中合理的使用能夠達到事半功倍的效果。以下的章節,我們就來介紹下常用的adb命令。><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lvchongen.adbdemo" ><applicationandroid:allowBackup="true"android
  • ADB不乖?不,ADB需要調教!
    如果你是一個iOS測試工程師,或者你從來沒有碰過ADB,甚至沒有聽說過,那麼你應該先去了解一下這個調皮而又偉大的工具。它是Google出品的,為Android設備/模擬器和計算機之間搭建的一個調試橋梁。俗話說的好,「谷歌出品,必屬精品」。似乎ADB有時候一直在拆這句話的臺。那麼就讓我們一起來數一數ADB那些調皮的瞬間,並且一起來學習一下如何調教它吧。
  • 安卓測試常用的 ADB 命令大全,非常全!
    通過adb我們可以在Eclipse中方面通過DDMS來調試Android程序。藉助這個工具,我們可以管理設備或手機模擬器的狀態。2.安裝apk程序到模擬器則執行adb install android123.apk,這樣名為android123的安裝包就會安裝到Android模擬器中,前提是android123.apk文件需要放到SDK/Tools目錄下。