在 GitLab CI 上运行模拟器测试
发布于 2021-02-24,发布者为GitLab CI(持续集成)已成为 F-Droid 社区流程的重要组成部分。它是自由软件,建立在开放标准之上,运行良好。我们的测试生态系统中缺少的最后一点是在实际 Android 模拟器中运行测试的可靠方法。得益于很多人的推动,Google 现在实际测试了在 Docker 中运行 Android 模拟器。最近发布的 emulator SDK 包可以运行而没有立即崩溃!这是长期以来关于使用自由软件模拟器进行 Android 测试的最有希望的消息。不幸的是,它还不是一帆风顺的,让模拟器在 GitLab CI 中运行仍然需要一些魔法咒语。我们的要求是:
- 适用于默认的 gitlab.com 共享 runner。
- 不需要 KVM 或任何额外权限即可工作。
- KVM 可用时使用 KVM。
我们现在拥有的为我们构建标准 fdroidclient CI 设置 奠定了基础。以前,我们仅能使用旧的 armeabi-v7a 模拟器,它们慢得几乎无法想象。这些是唯一可以在没有 KVM 支持的情况下在 Docker 中运行的模拟器系统映像。即使有 KVM 支持,模拟器似乎也很不稳定。这已经变得更好了,但仍然无法令人满意。
好消息是,在 Docker 中运行模拟器现在足够稳定,使人们可以真正围绕它构建东西,比如在 GitHub Actions 中运行模拟器。因为很多人使用 Google 模拟器,这应该可以让 Google 维护它们。F-Droid 模拟器设置是自由软件:在 GNU/Linux runner 上运行的 Debian 基础映像。任何使用 GitLab CI 的项目都可以使用此设置在合并请求等上运行模拟器。
使用 default 而不是 google_apis 系统映像很重要,它们不包含 Google Play 和应用二进制 blob,并且
Google 应用似乎会减慢启动过程很多。此外,似乎 android-22 到 android-27
的系统映像似乎比较新的系统映像需要更少的资源,新的映像要求的资源太多以至于它们根本不可能在某些项目中工作.
microg 系统映像存储库也包含在 F-Droid 设置中。目前有两个映像:
system-images;android-29;microg;x86_64system-images;android-23;microg;x86- 需要模拟器 v28 或更早版本,因为它缺少 “ranchu” 内核。
使用
fdroiclient
设置使用
YAML 模板以便轻松选择特定的模拟器设置,具体来说,分别是
test-template,connected-template
和
kvm-template。
我们在 fdroidclient 中使用 microg 映像,如下所示:
kvm 29 microg x86_64:
<<: *kvm-template
no-accel 29 microg x86_64:
<<: *test-template
<<: *connected-template
- 为了帮助调试,模拟器内核启动日志保存在在项目根目录的 kernel.log 中,完整的 logcat 输出保存在 logcat.txt
中。这些可以包含在
artifacts:中以便于访问。 - 为了运行使用 KVM 的作业,首先你必须有一个支持 KVM 并带有
fdroid和kvm标记的 GitLab CI runner。然后需要将 CI/CD 设置中的变量RUN_KVM_JOBS设置为true。
为了继续在 GitLab CI 中使用模拟器映像进行开发,有一个 wiki 页面来记录提示和技巧、陷阱和新开发:
