持續(xù)集成環(huán)境下的 Android 模擬器

image

實現在持續(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 腳本所提供的所有功能踏堡,如 adbweb 訪問。

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 進行基于遠程數據流的交互

我們提供了一套包含 EnvoyNginx宇弛、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.yamlup (用于同時進行 ADB 訪問) 可用于啟動和協(xié)調所有內容纽甘。默認情況下,這些操作會在本地計算機的 80 端口上暴露可交互的模擬器抽碌,所以理論上使用瀏覽器指向 localhost 應該就可以與模擬器進行交互了悍赢。

image

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

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末皮胡,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子涮总,更是在濱河造成了極大的恐慌胸囱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑梗,死亡現場離奇詭異烹笔,居然都是意外死亡,警方通過查閱死者的電腦和手機抛丽,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門谤职,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亿鲜,你說我怎么就攤上這事允蜈。” “怎么了蒿柳?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵饶套,是天一觀的道長。 經常有香客問我垒探,道長妓蛮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任圾叼,我火速辦了婚禮蛤克,結果婚禮上,老公的妹妹穿的比我還像新娘夷蚊。我一直安慰自己构挤,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布惕鼓。 她就那樣靜靜地躺著筋现,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呜笑。 梳的紋絲不亂的頭發(fā)上夫否,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音叫胁,去河邊找鬼。 笑死汞幢,一個胖子當著我的面吹牛驼鹅,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼输钩,長吁一口氣:“原來是場噩夢啊……” “哼豺型!你這毒婦竟也來了?” 一聲冷哼從身側響起买乃,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤姻氨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剪验,有當地人在樹林里發(fā)現了一具尸體肴焊,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年功戚,在試婚紗的時候發(fā)現自己被綠了娶眷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡啸臀,死狀恐怖届宠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情乘粒,我是刑警寧澤豌注,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站灯萍,受9級特大地震影響轧铁,放射性物質發(fā)生泄漏。R本人自食惡果不足惜竟稳,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一属桦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧他爸,春花似錦聂宾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讨跟,卻和暖如春纪他,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晾匠。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工茶袒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凉馆。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓薪寓,卻偏偏與公主長得像亡资,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子向叉,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容