使用 Docker 執行 Android 模擬器

May 30, 2023

為了進行 Android App 的自動化測試,將好幾台手機的電池都弄到膨脹了。因此後來將一部分會讓手機負載比較重的測試轉移到 Android 模擬器上執行。

但是要安裝 Android SDK 與 Android 模擬器花費了我不少時間,所以打起了 Docker 的主意,是否能將 Android 模擬器暈做所需要的環境都包成 Image,這樣就可以降低部屬的複雜度。

好用的參考範例 - budtmo/docker-android

之前都是用自己做的 docker image ,可是那個版本在 Debug 上有一些不方便。

後來發現有人也有做類似的 image

GitHub - budtmo/docker-android: Android in docker solution with noVNC supported and video recording
Android in docker solution with noVNC supported and video recording - budtmo/docker-android
favicon
https://github.com/budtmo/docker-android
GitHub - budtmo/docker-android: Android in docker solution with noVNC supported and video recording

這個 image 使用 noVNC 來導出模擬器的畫面,但是我覺得很聰明的地方在於。大部分的 Image 都是使用 android emulator 本身自己的 VNC 功能( qemu 提供的),但是 emualtor 的 vnc 參數無法與 accel 同時使用

因此 budtmo/docker-android 用了另外一種方法,他使用 x11VNC 也就他並非是連到 emulator 本身,而是連到 container 內的桌面再去操作 emulator。這樣就可以同時使用 emulator 的 accel 功能,同時也能 noVNC 使用瀏覽器操作 emulator,讓 Debug 變得快速又方便

啟動指令

docker run --privileged \ -p 6080:6080 \ -p 5554:5554 \ -p 5555:5555 \ -e DEVICE="Nexus 5" \ -e AUTO_RECORD=false \ -e APPIUM=false \ --rm \ --name android-container \ budtmo/docker-android-x86-8.1

如果要增加 emulator 參數,可以使用

-e EMULATOR_ARGS="-skin 1080x1920"

連線到 container 內

docker exec -it android-container bash

基於 budtmo/docker-android 想改進的地方

  • 希望模擬器畫面可以不要有 Device 外框
  • 預設接受 keyboard 輸入
  • wm 是否可以直接 fullscreen ( 例如改用 i3 並且連 status bar 都不給 ? )
  • 除了 emulator、adb 與 VNC 之外,不要有其他的東西(例如 Appium 等)
  • swind/android-emulator

  • thedrhax-dockerfiles/android-sdk
  • thedrhax-dockerfiles/android-avd
  • budtmo/docker-android
  • 參考上面這些 Repository 設定檔所拼湊出來的版本

    Docker
    https://hub.docker.com/r/swind/android-emulator
    favicon
    https://hub.docker.com/r/swind/android-emulator

    主要功能

  • 讓 adb server 預設接受外部連線(預設的 adb server 只能從 127.0.0.1 連線)
  • 可以透過 noVNC 連線進去
  • emulator 預設接受外部鍵盤輸入
  • 使用方式

    建立一個 start.sh 檔案,方便啟動

    #!/bin/sh ANDROID_EMULATOR_EXTRA_ARGS="-skin 1080x1920 -memory 2048 -gpu host -no-boot-anim -qemu" ANDROID_AVD_EXTRA_ARGS="--device 8 --force" docker run --privileged -it -p 6080:6080 \ -e ANDROID_AVD_EXTRA_ARGS="${ANDROID_AVD_EXTRA_ARGS}" \ -e ANDROID_EMULATOR_EXTRA_ARGS="${ANDROID_EMULATOR_EXTRA_ARGS}" \ --name android-emulator --rm $1

    之後如果要啟動 android 26 的版本只需要下

    ./start.sh swind/android-emulator:android_26

    之後就可以連到 http://localhost:6080 透過 VNC 操作 emulator 了

    參考資料

    Google 官方的 docker emulator container scripts

    GitHub - google/android-emulator-container-scripts
    Contribute to google/android-emulator-container-scripts development by creating an account on GitHub.
    favicon
    https://github.com/google/android-emulator-container-scripts
    GitHub - google/android-emulator-container-scripts
    MyDockerfiles/android-emulator at master · Swind/MyDockerfiles
    My Dockerfiles. Contribute to Swind/MyDockerfiles development by creating an account on GitHub.
    favicon
    https://github.com/Swind/MyDockerfiles/tree/master/android-emulator
    MyDockerfiles/android-emulator at master · Swind/MyDockerfiles
    ← Go home