實現在持續(xù)集成環(huán)境中為您的應用運行測試的能力罪郊,是確保產品質量的重要一步。然而建丧,通過創(chuàng)建鏡像來為持續(xù)集成計算機重新創(chuàng)建穩(wěn)定的環(huán)境是一個頗具挑戰(zhàn)性的任務排龄。作為應對挑戰(zhàn)的第一步,您可以使用預構建容器或腳本為 Linux 創(chuàng)建 Docker 鏡像。在本文中橄维,我將會向您闡述如何使用預構建容器尺铣,以及腳本都做了哪些工作。
Android 模擬器的 Docker 預構建
現在争舞,借助我們提供的預構建 Android 模擬器容器凛忿,在持續(xù)集成 (CI) 或者持續(xù)部署 (CD) 環(huán)境中設置和運行 Android 模擬器變得較以往輕松了許多废离。這些容器可以幫您在運行正確版本的模擬器的同時兔港,避免出現令人頭疼的依賴管理問題概耻;同時也能幫您輕易地將自動測試整合為 CI 或 CD 系統(tǒng)的一部分眯勾,從而免除物理設備農場所需的開銷。
之前画恰,我們發(fā)布了一篇博客: Android 模擬器的下載與 Docker 鏡像生成腳本 來幫助開發(fā)者簡化遠程模擬器的部署與調試财喳。這些腳本可以簡化尋找正確系統(tǒng)鏡像侄榴、管理系統(tǒng)依賴的以及運行 Android 模擬器的過程遭贸。
現在戈咳,我們正更進一步,在為模擬器的每個主要發(fā)布版本都提供預構建的 Android 模擬器容器壕吹。這些容器無需運行生成腳本著蛙,從而節(jié)約了時間,并降低了復雜度耳贬。預構建容器還支持 Docker 腳本所提供的所有功能踏堡,如 adb 與 web 訪問。
Linux KVM 是運行這些容器的必要條件咒劲,您可以在裸機或者具有嵌套虛擬化環(huán)境的虛擬機中啟用這一功能顷蟆。至于哪一種方案更好取決于您的云服務提供商,您可以查看此 文檔 來獲取推薦列表缎患。
下面的腳本展示了如何集成 Android 模擬器容器到您的系統(tǒng)慕的,以及如何使用它們運行測試:
#!/bin/bash
# 這是我們將要運行的遠程鏡像。
# 如果需要的話挤渔,Docker 會為我們獲取它。
DOCKER_IMAGE=us-docker.pkg.dev/android-emulator-268719/images/r-google-x64:30.0.23
# 這是轉發(fā)端口风题。端口號較大是為了避免
# 影響 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 上向我們反饋成榜。
容器腳本細節(jié)
Github 倉庫 google/android-emulator-container-scripts 中包含了我們 Docker 平臺上的 Android 模擬器方案的內部工作原理。這個腳本目前僅適用于 Linux蹦玫,而且需要能夠訪問 KVM 的管理員權限赎婚。它是一組包含下列使用 emu-docker 命令功能的最小腳本:
-
emu-docker list
: 查詢已發(fā)布的兼容 Docker 的系統(tǒng)鏡像,以及模擬器引擎的二進制文件樱溉,并顯示它們的下載鏈接挣输。這里提供了一個動態(tài)生成的、包含所有處于穩(wěn)定和 Canary 版本的已發(fā)布系統(tǒng)鏡像和模擬器的列表福贞,此列表使用的數據與 SDK 管理器中描述模擬器和系統(tǒng)映像版本的數據相同歧焦,因此該列表始終是最新的;
*[emu-docker create <emulator-zip> <systemimage-zip> — dest docker-src-dir(getcwd()/src by default)
: 為特定的系統(tǒng)鏡像和模擬器創(chuàng)建自定義本地 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> 相關的模擬器和系統(tǒng)鏡像 (可以使用adb connect localhost:5555
啟用 ADB 訪問)绢馍; -
emu-docker interactive — start
: 交互式提示,其中列出了有關獲取 Docker 鏡像列表以及下載肠套、創(chuàng)建舰涌、啟動 Docker 鏡像的步驟。
與 Docker 實例交互
在您創(chuàng)建和啟動 Docker 實例之后你稚,可以使用兩種方式與其進行交互: 使用 ADB 或者通過 WebRTC 進行基于遠程數據流的交互瓷耙。下面是這些方式的詳細描述:
ADB
使用 ADB 可以讓 logcat 與 shell 能夠訪問完整的 ADB 命令,您只需要 adb connect localhost:5555 即可 (如有需要刁赖,可以把 5555 替換為需要的 ADB 端口)搁痛。
通過 WebRTC 進行基于遠程數據流的交互
我們提供了一套包含 Envoy、Nginx宇弛、Token Service 和模擬器容器的 docker-compose 配置鸡典,以暴露出 WebRTC/gRPC 端口用于同模擬器進行交互。在創(chuàng)建了模擬器容器枪芒,執(zhí)行完步驟之后彻况,包含 create_web_container.sh
的腳本會在本地捕獲創(chuàng)建容器和生成加密傳輸用的密鑰的過程。在創(chuàng)建 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 訪問) 可用于啟動和協(xié)調所有內容纽甘。默認情況下,這些操作會在本地計算機的 80 端口上暴露可交互的模擬器抽碌,所以理論上使用瀏覽器指向 localhost 應該就可以與模擬器進行交互了悍赢。
請通過 Github issue tracker 向我們反饋問題。您可能還會對 使用新的 Android 模擬工具進行持續(xù)測試 這一內容感興趣,這篇文章提供了更多相關的背景知識左权。