一文吃透ADB,從入門到精通

目錄

  • 一、ADB 簡介
    • 1.1 什么是 ADB
    • 1.2 ADB 的工作原理
    • 1.3 ADB 的安裝與環境配置
  • 二、ADB 基礎命令
    • 2.1 設備連接相關命令
    • 2.2 應用管理命令
    • 2.3 文件傳輸命令
  • 三、ADB 高級命令
    • 3.1 ADB Shell 深入探究
    • 3.2 日志查看與分析
    • 3.3 設備信息獲取
    • 3.4 屏幕操作與錄制
  • 四、ADB 常見問題與解決方案
    • 4.1 端口被占用問題
    • 4.2 設備無法識別問題
  • 五、ADB 實戰案例
    • 5.1 自動化測試腳本編寫
    • 5.2 設備批量管理
  • 六、總結與展望


一、ADB 簡介

1.1 什么是 ADB

ADB,即 Android Debug Bridge,是 Android 開發工具包(SDK)中的一個通用調試工具,也是連接 Android 設備與計算機之間的橋梁,它允許開發者在計算機上通過命令行對 Android 設備進行各種操作和管理,極大地提高了開發和調試的效率。

在 Android 應用開發過程中,ADB 發揮著舉足輕重的作用。例如,在開發階段,開發者需要頻繁地將開發好的應用程序安裝到 Android 設備上進行測試。使用 ADB 的安裝命令,只需簡單的操作,就能快速將應用安裝到設備中,大大節省了時間。當應用出現問題時,開發者可以通過 ADB 獲取設備的日志信息,從而深入分析應用的運行狀態,定位問題所在。

除了應用開發,ADB 在設備管理方面也有著廣泛的應用。比如,在設備測試過程中,測試人員可以利用 ADB 對設備進行各種設置和操作,模擬不同的使用場景,全面測試設備的性能和穩定性。對于一些需要對 Android 設備進行定制化開發的用戶,ADB 更是不可或缺的工具,通過它可以對設備的系統文件進行修改和替換,實現個性化的定制需求。

1.2 ADB 的工作原理

ADB 采用客戶端 - 服務器(C/S)架構,主要由三部分組成:客戶端(Client)、服務端(Server)和守護進程(Daemon,即 adbd)。

  • 客戶端運行在開發機器(如電腦)上,負責發送 adb 命令。當你在命令行中輸入一個 ADB 命令時,首先啟動的就是客戶端,它會解析命令參數,并將命令發送給服務端。比如,當你執行 “adb devices” 命令來查看連接的設備時,客戶端會將這個命令請求發送出去。
  • 服務端也運行在開發機器上,作為一個后臺進程,主要負責管理客戶端和守護進程之間的通信。它會監聽特定的端口(默認是 5037),等待客戶端的連接請求。同時,服務端還會檢測 USB 端口,感知設備的連接和拔除,以及模擬器實例的啟動或停止。當服務端接收到客戶端的命令請求后,會將其轉發給相應的守護進程。
  • 守護進程運行在 Android 設備(真機或模擬器)上,負責接收并執行來自服務端的命令。它在設備啟動時就已經運行,隨時準備處理命令請求。當守護進程接收到服務端轉發的命令后,會在設備上執行相應的操作,并將執行結果返回給服務端,最后服務端再將結果返回給客戶端,這樣你就能在命令行中看到命令的執行結果了。

1.3 ADB 的安裝與環境配置

ADB 是 Android SDK 的一部分,通常包含在 SDK Platform-Tools 中。下面分別介紹在 Windows、MacOS 和 Linux 系統下安裝 ADB 并配置環境變量的步驟。
Windows 系統

  1. 下載 Android SDK Platform Tools:訪問Android 開發者官網,在 “下載” 一欄中選擇 “下載適用于 Windows 的 SDK Platform-Tools”,點擊直接下載,得到一個壓縮包。
  2. 解壓縮文件:將下載的壓縮包解壓到你選擇的目錄,例如 “C:\adb” ,注意解壓路徑最好不要包含中文,以免出現不必要的麻煩。
  3. 配置環境變量:右鍵點擊 “此電腦”,選擇 “屬性”;在彈出的窗口中點擊 “高級系統設置”;在 “系統變量” 中找到 “Path” 項,選中并點擊 “編輯”;點擊 “新建”,輸入 ADB 解壓目錄的路徑(例如 “C:\adb\platform-tools”),然后點擊 “確定” 保存設置。
  4. 驗證安裝:按下 Win + R 鍵打開運行窗口,輸入 “cmd” 打開命令提示符,在命令提示符中輸入 “adb version” ,如果安裝成功,你將看到 ADB 的版本信息。

MacOS 系統

  1. 下載 Android SDK Platform Tools:前往 Android 開發者官網,下載適用于 macOS 的 Platform Tools 壓縮包。
  2. 解壓縮文件:將下載的壓縮包解壓到你選擇的目錄,例如 “~/adb” 。
  3. 配置環境變量:打開終端,編輯 “~/.bash_profile” 或 “~/.zshrc” 文件(如果你使用的是 zsh shell)。在文件中添加以下行:export PATH=$PATH:~/adb/platform-tools ,保存文件后,運行source ~/.bash_profile或source ~/.zshrc使更改生效。
  4. 驗證安裝:在終端中輸入 “adb version”,如果能看到 ADB 的版本信息,說明安裝成功。

Linux 系統

  1. 使用包管理器安裝(適用于大多數發行版)
    • Debian/Ubuntu 系統:打開終端,輸入以下命令安裝 ADB 和 Fastboot 工具:
sudo apt update
sudo apt install android-tools-adb android-tools-fastboot
  • Fedora 系統:在終端中執行命令:
sudo dnf install android-tools
  • Arch Linux 系統:使用以下命令安裝:
sudo pacman -S android-tools
  1. 驗證安裝:在終端中輸入 “adb version”,若出現 ADB 的版本信息,則安裝成功。

二、ADB 基礎命令

2.1 設備連接相關命令

在使用 ADB 進行設備操作前,首先需要確保設備與計算機成功連接。下面介紹一些常用的設備連接相關命令。

  • 查看連接設備列表:使用adb devices命令可以查看當前連接到計算機的所有 Android 設備和模擬器。例如,在命令行中輸入adb devices,如果設備連接正常,會顯示設備的序列號和設備狀態,如下所示:
$ adb devices
List of devices attached
emulator-5554 device

上述輸出中,emulator-5554是設備的序列號,device表示設備處于正常連接狀態。如果設備未連接或連接異常,可能會顯示no devices/emulators found或設備狀態為offline。

  • 解決設備連接異常:如果遇到設備連接異常的情況,可以嘗試以下幾種方法:
    • 檢查設備和 USB 連接:確保設備已開啟,并且 USB 數據線連接正常,沒有松動或損壞。同時,檢查設備的開發者選項中是否已開啟 USB 調試模式。
    • 重啟 ADB 服務:在命令行中執行adb kill-server命令關閉 ADB 服務,然后再執行adb start-server命令重新啟動 ADB 服務,之后再次嘗試連接設備。
    • 檢查 ADB 驅動:如果設備驅動未正確安裝,可能會導致連接問題。可以在設備制造商的官方網站上下載并安裝對應的 ADB 驅動程序。例如,華為手機需要安裝華為手機助手,小米手機需要安裝小米助手等,這些助手軟件會自動安裝相應的驅動。
  • 無線連接與斷開連接:除了使用 USB 連接設備外,ADB 還支持通過無線網絡連接設備,這在某些場景下非常方便,比如設備沒有 USB 接口或者需要遠程操作設備時。
    • 無線連接設備:首先,確保設備和計算機處于同一個局域網內。然后,通過 USB 線將設備連接到計算機,在命令行中執行adb tcpip 5555命令,讓設備在 5555 端口監聽 TCP/IP 連接(5555 是默認端口,也可以指定其他端口)。接著,斷開 USB 連接,找到設備的 IP 地址(可以在設備的設置 - 關于手機 - 狀態信息中查看),最后在命令行中執行adb connect <device-ip-address>:5555命令,使用 IP 地址將設備與計算機連接。例如:
$ adb tcpip 5555
restarting in TCP mode port: 5555
$ adb connect 192.168.1.100:5555
connected to 192.168.1.100:5555
  • 斷開無線連接:當不需要無線連接設備時,可以使用adb disconnect <device-ip-address>命令斷開連接。例如:
$ adb disconnect 192.168.1.100
disconnected 192.168.1.100

2.2 應用管理命令

ADB 提供了一系列命令來管理設備上的應用程序,包括安裝、卸載和查看應用列表等操作。

  • 安裝應用:使用adb install命令可以將本地的 APK 文件安裝到設備上。基本語法為adb install <path_to_apk>,其中<path_to_apk>是 APK 文件在本地的路徑。例如,要安裝位于C:\apk\app.apk的應用,可以在命令行中輸入:
$ adb install C:\apk\app.apk

在安裝應用時,還可以使用一些參數來控制安裝行為:

  • 覆蓋安裝:如果設備上已經安裝了同名應用,想要覆蓋安裝,可以使用-r參數,即adb install -r <path_to_apk>。例如:
$ adb install -r C:\apk\app.apk
  • 安裝到 SD 卡:默認情況下,應用會安裝到設備的內部存儲中。如果想要將應用安裝到 SD 卡上,可以使用-s參數,即adb install -s <path_to_apk>。不過,有些設備可能不支持將應用安裝到 SD 卡,或者應用本身不允許安裝到 SD 卡。例如:
$ adb install -s C:\apk\app.apk
  • 卸載應用:使用adb uninstall命令可以卸載設備上的應用。基本語法為adb uninstall <package_name>,其中<package_name>是應用的包名。例如,要卸載包名為com.example.app的應用,可以在命令行中輸入:
$ adb uninstall com.example.app

如果想要卸載應用但保留其數據和緩存文件,可以使用-k參數,即adb uninstall -k <package_name>。例如:

$ adb uninstall -k com.example.app
  • 查看應用列表:使用adb shell pm list packages命令可以查看設備上安裝的所有應用的包名。例如:
$ adb shell pm list packages
package:com.android.smoketest
package:com.example.android.livecubes
package:com.android.providers.telephony

如果只想查看系統應用,可以使用-s參數,即adb shell pm list packages -s;如果只想查看第三方應用,可以使用-3參數,即adb shell pm list packages -3。例如:

$ adb shell pm list packages -s # 查看系統應用
$ adb shell pm list packages -3 # 查看第三方應用

此外,還可以通過管道符|和grep命令來過濾特定的應用包名。例如,要查看包名中包含example的應用,可以輸入:

$ adb shell pm list packages | grep example
package:com.example.android.livecubes

2.3 文件傳輸命令

ADB 還支持在計算機和設備之間進行文件傳輸,方便開發者將文件復制到設備上進行測試,或者從設備上獲取文件進行分析。

  • 從電腦傳文件到設備:使用adb push命令可以將本地文件或文件夾復制到設備上。基本語法為adb push <local_path> <remote_path>,其中<local_path>是本地文件或文件夾的路徑,<remote_path>是設備上的目標路徑。例如,要將本地的C:\data\test.txt文件復制到設備的/sdcard/目錄下,可以在命令行中輸入:
$ adb push C:\data\test.txt /sdcard/

如果要復制整個文件夾,同樣可以使用adb push命令,例如將本地的C:\data文件夾復制到設備的/sdcard/目錄下:

$ adb push C:\data /sdcard/

在使用adb push命令時,需要注意目標路徑在設備上必須存在,否則會報錯。如果目標路徑不存在,可以先使用adb shell mkdir命令在設備上創建相應的目錄。

  • 從設備傳文件到電腦:使用adb pull命令可以將設備上的文件或文件夾復制到本地計算機上。基本語法為adb pull <remote_path> <local_path>,其中<remote_path>是設備上文件或文件夾的路徑,<local_path>是本地的目標路徑。例如,要將設備上/sdcard/test.txt文件復制到本地的D:\backup目錄下,可以在命令行中輸入:
$ adb pull /sdcard/test.txt D:\backup

同樣,如果要復制設備上的整個文件夾,也可以使用adb pull命令 。例如,將設備上的/sdcard/data文件夾復制到本地的D:\backup目錄下:

$ adb pull /sdcard/data D:\backup

在使用adb pull命令時,需要確保本地目標路徑存在,并且有足夠的空間來存儲從設備復制過來的文件。

三、ADB 高級命令

3.1 ADB Shell 深入探究

adb shell 命令是 ADB 中一個非常強大且常用的命令,它允許開發者進入 Android 設備的命令行環境,就像在設備上直接操作 Linux 系統一樣。通過這個命令,開發者可以執行各種 Linux 命令,對設備進行深入的管理和調試。

進入設備命令行非常簡單,只需在命令行中輸入 adb shell ,即可進入設備的命令行界面。例如:

$ adb shell
generic_x86:/ $

進入命令行后,就可以執行各種 Linux 命令了。比如,查看當前運行的進程,可以使用 ps 命令,它會列出設備上正在運行的所有進程的信息,包括進程的 ID、名稱、運行用戶等。例如:

generic_x86:/ $ ps
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
root     1     0     9728   748    c001196c 00010654 S /init
root     2     0     0      0      c001249c 00000000 S kthreadd
root     3     2     0      0      c001249c 00000000 S ksoftirqd/0

在文件操作方面,ls 命令用于列出目錄下的文件和子目錄,cd 命令用于切換目錄,mkdir 命令用于創建目錄,rm 命令用于刪除文件或目錄等。比如,要查看設備 /sdcard 目錄下的文件和目錄,可以先使用 cd 命令切換到該目錄,再使用 ls 命令查看:

generic_x86:/ $ cd /sdcard
generic_x86:/sdcard $ ls
Android  DCIM  Download  Movies  Music  Pictures  Podcasts  Ringtones

如果要在 /sdcard 目錄下創建一個名為 test 的新目錄,可以使用 mkdir 命令:

generic_x86:/sdcard $ mkdir test

若要刪除剛才創建的 test 目錄(假設該目錄為空),則可以使用 rmdir 命令:

generic_x86:/sdcard $ rmdir test

除了這些基本的文件操作命令,還可以使用 cp 命令復制文件,mv 命令移動文件或重命名文件等。這些命令在設備的文件管理和調試過程中非常實用,能夠幫助開發者快速地對設備上的文件進行操作和管理。

3.2 日志查看與分析

在 Android 開發和調試過程中,查看設備的日志信息是非常重要的一項工作。通過日志,開發者可以了解應用程序的運行狀態,排查問題,優化性能等。ADB 提供了 adb logcat 命令來查看設備的實時日志。

使用 adb logcat 命令可以直接查看設備的實時日志輸出,例如:

$ adb logcat

這樣會輸出大量的日志信息,其中包含了系統、應用程序等各種來源的日志,在實際使用中,通常需要對日志進行過濾,以便快速找到有用的信息。

通過不同參數可以對日志進行靈活過濾。按日志級別過濾是一種常見的方式,Android 系統定義了多種日志級別,從低到高分別為 VERBOSE (明細)、DEBUG (調試)、INFO (信息)、WARN (警告)、ERROR (錯誤)、FATAL (嚴重錯誤)、SILENT (無記載)。要查看特定級別的日志,可以在命令中指定日志級別,例如,只查看 ERROR 級別的日志,可以使用以下命令:

$ adb logcat *:E

這里的 * 表示所有標簽,E 表示 ERROR 級別,即輸出所有標簽的 ERROR 級別及以上的日志。

按標簽過濾也是常用的方法,標簽是與日志消息關聯的字符串,用于標識消息的來源。比如,某個應用在日志輸出時使用了 MyApp 作為標簽,要查看該應用的日志,就可以使用 -s 選項來過濾特定標簽的日志,命令如下:

$ adb logcat -s MyApp

還可以同時使用多種過濾條件進行組合過濾。例如,要查看標簽為 MyApp 且日志級別為 WARN 或 ERROR 的日志,可以使用以下命令:

$ adb logcat -s MyApp level:W level:E

在日志格式設置方面,adb logcat 提供了 -v 選項來設置日志的輸出格式,可選的格式包括 brief (簡要格式)、process (包含進程信息)、tag (突出標簽)、thread (包含線程信息)、raw (原始格式)、time (包含時間信息)、threadtime (包含線程和時間信息)和 long (詳細格式)。例如,要以包含時間信息的格式輸出日志,可以使用:

$ adb logcat -v time

當日志緩存積累過多,影響查看和分析時,可以使用 adb logcat -c 命令清空日志緩存,以便重新開始記錄日志 。這在調試過程中,特別是在多次運行應用程序并查看日志時非常有用,可以避免舊日志的干擾。

3.3 設備信息獲取

使用 ADB 可以方便地獲取設備的各種硬件和軟件屬性信息,這對于了解設備的配置、性能以及進行兼容性測試等都非常有幫助。

通過 adb shell getprop 命令可以獲取設備的系統屬性信息,例如,獲取設備型號,可以使用以下命令:

$ adb shell getprop ro.product.model

執行上述命令后,會返回設備的型號,如 Xiaomi MI 10。

獲取 Android 系統版本可以使用:

$ adb shell getprop ro.build.version.release

該命令會返回系統版本號,比如 11 。

要獲取 CPU 信息,可以使用 adb shell cat /proc/cpuinfo 命令,它會輸出詳細的 CPU 信息,包括處理器型號、核心數、頻率等。例如:

$ adb shell cat /proc/cpuinfo
Processor       : ARMv8 Processor rev 4 (v8l)
processor       : 0
BogoMIPS        : 199.20
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4processor       : 1
BogoMIPS        : 199.20
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

從輸出中可以看到,該設備使用的是 ARMv8 架構的處理器,有兩個核心等信息。除了上述信息,還可以獲取設備的制造商、屏幕分辨率、電池狀態等各種屬性信息,通過不同的命令組合可以全面了解設備的情況。

3.4 屏幕操作與錄制

在一些測試和演示場景中,需要對設備的屏幕進行操作和錄制,ADB 提供了相應的命令來實現這些功能。

屏幕截圖命令為 adb shell screencap ,使用該命令可以對設備屏幕進行截圖。例如,將截圖保存到設備的 /sdcard 目錄下,命名為 screenshot.png ,可以使用以下命令:

$ adb shell screencap -p /sdcard/screenshot.png

這里的 -p 參數表示將截圖保存為 PNG 格式。如果不指定保存路徑和文件名,截圖會輸出到標準輸出流中,可以通過管道將其保存到本地文件。例如,在 Windows 系統中,可以使用以下命令將截圖保存到本地的 C:\screenshot.png 文件:

$ adb shell screencap -p | sed 's/\r$//' > C:\screenshot.png

其中 sed ‘s/\r$//’ 是為了去除 Windows 系統下換行符的差異。

錄制屏幕視頻命令為 adb shell screenrecord ,它可以將設備屏幕的操作過程錄制為視頻。基本語法為 adb shell screenrecord [options] <filename> ,其中 <filename> 是視頻文件的保存路徑和文件名,默認保存為 MP4 格式。例如,錄制一段視頻并保存到設備的 /sdcard 目錄下,命名為 demo.mp4 ,可以使用:

$ adb shell screenrecord /sdcard/demo.mp4

在錄制時,還可以設置一些參數來控制錄制效果。例如,使用 --time-limit 參數可以限制錄制時間,單位為秒。要錄制一段 10 秒的視頻,可以使用:

$ adb shell screenrecord --time-limit 10 /sdcard/demo.mp4

使用 --size 參數可以指定視頻的分辨率,例如,要錄制分辨率為 1280x720 的視頻,可以使用:

$ adb shell screenrecord --size 1280x720 /sdcard/demo.mp4

–bit-rate 參數用于指定視頻的比特率,單位為比特每秒,默認值為 4Mbps 。如果要指定比特率為 6Mbps,可以使用:

$ adb shell screenrecord --bit-rate 6000000 /sdcard/demo.mp4

通過這些屏幕操作和錄制命令,可以方便地獲取設備屏幕的截圖和錄制視頻,為應用開發、測試和演示提供了有力的支持。

四、ADB 常見問題與解決方案

4.1 端口被占用問題

ADB 默認使用 5037 端口與設備進行通信,在開發過程中,有時會遇到 5037 端口被占用的情況,導致 ADB 無法正常工作,出現如 “adb server version doesn’t match this client; killing…”“error: could not install smartsocket listener: cannot bind to 127.0.0.1:5037: 通常每個套接字地址 (協議 / 網絡地址 / 端口) 只允許使用一次。(10048)” 等錯誤提示。

造成 5037 端口被占用的原因主要有兩種。一種是由于 ADB 服務沒有正常關閉,導致舊的 ADB 服務進程仍然占用著端口,當下次啟動 ADB 服務時,就會出現端口沖突。另一種情況是其他程序占用了這個端口,比如一些虛擬機軟件、Docker、Genymotion 等,它們在運行時可能會占用 5037 端口。

為了解決端口被占用的問題,首先可以使用命令查找占用該端口的進程。在 Windows 系統中,打開命令提示符,輸入netstat -aon|findstr 5037 ,該命令會列出所有與 5037 端口相關的網絡連接信息,其中 “LISTENING” 狀態的進程就是占用 5037 端口的進程,其對應的最后一列數字就是進程 ID(PID)。例如:

C:\Users\test>netstat -aon|findstr 5037
TCP    127.0.0.1:5037         0.0.0.0:0              LISTENING       3676

這里的 3676 就是占用 5037 端口的進程 ID。

查找到占用端口的進程 ID 后,就可以使用taskkill命令來結束該進程。例如,要結束進程 ID 為 3676 的進程,可以在命令提示符中輸入taskkill /pid 3676 /f ,其中/f參數表示強制結束進程。執行該命令后,再重新啟動 ADB 服務,看端口占用問題是否解決。

如果不想查找并結束占用端口的進程,也可以通過修改 ADB 服務端口來解決沖突。在系統環境變量中添加ANDROID_ADB_SERVER_PORT變量,值為自定義的端口號(建議選擇一個 5 位數的端口號,如 10000 - 65535 之間的數字,以降低與其他程序沖突的概率)。在 Windows 系統中,打開 “系統屬性” - “高級” - “環境變量”,在 “系統變量” 中點擊 “新建”,輸入變量名ANDROID_ADB_SERVER_PORT ,變量值為自定義端口號,如 5038 ,然后點擊 “確定” 保存設置。設置完成后,重啟 ADB 服務,ADB 就會使用新設置的端口進行通信。

4.2 設備無法識別問題

在使用 ADB 時,設備無法識別是一個常見的問題,可能由多種原因導致。

首先,USB 調試未開啟是導致設備無法識別的常見原因之一。在 Android 設備上,需要手動開啟 USB 調試模式才能與計算機進行連接和通信。開啟方法是進入設備的 “設置” - “關于手機” ,在 “軟件信息” 中連續點擊 “版本號” 多次,即可激活開發者選項。然后返回 “設置”,進入 “開發者選項”,找到并開啟 “USB 調試” 選項。

驅動未安裝或安裝不正確也會導致設備無法識別。不同的設備廠商需要安裝對應的 ADB 驅動程序。例如,華為手機需要安裝華為手機助手,小米手機需要安裝小米助手等,這些助手軟件會自動安裝相應的驅動。如果驅動安裝不正確,可以在設備制造商的官方網站上下載最新的驅動程序,然后手動安裝。在 Windows 系統中,可以通過設備管理器來更新驅動程序。右鍵點擊設備管理器中顯示異常的設備(通常帶有黃色感嘆號),選擇 “更新驅動程序”,然后按照提示選擇下載好的驅動程序文件進行安裝。

授權問題也可能導致設備無法識別。在首次連接設備時,設備上會彈出一個對話框,詢問是否信任該計算機,需要點擊 “允許” 以授權。如果不小心點擊了 “拒絕”,或者沒有彈出授權對話框,可以在設備的設置中找到 “撤銷 USB 調試授權” 選項,點擊后重新連接設備,再次進行授權操作。

此外,USB 接口故障也可能是原因之一。可以嘗試更換不同的 USB 端口或 USB 線纜,確保設備與計算機之間的物理連接正常。有時,計算機的 USB 接口供電不足也會導致設備連接不穩定或無法識別,可以嘗試將設備連接到計算機的后置 USB 接口(通常供電更穩定),或者使用帶有獨立供電的 USB 集線器來連接設備。

五、ADB 實戰案例

5.1 自動化測試腳本編寫

在移動應用開發中,自動化測試是保證應用質量和穩定性的重要手段,通過編寫 ADB 腳本,能夠實現一系列自動化測試任務,大幅提高測試效率。以 Python 語言結合 ADB 命令編寫自動化測試腳本為例,實現對應用的安裝、啟動、模擬用戶操作以及獲取測試結果等操作。

首先,安裝subprocess庫,它是 Python 的標準庫,用于創建子進程,并連接到子進程的輸入 / 輸出 / 錯誤管道,從而實現與子進程的交互,在自動化測試腳本中,主要用它來執行 ADB 命令。以下是一個基本的自動化測試腳本框架:

import subprocessdef run_adb_command(command):"""執行ADB命令并返回結果"""result = subprocess.run(command, shell=True, capture_output=True, text=True)return result.stdout# 列出連接的設備
devices = run_adb_command('adb devices')
print("已連接的設備:")
print(devices)

上述代碼定義了run_adb_command函數,用于執行 ADB 命令并返回命令輸出結果。通過調用該函數執行adb devices命令,獲取連接的設備信息并打印輸出。

在實際測試中,常需要安裝應用程序。假設 APK 文件路徑為/path/to/your/app.apk,可通過以下代碼實現應用安裝:

# 安裝APK
apk_path = '/path/to/your/app.apk'
install_output = run_adb_command(f'adb install {apk_path}')
print("安裝輸出:")
print(install_output)

這里通過run_adb_command函數執行adb install命令,實現 APK 文件的安裝,并打印安裝過程的輸出信息,以便查看安裝是否成功。

應用安裝完成后,啟動應用是下一步測試操作。需指定應用的包名和活動名,假設包名是com.example.yourapp,活動名是com.example.yourapp.MainActivity,啟動應用的代碼如下:

# 啟動應用
package_name = 'com.example.yourapp'
activity_name = 'com.example.yourapp.MainActivity'
start_output = run_adb_command(f'adb shell am start -n {package_name}/{activity_name}')
print("啟動應用輸出:")
print(start_output)

這段代碼利用adb shell am start命令,根據指定的包名和活動名啟動應用,并輸出啟動過程的相關信息。

為使自動化測試更具靈活性,可結合循環和條件語句。例如,在一系列測試操作完成后,需要判斷應用是否正常運行,可通過檢查應用的進程是否存在來實現:

# 檢查應用是否在運行
check_output = run_adb_command(f'adb shell ps | grep {package_name}')
if check_output:print(f"{package_name}正在運行")
else:print(f"{package_name}未運行")

上述代碼通過執行adb shell ps | grep {package_name}命令,查看應用進程是否存在。若命令輸出結果不為空,則表示應用正在運行;反之,則表示應用未運行。

在模擬用戶操作方面,比如模擬點擊屏幕上的某個坐標位置,可使用adb shell input tap命令。假設要點擊的坐標為 (500, 500),代碼如下:

# 模擬點擊操作
click_output = run_adb_command('adb shell input tap 500 500')

此代碼執行adb shell input tap命令,模擬在屏幕坐標 (500, 500) 處進行點擊操作。

在測試過程中,獲取測試結果并記錄是非常重要的環節。可以將測試結果寫入文件,生成測試報告。以下是一個簡單的寫入測試報告的函數:

def write_report(output):"""將輸出寫入報告文件"""with open('test_report.txt', 'w') as f:f.write(output)# 寫入測試報告
report_output = f"""設備信息:\n{devices}
安裝輸出:\n{install_output}
啟動應用輸出:\n{start_output}
點擊操作輸出:\n{click_output}
應用運行檢查結果: {"正在運行" if check_output else "未運行"}
"""
write_report(report_output)

write_report函數接收測試結果信息作為參數,使用with open語句以寫入模式打開test_report.txt文件,并將測試結果寫入文件中。最后,將各個測試環節的輸出信息整合,調用write_report函數生成測試報告。

5.2 設備批量管理

在實際開發和測試場景中,經常會遇到需要同時管理多個 Android 設備的情況,如在進行兼容性測試時,需要在不同型號、不同系統版本的設備上安裝和測試應用程序。利用 ADB 命令,可以方便地對多設備進行批量操作。

使用adb devices命令查看當前連接的所有設備,獲取設備列表。命令執行后,會返回一個設備列表,其中包含每個設備的序列號和設備狀態。例如:

$ adb devices
List of devices attached
device1_serial_number device
device2_serial_number device
device3_serial_number device

這里的device1_serial_number、device2_serial_number、device3_serial_number分別是不同設備的序列號,通過這些序列號,可以對每個設備進行單獨操作。

批量安裝應用是常見的多設備管理需求。假設有一個 APK 文件,需要安裝到所有連接的設備上。在 Windows 系統中,可以使用以下批處理腳本實現:

@echo off
set apk_path=D:\app.apk
for /f "tokens=1" %%i in ('adb devices ^| findstr device$ ^| awk "{print $1}"') do (adb -s %%i install %apk_path%
)

上述腳本中,set apk_path=D:\app.apk設置了要安裝的 APK 文件路徑。for /f循環通過adb devices命令獲取設備序列號,然后使用adb -s %%i install %apk_path%命令,針對每個設備序列號%%i,安裝指定路徑的 APK 文件。

在 Linux 或 macOS 系統中,可以使用 Shell 腳本實現類似功能:

#!/bin/bash
apk_path="/Users/yourname/app.apk"
for device in $(adb devices | grep 'device$' | awk '{print $1}'); doadb -s $device install $apk_path
done

此 Shell 腳本同樣先設置 APK 文件路徑,然后通過for循環遍歷adb devices命令獲取的設備序列號,對每個設備執行安裝命令。

獲取設備信息在設備管理和兼容性測試中也非常重要。通過編寫腳本,可以批量獲取所有連接設備的信息,如設備型號、系統版本等。以 Python 腳本為例:

import subprocessdef run_adb_command(command):result = subprocess.run(command, shell=True, capture_output=True, text=True)return result.stdoutdef get_device_info(device_serial):device_model = run_adb_command(f'adb -s {device_serial} shell getprop ro.product.model')android_version = run_adb_command(f'adb -s {device_serial} shell getprop ro.build.version.release')return device_model.strip(), android_version.strip()devices = run_adb_command('adb devices')
for line in devices.splitlines()[1:]:if 'device' in line:device_serial = line.split()[0]model, version = get_device_info(device_serial)print(f"設備序列號: {device_serial}, 設備型號: {model}, Android版本: {version}")

上述 Python 腳本定義了run_adb_command函數用于執行 ADB 命令,get_device_info函數用于獲取指定設備的型號和系統版本信息。通過遍歷adb devices命令獲取的設備列表,對每個設備調用get_device_info函數獲取信息并打印輸出。

在多設備連接的情況下,還可以對設備執行相同的測試任務。例如,要在所有設備上啟動某個應用程序,可以編寫如下腳本:

import subprocessdef run_adb_command(command):result = subprocess.run(command, shell=True, capture_output=True, text=True)return result.stdoutpackage_name = 'com.example.yourapp'
activity_name = 'com.example.yourapp.MainActivity'devices = run_adb_command('adb devices')
for line in devices.splitlines()[1:]:if 'device' in line:device_serial = line.split()[0]start_command = f'adb -s {device_serial} shell am start -n {package_name}/{activity_name}'run_adb_command(start_command)

此腳本先定義了要啟動的應用包名和活動名,然后遍歷連接的設備列表,針對每個設備執行啟動應用的 ADB 命令,從而實現多設備同時啟動同一應用的功能。

六、總結與展望

ADB 作為 Android 開發和設備管理的核心工具,以其豐富多樣的命令和強大實用的功能,貫穿于 Android 應用開發、測試以及設備管理的各個環節,發揮著不可替代的關鍵作用。從基礎的設備連接與應用管理,到高級的日志分析、設備信息獲取以及屏幕操作,ADB 為開發者和測試人員提供了高效便捷的手段,極大地提升了工作效率和開發質量。

通過本文,我們詳細學習了 ADB 的基礎和高級命令,涵蓋設備連接、應用管理、文件傳輸、日志查看、設備信息獲取、屏幕操作與錄制等多個方面,還探討了常見問題的解決方案,并通過實戰案例展示了 ADB 在自動化測試腳本編寫和設備批量管理中的實際應用。這些知識和技能,對于從事 Android 相關工作的人員來說,是必備且極具價值的。

然而,ADB 的功能遠不止于此,其在 Android 開發、測試、設備管理等領域還有更多高級應用等待我們去深入探索和挖掘。例如,在自動化測試中,可以進一步結合其他測試工具和框架,實現更加復雜和全面的測試場景;在設備管理方面,可以利用 ADB 與腳本語言的結合,實現設備的自動化配置和管理,提高管理效率和準確性。

希望讀者能夠以本文為基礎,不斷深入學習和實踐 ADB 的應用,將其靈活運用到實際工作中,充分發揮 ADB 的強大功能,為 Android 開發和設備管理工作帶來更多的便利和創新。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85245.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PostgreSQL高可用架構設計與實踐指南

# PostgreSQL高可用架構設計與實踐指南 ## 一、高可用性核心訴求 PostgreSQL作為企業級關系型數據庫&#xff0c;高可用設計需要滿足以下關鍵指標&#xff1a; - 故障恢復時間&#xff08;RTO&#xff09;&#xff1a;秒級到分鐘級自動切換能力 - 數據損失容忍度&#xff0…

今天我想清楚了

首先說一聲抱歉&#xff0c;很多天沒有更新了&#xff0c;因為在我這里&#xff0c;我的內心感到迷茫&#xff0c;從來沒有這樣過&#xff0c;不知道為什么自己一直要做的事&#xff0c;進度太慢了&#xff0c;因為我的人生是空虛的&#xff0c;我感覺我做的不夠好&#xff0c;…

代碼隨想錄day3鏈表1

new關鍵字 1.new是一個關鍵字&#xff0c;用于開辟空間&#xff0c;開辟的空間在堆上&#xff0c;而一般聲明的變量存放在棧上&#xff1b; 2.new得到的是一段空間的首地址。所以一般需要用指針來存放這段地址 new int(10);//返回new出來這塊內存的地址int *pnew int(10);//…

taro小程序如何實現新用戶引導功能?

一、需求背景 1、需要實現小程序新功能引導 2、不使用第三方庫&#xff08;第三方組件試了幾個&#xff0c;都是各種兼容性問題&#xff0c;放棄&#xff09; 二、實現步驟 1、寫一個公共的guide組件&#xff0c;代碼如下 components/Guide/index.tsx文件 import React, { …

鍵盤動作可視化技術淺析:如何做到低延遲顯示

在做屏幕錄制或者操作演示的時候&#xff0c;你是否遇到過這樣的問題&#xff1a;觀眾看不清你按了哪個鍵、點了哪里&#xff1f;這是能完美解決這個問題的小工具Keyviz。它可以把你的鍵盤輸入和鼠標點擊實時顯示在屏幕上&#xff0c;清晰直觀&#xff0c;特別適合教學、錄屏、…

Prufer序列 學習筆記

文章目錄 P r u f e r Prufer Prufer 序列對樹建立 P r u f e r Prufer Prufer 序列對 P r u f e r Prufer Prufer 序列重建樹 應用Cayley 公式[HNOI2004] 樹的計數「雅禮集訓 2017 Day8」共[THUPC 2018] 城市地鐵規劃CF156D Clues[ARC106F] Figures P r u f e r Prufer Pruf…

高性能場景使用Protocol Buffers/Apache Avro進行序列化怎么實現呢

我們以Protocol Buffers&#xff08;Protobuf&#xff09;和Apache Avro為例&#xff0c;分別展示高性能序列化的實現方式。 由于兩者都需要定義Schema&#xff0c;然后生成代碼&#xff0c;因此步驟包括&#xff1a; 1. 定義Schema文件 2. 使用工具生成Java類 3. 在代碼中…

iOS端網頁調試 debug proxy策略:項目中的工具協同實踐

移動開發中的調試&#xff0c;一直是效率瓶頸之一。特別是當前 Web 前端與 App 原生高度耦合的背景下&#xff0c;頁面調試不僅受限于瀏覽器&#xff0c;還要面對 WebView 實現差異、系統權限控制、設備多樣性等復雜情況。 但我們是否可以構建一套**“設備無關”的調試工作流*…

springboot項目啟動報錯:spring boot application in default package

啟動類報錯&#xff1a; 問題&#xff1a; springboot的啟動方法不能直接在java目錄下 解決&#xff1a; 1.使用CompentScan 和EnableAutoConfiguration注解 2.啟動類放在java目錄下的package目錄下

機器學習實驗報告5-K-means 算法

4.1 k-means算法簡介 聚類分析&#xff0c;作為機器學習領域中的一種無監督學習方法&#xff0c;在數據探索與知識發現過程中扮演著舉足輕重的角色。它能夠在沒有先驗知識或標簽信息的情況下&#xff0c;通過挖掘數據中的內在結構和規律&#xff0c;將數據對象自動劃分為多個類…

【已解決】yoloOnnx git工程部署

首先 yoloonnx一個VS工程下來整個工程大概1-2個g的大小因此在git的過程中總是會因為文件超過100M而觸發報錯&#xff0c;上傳不上去&#xff0c;因此現在需要做一個過濾才能把工程重新上傳上去&#xff0c;那么這個時候別人需要下載下來的時候確實不完整的工程&#xff0c;因此…

如何輕松地將照片從電腦傳輸到安卓手機

一些安卓用戶正在尋找有效可靠的方法&#xff0c;將照片從電腦傳輸到安卓設備。如果您也想將有趣或難忘的照片導入安卓手機或平板電腦&#xff0c;可以參考這篇文章&#xff0c;它提供了 6 種可靠的方法&#xff0c;讓您輕松傳輸照片。 第 1 部分&#xff1a;如何通過 Android …

準備純血鴻蒙理論高級認證的一些心得

最近在準備純血鴻蒙理論高級認證&#xff0c;一些心得記錄下來&#xff0c;希望早日考過高級&#xff01; 一、考試目標&#xff1a; HarmonyOS核心技術理念HarmonyOS應用架構設計ArkTS原理和實踐ArkUI開發HarmonyOS關鍵技術能力開發工程管理、代碼編輯、調試與定位應用上架運…

義烏購拍立淘API接入指南

一、接口概述 拍立淘是義烏購平臺提供的以圖搜貨服務&#xff0c;通過HTTP RESTful API實現。當前版本為v3.2&#xff0c;支持JPG/PNG格式圖片&#xff08;≤5MB&#xff09;&#xff0c;返回相似商品列表及供應鏈信息。 二、接入準備 申請開發者賬號 # 開發者注冊示例&…

Web 連接和跟蹤

大家讀完覺得有幫助記得及時關注和點贊&#xff01;&#xff01;&#xff01; 抽象 網絡跟蹤是一種普遍且不透明的做法&#xff0c;可實現個性化廣告、重新定位和轉化跟蹤。 隨著時間的推移&#xff0c;它已經演變成一個復雜的侵入性生態系統&#xff0c;采用越來越復雜的技術來…

前端技術棧與 SpreadJS 深度融合:打造高效數據表格應用

引言 在當今數字化的時代&#xff0c;數據表格應用在各種 Web 項目中扮演著至關重要的角色。從企業級的管理系統到電商平臺的商品展示&#xff0c;數據表格都是用戶與數據交互的重要界面。前端技術棧如 JavaScript、HTML 和 CSS 為構建用戶界面提供了強大的工具和方法&#xf…

如何用ai描述缺陷(bug)

附件1&#xff1a; 附件2&#xff1a; 將附件1和附件2發送給deepseek&#xff0c;且輸入對話框的文字&#xff1a; 然后進入禪道用戶登錄 - 禪道 ### **缺陷報告&#xff1a;登錄功能無響應缺陷** **提交平臺**&#xff1a;禪道缺陷管理系統 **發現環境**&#xff1a;測試環…

軟考 系統架構設計師系列知識點之雜項集萃(89)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;88&#xff09; 第161題 下面可提供安全電子郵件服務的是&#xff08; &#xff09;。 A. RSA B. SSL C. SET D. S/MIME 正確答案&#xff1a;D。 解析&#xff1a; MIME&#xff08;Multi…

開源 Arkts 鴻蒙應用 開發(一)工程文件分析

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

protobuf遇到protoc-gen-go: unable to determine Go import path for “xxx“

問題 這個錯誤是因為 .proto 文件中缺少必需的 go_package 選項。在 protobuf 生成 Go 代碼時&#xff0c;這是關鍵配置項。 pandaVM:~/dev/pb$ protoc --go_out. pb.proto protoc-gen-go: unable to determine Go import path for "pb.proto"Please specify eithe…