持續集成環境下的 Android 模擬器

實如今持續集成環境中爲您的應用運行測試的能力,是確保產品質量的重要一步。然而,經過建立鏡像來爲持續集成計算機從新建立穩定的環境是一個頗具挑戰性的任務。做爲應對挑戰的第一步,您可使用預構建容器或腳本爲 Linux 建立 Docker 鏡像。在本文中,我將會向您闡述如何使用預構建容器,以及腳本都作了哪些工做。html

Android 模擬器的 Docker 預構建

如今,藉助咱們提供的預構建 Android 模擬器容器,在持續集成 (CI) 或者持續部署 (CD) 環境中設置和運行 Android 模擬器變得較以往輕鬆了許多。這些容器能夠幫您在運行正確版本的模擬器的同時,避免出現使人頭疼的依賴管理問題;同時也能幫您輕易地將自動測試整合爲 CI 或 CD 系統的一部分,從而免除物理設備農場所需的開銷。android

以前,咱們發佈了一篇博客: Android 模擬器的下載與 Docker 鏡像生成腳本 來幫助開發者簡化遠程模擬器的部署與調試。這些腳本能夠簡化尋找正確系統鏡像、管理系統依賴的以及運行 Android 模擬器的過程。nginx

如今,咱們正更進一步,在爲模擬器的每一個主要發佈版本都提供預構建的 Android 模擬器容器。這些容器無需運行生成腳本,從而節約了時間,並下降了複雜度。預構建容器還支持 Docker 腳本所提供的全部功能,如 adbweb 訪問。git

Linux KVM 是運行這些容器的必要條件,您能夠在裸機或者具備嵌套虛擬化環境的虛擬機中啓用這一功能。至於哪種方案更好取決於您的雲服務提供商,您能夠查看此 文檔 來獲取推薦列表。github

下面的腳本展現瞭如何集成 Android 模擬器容器到您的系統,以及如何使用它們運行測試:web

#!/bin/bash

# 這是咱們將要運行的遠程鏡像。
# 若是須要的話,Docker 會爲咱們獲取它。
DOCKER_IMAGE=us-docker.pkg.dev/android-emulator-268719/images/r-google-x64:30.0.23

# 這是轉發端口。端口號較大是爲了不
# 影響 adb 掃描模擬器的能力。
PORT=15555

# 這段會在後臺啓動容器。
container_id=$(docker run -d \
  -e "ADBKEY=$(cat ~/.android/adbkey)" --device /dev/kvm --publish \
  8554:8554/tcp --publish $PORT:5555/tcp  \
  $DOCKER_IMAGE)

echo "The container is running with id: $container_id"

# 注意您可能看到像下面這樣的信息:
# 鏈接 localhost:15555 失敗
# 這僅僅是表示容器還沒有準備就緒。

echo "Connecting to forwarded adb port."
adb connect localhost:$PORT

# 咱們基本上必須等待 `docker ps` 向咱們展現健康度。
# 因爲模擬器的啓動須要時間,因此這一過程可能要稍等一下子。
echo "Waiting until the device is ready"
adb wait-for-device

# 設備如今已經啓動,或將要被啓動。
# 咱們只須要等到 sys.boot_completed 屬性被設置爲 1 便可。
while [ "`adb shell getprop sys.boot_completed | tr -d '\r' `" != "1" ] ;
do
  echo "Still waiting for boot.."
  sleep 1;
done

# 如今您能夠像平時同樣使用模擬器了,例如:

# ./gradlew installDebug
# ./gradlew connectedAndroidTest

# 等等

echo "The device is ready"
echo "Run the following command to stop the container:"
echo "docker stop ${container_id}"

您能夠閱讀 README 來進一步獲取有關入門和利用 Android 模擬器容器的信息。這是咱們第一次提供預構建模擬器容器,如有任何使用上的問題或功能上的需求,請在 issue tracker 上向咱們反饋。docker

容器腳本細節

Github 倉庫 google/android-emulator-container-scripts 中包含了咱們 Docker 平臺上的 Android 模擬器方案的內部工做原理。這個腳本目前僅適用於 Linux,並且須要可以訪問 KVM 的管理員權限。它是一組包含下列使用 emu-docker 命令功能的最小腳本:shell

  • emu-docker list: 查詢已發佈的兼容 Docker 的系統鏡像,以及模擬器引擎的二進制文件,並顯示它們的下載連接。這裏提供了一個動態生成的、包含全部處於穩定和 Canary 版本的已發佈系統鏡像和模擬器的列表,此列表使用的數據與 SDK 管理器中描述模擬器和系統映像版本的數據相同,所以該列表始終是最新的;
    * [emu-docker create <emulator-zip> <systemimage-zip> — dest docker-src-dir(getcwd()/src by default): 爲特定的系統鏡像和模擬器建立自定義本地 Docker 鏡像;
  • docker run -e ADBKEY=」$(cat ~/.android/adbkey)」 — device /dev/kvm — publish 8554:8554/tcp — publish 5555:5555/tcp <docker-image-id>: 使用端口 8854 (用於 gRPC) 與 5555 (用於 ADB 通信) 啓動與 <docker-image-id> 相關的模擬器和系統鏡像 (可使用 adb connect localhost:5555 啓用 ADB 訪問);
  • emu-docker interactive — start: 交互式提示,其中列出了有關獲取 Docker 鏡像列表以及下載、建立、啓動 Docker 鏡像的步驟。

與 Docker 實例交互

在您建立和啓動 Docker 實例以後,可使用兩種方式與其進行交互: 使用 ADB 或者經過 WebRTC 進行基於遠程數據流的交互。下面是這些方式的詳細描述:瀏覽器

ADB

使用 ADB 可讓 logcat 與 shell 可以訪問完整的 ADB 命令,您只須要 adb connect localhost:5555 便可 (若有須要,能夠把 5555 替換爲須要的 ADB 端口)。bash

經過 WebRTC 進行基於遠程數據流的交互

咱們提供了一套包含 EnvoyNginxToken Service 和模擬器容器的 docker-compose 配置,以暴露出 WebRTC/gRPC 端口用於同模擬器進行交互。在建立了模擬器容器,執行完步驟以後,包含 create_web_container.sh 的腳本會在本地捕獲建立容器和生成加密傳輸用的密鑰的過程。在建立 web 容器以後,docker-compose -f js/docker/docker-compose.yaml up 或 docker-compose -f js/docker/docker-compose.yaml -f js/docker/development.yaml up (用於同時進行 ADB 訪問) 可用於啓動和協調全部內容。默認狀況下,這些操做會在本地計算機的 80 端口上暴露可交互的模擬器,因此理論上使用瀏覽器指向 localhost 應該就能夠與模擬器進行交互了。

請經過 Github issue tracker 向咱們反饋問題。您可能還會對 使用新的 Android 模擬工具進行持續測試 這一內容感興趣,這篇文章提供了更多相關的背景知識。

相關文章
相關標籤/搜索