发布于 2026-01-06 0 阅读
0

构建用于 Android 测试的轻量级 Docker 容器

构建用于 Android 测试的轻量级 Docker 容器

测试有助于我们发现开发过程中可能出现的任何缺陷或错误。但这需要时间和资源,尤其是在 Android 平台上,它需要安装许多依赖项,并且需要一台设备才能执行 UI 测试。

通过使用 Docker 容器,我们可以构建和运行多个功能分支的测试,从而加快开发速度并提高生产力。

在本教程中,我们将学习如何构建一个轻量级的 Android 容器来隔离测试过程。

  • 无需Android Studio/GUI应用程序。

  • Android模拟器运行在Docker容器中。

  • 能够缓存依赖项以供后续构建。

  • 流程结束后,将所有物品清理干净。

1. 启动 Docker 容器

我们构建所基于的镜像为:ubuntu:latest

假设您已安装 Docker(如果没有,请点击此链接),您可以运行以下命令启动 Docker 容器:

$ docker run --privileged -dit --name android-container ubuntu
Enter fullscreen mode Exit fullscreen mode
  • privileged:授予在容器上启动虚拟机的权限。

  • it:以交互方式执行 shell 命令。

  • d:在后台运行容器。

  • name android-container: 容器名称,稍后将用于附加和提交 Docker 镜像。

(可选)要以非 root 用户身份运行 Docker,最简单的方法是将当前用户添加到 Docker 用户组。

$ sudo groupadd docker // Add group docker if it doesn't already exist
$ sudo gpasswd -a $USER docker // Add current user to group docker
$ newgrp docker // reload (or you can re-login to reload)
$ docker run hello-world // check if it works
Enter fullscreen mode Exit fullscreen mode

2. 安装 SDK 包

先决条件

请确保安装以下依赖项。否则,在安装 Android SDK 或启动模拟器时,您可能会注意到“没有这样的文件或目录”的错误。

请仔细检查冗余依赖项。🙇(例如:vim——如果您不喜欢它)

$ apt update && apt install -y openjdk-8-jdk vim git unzip libglu1 libpulse-dev libasound2 libc6  libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxi6  libxtst6 libnss3 wget
Enter fullscreen mode Exit fullscreen mode

Gradle

安装gradle并运行gradle-wrapper。本教程将使用版本号5.4.1。别担心,以后可以更新到更高版本build-arg😊

下载gradle-5.4.1/tmp/gradle-5.4.1解压缩内容/opt/gradle

$ wget https://services.gradle.org/distributions/gradle-5.4.1-bin.zip -P /tmp \
&& unzip -d /opt/gradle /tmp/gradle-5.4.1-bin.zip 
Enter fullscreen mode Exit fullscreen mode

新建一个目录/opt/gradlew并将文件安装gradle-wrapper到该目录中。(目录名称可以随意,但务必将文件保存在易于查找的位置。)

$ mkdir /opt/gradlew \
&& /opt/gradle/gradle-5.4.1/bin/gradle wrapper --gradle-version 5.4.1 --distribution-type all -p /opt/gradlew \
&& /opt/gradle/gradle-5.4.1/bin/gradle wrapper -p /opt/gradlew
Enter fullscreen mode Exit fullscreen mode

Android SDK

您需要手动下载不包含 Android Studio 的 SDK,仅下载 SDK 工具,请点击此处链接获取下载链接。

就像 Gradle 一样,我们会将其保存/tmp并提取出来。/opt

$ wget 'https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip' -P /tmp \
&& unzip -d /opt/android /tmp/sdk-tools-linux-4333796.zip \
Enter fullscreen mode Exit fullscreen mode

Android 软件开发工具包 (SDK) 包含多个组件,包括 SDK 工具、构建工具和平台工具。SDK 工具主要包括原生 Android 模拟器、层级视图器SDK 管理器ProGuard。构建工具主要包括 aapt(用于创建 .APK 文件的 Android 打包工具)和 dx(用于将 .java 文件转换为 .dex 文件的 Android 工具)。平台工具包括Android 调试 shellsqlite3Systrace

最重要的软件包是platform-toolstoolsemulator。运行以下命令可快速安装它们:

$ yes Y | /opt/android/tools/bin/sdkmanager --install "platform-tools" "system-images;android-*28*;google_apis;x86" "platforms;android-28" "build-tools;28.0.3" "emulator"
Enter fullscreen mode Exit fullscreen mode
  • platform-tools包含adb

  • tools包含avdmanagersdkamanager

  • emulator运行模拟器

  • system-images;android-*28*;google_apis;x86用于创建 AVD

接受 Android SDK 的所有许可协议

$ yes Y | /opt/android/tools/bin/sdkmanager --licenses
Enter fullscreen mode Exit fullscreen mode

看起来不错,现在创建一个AVDtest

$ echo "no" | /opt/android/tools/bin/avdmanager --verbose create avd --force --name "test" --device "pixel" --package "system-images;android-28;google_apis;x86" --tag "google_apis" --abi "x86"
Enter fullscreen mode Exit fullscreen mode
  • — 名称:设备名称。

  • — abi:CPU架构。

  • — 标签google_api:支持 Google API。

再检查一遍看看是否有效!

$ /opt/android/emulator/emulator -list-avds 
# Expected Result: test
Enter fullscreen mode Exit fullscreen mode

3. 设置环境变量

编辑.bashrc您熟悉的任何配置文件:

  • GRADLE_HOME=/opt/gradle/gradle-5.4.1

  • ANDROID_HOME =/opt/android

  • PATH= $ PATH :$ GRADLE_HOME /bin:/opt/gradlew:$ ANDROID_HOME /emulator:$ ANDROID_HOME /tools/bin:$ ANDROID_HOME /platform-tools

  • LD_LIBRARY_PATH=$ANDROID_HOME /emulator/lib64:$ ANDROID_HOME /emulator/lib64/qt/lib

然后反映这些变化source ~/.bashrc

注意:PATH变量的顺序很重要,因为Android提供了两个可执行文件emulator,一个打包在`/etc/android/`/android/emulator中,另一个位于`/etc/android/`中/android/tools/bin。我们将使用/android/emulator`/etc/android/`来运行Android设备。

更多详情请见这篇SO 回答

4. 运行模拟器

以下是运行模拟器之前的一些简单步骤:

  • 使用 ADB 停止所有正在运行的模拟器。

  • -no-window使用标志在后台启动模拟器-gpu off

  • 关闭动画效果以避免测试不稳定。

有些测试用例会对在小屏幕上可能不可见的视图执行操作——因此我们将模拟器设置为高分辨率(1440x2880)。

function wait_emulator_to_be_ready() {
  adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done
  emulator -avd test -no-audio -no-boot-anim -no-window -accel on -gpu off -skin 1440x2880 &

boot_completed=false
  while [ "$boot_completed" == false ]; do
    status=$(adb wait-for-device shell getprop sys.boot_completed | tr -d '\r')
    echo "Boot Status: $status"

    if [ "$status" == "1" ]; then
      boot_completed=true
    else
      sleep 1
    fi
  done
}

function disable_animation() {
  adb shell "settings put global window_animation_scale 0.0"
  adb shell "settings put global transition_animation_scale 0.0"
  adb shell "settings put global animator_duration_scale 0.0"
}

wait_emulator_to_be_ready
sleep 1
disable_animation
Enter fullscreen mode Exit fullscreen mode

start.sh使用 sh或 启动模拟器./start.sh,并等待直到Boot Status: 1设备完全加载并可以使用为止。

按回车键再次检查bg,查看后台作业。

$ ./start.sh
emulator: WARNING: Your AVD has been configured with an in-guest renderer, but the system image does not support guest rendering.Falling back to 'swiftshader_indirect' mode.
WARNING: change of renderer detected.
checkValid: hw configs not eq
emulator: Cold boot: different AVD configuration
Your emulator is out of date, please update by launching Android Studio:
 - Start Android Studio
 - Select menu "Tools > Android > SDK Manager"
 - Click "SDK Tools" tab
 - Check "Android Emulator" checkbox
 - Click "OK"

Boot Status: 
Boot Status: 
Boot Status: 
Boot Status: 
Boot Status: 
Boot Status: 
Boot Status: 
Boot Status: 
Boot Status: 
Boot Status: 1
emulator: INFO: boot completed
emulator: INFO: boot time 13200 ms
emulator: Increasing screen off timeout, logcat buffer size to 2M.
emulator: Revoking microphone permissions for Google App.
Enter fullscreen mode Exit fullscreen mode

检查正在运行的模拟器

$ adb devices
List of devices attached
emulator-5554   device
Enter fullscreen mode Exit fullscreen mode

我们已经成功在容器中运行了安卓模拟器!

5. 构建 Docker 镜像

打开一个新的终端标签页,停止android-container并提交更改,以创建一个新的 Docker 镜像:

$ docker stop android-container && docker commit android-container android-container:v1
Enter fullscreen mode Exit fullscreen mode

再测试一次:

$ docker images
# Expected result: REPOSITORY          TAG
                   android-container   v1
Enter fullscreen mode Exit fullscreen mode

为了进一步扩展更多配置(例如:Flutter),让我们总结并最终确定以下内容。Dockerfile

FROM ubuntu

LABEL maintainer "codecaigicungduoc@gmail"

WORKDIR /

SHELL ["/bin/bash", "-c"]

RUN apt update && apt install -y openjdk-8-jdk vim git unzip libglu1 libpulse-dev libasound2 libc6  libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxi6  libxtst6 libnss3 wget

ARG GRADLE_VERSION=5.4.1
ARG ANDROID_API_LEVEL=28
ARG ANDROID_BUILD_TOOLS_LEVEL=28.0.3
ARG EMULATOR_NAME='test'

RUN wget https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip -P /tmp \
&& unzip -d /opt/gradle /tmp/gradle-${GRADLE_VERSION}-bin.zip \
&& mkdir /opt/gradlew \
&& /opt/gradle/gradle-${GRADLE_VERSION}/bin/gradle wrapper --gradle-version ${GRADLE_VERSION} --distribution-type all -p /opt/gradlew  \
&& /opt/gradle/gradle-${GRADLE_VERSION}/bin/gradle wrapper -p /opt/gradlew

RUN wget 'https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip' -P /tmp \
&& unzip -d /opt/android /tmp/sdk-tools-linux-4333796.zip \
&& yes Y | /opt/android/tools/bin/sdkmanager --install "platform-tools" "system-images;android-${ANDROID_API_LEVEL};google_apis;x86" "platforms;android-${ANDROID_API_LEVEL}" "build-tools;${ANDROID_BUILD_TOOLS_LEVEL}" "emulator" \
&& yes Y | /opt/android/tools/bin/sdkmanager --licenses \
&& echo "no" | /opt/android/tools/bin/avdmanager --verbose create avd --force --name "test" --device "pixel" --package "system-images;android-${ANDROID_API_LEVEL};google_apis;x86" --tag "google_apis" --abi "x86"

ENV GRADLE_HOME=/opt/gradle/gradle-$GRADLE_VERSION \
ANDROID_HOME=/opt/android
ENV PATH "$PATH:$GRADLE_HOME/bin:/opt/gradlew:$ANDROID_HOME/emulator:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
ENV LD_LIBRARY_PATH "$ANDROID_HOME/emulator/lib64:$ANDROID_HOME/emulator/lib64/qt/lib"

ADD start.sh /

RUN chmod +x start.sh
Enter fullscreen mode Exit fullscreen mode

6. 构建项目并运行测试

检查您的项目配置,并使用适当的参数构建 ocker 镜像:

$ docker build \
--build-arg GRADLE_VERSION=5.4.1 \
--build-arg ANDROID_API_LEVEL=28 \
--build-arg ANDROID_BUILD_TOOLS_LEVEL=28.0.3 \
--build-arg EMULATOR_NAME=test \
-t android-container .
Enter fullscreen mode Exit fullscreen mode

进入项目目录的根目录并运行:

docker run --privileged -it --rm -v $PWD:/data android-container bash -c ". /start.sh && gradlew build -p /data"
Enter fullscreen mode Exit fullscreen mode
  • - it:交互模式。

  • rm:进程完成后移除卷。

  • -v $PWD:/data:将你的目录挂载到容器的 /data 目录中

  • bash -c “ . /start.sh && gradlew build -p /data”:启动模拟器并构建项目。

瞧!我们已经在 Docker 容器中独立运行了整个测试流程。趁着等待报告的空档,咱们先去做点别的事吧。😝 😝

有关构建步骤和示例的更详细信息,请查看此GitHub 仓库。我用Sunflower项目制作了一个很棒的示例

如有任何疑问,请随时提出,可通过codecaigicungduoc@gmail.com联系我,或在我的 GitHub 仓库中创建一个新 issue。

感谢阅读🙇🙇🙇

文章来源:https://dev.to/phatnhse/build-a-lightweight-docker-container-for-android-testing-ikh