构建用于 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
-
—
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
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
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
新建一个目录/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
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 \
Android 软件开发工具包 (SDK) 包含多个组件,包括 SDK 工具、构建工具和平台工具。SDK 工具主要包括原生 Android 模拟器、层级视图器、SDK 管理器和ProGuard。构建工具主要包括 aapt(用于创建 .APK 文件的 Android 打包工具)和 dx(用于将 .java 文件转换为 .dex 文件的 Android 工具)。平台工具包括Android 调试 shell、sqlite3和Systrace。
最重要的软件包是platform-tools、tools和emulator。运行以下命令可快速安装它们:
$ 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"
-
platform-tools包含adb -
tools包含avdmanager和sdkamanager -
emulator运行模拟器 -
system-images;android-*28*;google_apis;x86用于创建 AVD
接受 Android SDK 的所有许可协议
$ yes Y | /opt/android/tools/bin/sdkmanager --licenses
看起来不错,现在创建一个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"
-
— 名称:设备名称。
-
— abi:CPU架构。
-
— 标签
google_api:支持 Google API。
再检查一遍看看是否有效!
$ /opt/android/emulator/emulator -list-avds
# Expected Result: test
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
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.
检查正在运行的模拟器
$ adb devices
List of devices attached
emulator-5554 device
我们已经成功在容器中运行了安卓模拟器!
5. 构建 Docker 镜像
打开一个新的终端标签页,停止android-container并提交更改,以创建一个新的 Docker 镜像:
$ docker stop android-container && docker commit android-container android-container:v1
再测试一次:
$ docker images
# Expected result: REPOSITORY TAG
android-container v1
为了进一步扩展更多配置(例如: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
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 .
进入项目目录的根目录并运行:
docker run --privileged -it --rm -v $PWD:/data android-container bash -c ". /start.sh && gradlew build -p /data"
-
-
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