
如今,借助我們預(yù)先構(gòu)建好的 Android 模擬器容器,在持續(xù)集成和交付系統(tǒng) (CI/CD) 上設(shè)置以及運(yùn)行 Android 模擬器比以往任何時候都容易。這些容器可以讓您輕松找到并運(yùn)行正確版本的模擬器,而不必再因?yàn)橐蕾嚬芾矶^疼。其同時也讓持續(xù)集成和交付系統(tǒng)增加自動化測試變得更為簡單,而且不用擔(dān)心維護(hù)大量實(shí)體設(shè)備所產(chǎn)生的花銷。
去年的早些時候,我們發(fā)布了 Android 模擬器下載以及 Docker 鏡像生成的腳本 來幫助開發(fā)者部署和調(diào)試遠(yuǎn)程模擬器。這些腳本簡化了尋找正確版本的系統(tǒng)鏡像、管理系統(tǒng)依賴以及運(yùn)行 Android 模擬器的流程。
如今,我們決定更進(jìn)一步,來實(shí)驗(yàn)性地為每一個重大模擬器更新發(fā)布提供預(yù)先構(gòu)建好的 Android 模擬器容器。這些容器不再需要您手動地運(yùn)行生成器,既節(jié)省時間,也降低了復(fù)雜度。不用擔(dān)心,這些預(yù)先構(gòu)建好的容器依然支持用 Docker 腳本構(gòu)建的容器的所有功能,比如 adb 和 web 可訪問性。
想要運(yùn)行這些容器,Linux KVM 是必需的,可以通過在裸機(jī)或者支持嵌套虛擬化的虛擬機(jī)上運(yùn)行來啟動 Linux KVM。選擇哪種方式取決于您的云計(jì)算提供商,請參閱我們的 文檔 獲取建議。
以下腳本說明了如何將 Android 模擬器容器集成到您的系統(tǒng)中,并且使用其運(yùn)行測試。
#!/bin/bash
# 這個是我們將要運(yùn)行的遠(yuǎn)程鏡像
# 如果需要,Docker 會幫我們獲取該鏡像
DOCKER_IMAGE=us-docker.pkg.dev/android-emulator-268719/images/r-google-x64:30.0.23
# 這個是轉(zhuǎn)發(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"
# 注意,您可能會碰到如下信息:
# failed to connect to localhost: 15555
# 這只不過表明容器還沒有準(zhǔn)備好
echo "Connecting to forwarded adb port."
adb connect localhost:$PORT
# 我們不得不等到 `docker ps` 顯示為正常。
# 這一過程可能需要一段時間因?yàn)槟M器需要完全啟動!
echo "Waiting until the device is ready"
adb wait-for-device
# 現(xiàn)在這個設(shè)備正在啟動,或者接近啟動完成。
# 我們只等 sys.boot_completed 的值被設(shè)置為1。
while [ "`adb shell getprop sys.boot_completed | tr -d '\r' `" != "1" ] ;
do
echo "Still waiting for boot.."
sleep 1;
done
# 現(xiàn)在你可以正常地使用模擬器了,舉個例子:
# ./gradlew installDebug
# ./gradlew connectedAndroidTest
# 等等
echo "The device is ready"
echo "Run the following command to stop the container:"
echo "docker stop ${container_id}"
Android 模擬器容器的鏡像拉取、運(yùn)行以及端口轉(zhuǎn)發(fā)的示例腳本
想要了解更多關(guān)于 Android 模擬器容器的信息,請查閱 README。這是我們首次提供預(yù)先構(gòu)建好的模擬器容器,所以如果您在使用的過程中發(fā)現(xiàn)任何問題或功能請求,請通過 issue tracker 告知我們。