Set of docker images used by red_mad_robot Android team. All images are published in GitHub Container Registry.
Note
All images versioned using prefix with date when this image was built [tag]-YYYYMMDD.
It is recommended to use image tags with date prefix to keep build stable and to not break it on images updates.
All changes are listed in CHANGELOG.
Note
You should always align build-tools and compile SDK in your project to match the versions used in image, otherwise Android Gradle Plugin will download build-tools and platform packages in each CI build.
Tags rebuilt from this update onwards (34, 35, 36) ship the same build-tools 36.0.0 — newer build-tools can build for lower compile SDK levels. Archived 32/33 tags and earlier 34 dated tags keep build-tools 34.0.0.
Every image exports the version it ships as ANDROID_BUILD_TOOLS_VERSION, so a project can follow the image it runs on instead of hardcoding a version. The fallback keeps builds outside the image working:
android {
buildToolsVersion = System.getenv("ANDROID_BUILD_TOOLS_VERSION") ?: "36.0.0"
compileSdk = [x]
}Keep in mind that Android Gradle Plugin ignores buildToolsVersion below its own minimum and downloads its default version instead. AGP 9.2.x defaults to build-tools 36.0.0.
If your project does not declare buildToolsVersion at all, add it — AGP below 9.2 defaults to a version that is no longer in the image and downloads it on every build.
ghcr.io/redmadrobot/android/android-sdk:base
Base Android image. All other android images are built on top of this image.
Base image: eclipse-temurin:17-jdk-jammy
Platforms: linux/amd64, linux/arm64
Packages:
- sdkmanager:
- cmdline-tools 12.0
- build-tools 36.0.0
- platform-tools — not pinned, an image gets the release current at its build time
- python3 3.10
- git
- zip, unzip
Deprecated tags
base-36.0.0
base-jdk11
ghcr.io/redmadrobot/android/android-sdk:[tag]
Image with preinstalled SDK.
It should match your compileSdk in project build script.
Tags:
36(Android 16)35(Android 15)34(Android 14)
Deprecated tags
- 33, 33-jdk11
- 32, 32-jdk11
- 31, 31-jdk11
- 30, 30-jdk11
ghcr.io/redmadrobot/android/android-sdk:[x]-ndk
ghcr.io/redmadrobot/android/android-sdk:[x]-ndk-[y]
Where [x] is SDK version and [y] is NDK version (optionally).
Base image: android-sdk:[x]
NDK version: 26.2.11394342
Remember to specify NDK version in android block:
android {
ndkVersion = "26.2.11394342"
}Tags:
36-ndk,36-ndk-26.2.1139434235-ndk,35-ndk-26.2.1139434234-ndk,34-ndk-26.2.11394342
Deprecated tags
- 33-ndk, 33-ndk-26.2.11394342
- 32-ndk, 32-ndk-26.2.11394342
- 33-jdk11-ndk, 33-jdk11-ndk-25.1.8937393
- 33-ndk-25.1.8937393
- 32-jdk11-ndk, 32-jdk11-ndk-25.1.8937393
- 32-ndk-25.1.8937393, 32-ndk-22.1.7171670
- 31-jdk11-ndk, 31-jdk11-ndk-25.1.8937393
- 31-ndk, 31-ndk-25.1.8937393, 31-ndk-22.1.7171670
- 30-jdk11-ndk, 30-jdk11-ndk-25.1.8937393
- 30-ndk, 30-ndk-25.1.8937393, 30-ndk-22.1.7171670
ghcr.io/redmadrobot/android/ruby:[tag]
Ruby image with some additions to work with Fastlane and Danger.
Base image: ruby:[x]-slim-bookworm
Platforms: linux/amd64
Packages:
- Bundler 2.5.6
- Firebase CLI 13.3.1
Tags:
3.3,latest3.23.1
Deprecated tags
- 3.0
- 2.7
Warning
Use these images at your own risk.
ghcr.io/redmadrobot/android/android-emu:30
Base image: android-sdk:30
Scripts:
start-emulator- a script to start the emulator.
Emulator will be named as EMU_X, where X - is an SDK version (for, API 30 name will be EMU_30).prepare-snapshot- a script to save a snapshot.
This script will create a snapshot with the name from the environment variableDEFAULT_SNAPSHOT(DEFAULT_SNAPSHOT="ci"by default).
To run the emulator withDEFAULT_SNAPSHOTsetSNAPSHOT_ENABLED="true"(by default snapshot is disabled):SNAPSHOT_ENABLED="true" start-emulator
Binaries:
- Allurectl - command line wrapper of Allure TestOps' API allowing you to upload the test results in real time from a build job, and managing entities on Allure TestOps side (test cases, launches, projects).
ghcr.io/redmadrobot/android/android-emu-atd:36
Base image: android-sdk:36
Platforms: linux/amd64
Note
The image tag is the version of the base android-sdk image, not an API level.
android-emu-atd:36 is built on android-sdk:36 and carries system images for API 30, 31, 34 and 37.0.
Image for instrumented (UI) tests run via Gradle Managed Devices (GMD).
Unlike android-emu (manual model: baked AVD + snapshot + start-emulator, google_apis,
one API per image), this image does not bake an AVD or snapshot — the GMD Gradle task
manages the emulator lifecycle. It only adds what stock android-sdk lacks:
- emulator runtime shared libraries (
libX11etc. — the launcher fails to start without them); - the
emulatorpackage; - system images:
- AOSP ATD (headless-optimized, no Google APIs) — GMD
systemImageSource = "aosp-atd":system-images;android-30;aosp_atd;x86,system-images;android-31;aosp_atd;x86_64,system-images;android-34;aosp_atd;x86_64 - Google APIs — GMD
systemImageSource = "google":system-images;android-37.0;google_apis;x86_64
- AOSP ATD (headless-optimized, no Google APIs) — GMD
A single image carries every API level so it serves the whole GMD matrix from one image:.
Note
Two quirks of the package ids above, both checked against sdkmanager --list:
API 31 has no 32-bit x86 ATD image (x86 ATD stops at API 30), and ATD is published up to
android-36 only — so API 37 uses a regular, noticeably larger google_apis image.
Mind the minor version: there is no flat android-37 in system images, only android-37.0.
Both apiLevel and systemImageSource of every managed device in the consuming project must
match one of the packages above. On a mismatch the Gradle Managed Devices task downloads its own
system image on every build, which is exactly what baking them into the image avoids.
Note
Hardware acceleration (/dev/kvm) is not part of the image — it is a device passthrough
configured on the runner. The emulator needs it at runtime.
ghcr.io/redmadrobot/android/danger-kotlin:1.0.0
ghcr.io/redmadrobot/android/danger-kotlin:1.1.0
Danger-kotlin docker image.
- gradle: 5.6.2
- jdk: 8
- kotlin-compiler: 1.5.0
- danger-kotlin: [x]
Images use Dockerfile frontend 1.4+ so they are meant to be built using BuildKit and buildx.
If you want to build multi-platform images it is recommended to enable containerd image store. Without this option you will not be able to publish images to local store.