An optimized Docker image that includes the Android SDK and Flutter SDK.
It includes the following components:
- Ubuntu 20.04
- Java (OpenJDK)
- 1.8
- 11
- Android SDKs for platforms:
- 26
- 27
- 28
- 29
- 30
- 31
- Android build tools:
- 26.0.0 26.0.1 26.0.2
- 27.0.1 27.0.2 27.0.3
- 28.0.1 28.0.2 28.0.3
- 29.0.2 29.0.3
- 30.0.0 30.0.2 30.0.3
- 31.0.0
- Android NDK (always the latest version, side-by-side install)
- Android bundletool
- Android Emulator
- cmake
- TestNG
- Python 3.8.10
- Node.js 14, npm, React Native
- Ruby, RubyGems
- fastlane
- Flutter 2.10.3
- jenv
The docker image is a publicly automated build on Docker Hub
based on the Dockerfile
in this repo, so there is no hidden stuff in it. To pull the latest docker image:
docker pull mingc/android-build-box:latest
Hint: You can use a tag to a specific stable version,
rather than latest
of docker image, to avoid breaking your build.
e.g. mingc/android-build-box:1.22.0
.
Take a look at the Tags section, at the bottom of this page, to see all the available tags.
You can use this docker image to build your Android project with a single docker command:
cd <android project directory> # change working directory to your project root directory.
docker run --rm -v `pwd`:/project mingc/android-build-box bash -c 'cd /project; ./gradlew build'
To build .aab
bundle release, use ./gradlew bundleRelease
:
cd <android project directory> # change working directory to your project root directory.
docker run --rm -v `pwd`:/project mingc/android-build-box bash -c 'cd /project; ./gradlew bundleRelease'
Run docker image with interactive bash shell:
docker run -v `pwd`:/project -it mingc/android-build-box bash
Add the following arguments to the docker command to cache the home gradle folder:
-v "$HOME/.dockercache/gradle":"/root/.gradle"
e.g.
docker run --rm -v `pwd`:/project -v "$HOME/.dockercache/gradle":"/root/.gradle" mingc/android-build-box bash -c 'cd /project; ./gradlew build'
Build an Android project with Bitbucket Pipelines
If you have an Android project in a Bitbucket repository and want to use the pipeline feature to build it,
you can simply specify this docker image.
Here is an example of bitbucket-pipelines.yml
:
image: mingc/android-build-box:latest
pipelines:
default:
- step:
caches:
- gradle
- gradle-wrapper
- android-emulator
script:
- bash ./gradlew assemble
definitions:
caches:
gradle-wrapper: ~/.gradle/wrapper
android-emulator: $ANDROID_HOME/system-images/android-21
The caches are used to store downloaded dependencies from previous builds, to speed up the next builds.
Build a Flutter project with Github Actions
Here is an example .github/workflows/main.yml
to build a Flutter project with this docker image:
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-18.04
container: mingc/android-build-box:latest
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v1
with:
path: /root/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Build
run: |
echo "Work dir: $(pwd)"
echo "User: $(whoami)"
flutter --version
flutter analyze
flutter build apk
- name: Archive apk
uses: actions/upload-artifact@v1
with:
name: apk
path: build/app/outputs/apk
- name: Test
run: flutter test
- name: Clean build to avoid action/cache error
run: rm -fr build
Using guidelines from...
- https://medium.com/@AndreSand/android-emulator-on-docker-container-f20c49b129ef
- https://spin.atomicobject.com/2016/03/10/android-test-script/
- https://paulemtz.blogspot.com/2013/05/android-testing-in-headless-emulator.html
...You can write a script to create and launch an ARM emulator, which can be used for running integration tests or instrumentation tests or unit tests:
#!/bin/bash
# Arm emulators can be quite slow. For this reason it is convenient
# to increase the adb timeout to avoid errors.
export ADB_INSTALL_TIMEOUT=30
# Download an ARM system image to create an ARM emulator.
sdkmanager "system-images;android-22;default;armeabi-v7a"
# Create an ARM AVD emulator, with a 100 MB SD card storage space. Echo "no"
# because it will ask if you want to use a custom hardware profile, and you don't.
# https://medium.com/@AndreSand/android-emulator-on-docker-container-f20c49b129ef
echo "no" | avdmanager create avd \
-n Android_5.1_API_22 \
-k "system-images;android-22;default;armeabi-v7a" \
-c 100M \
--force
# Launch the emulator in the background
$ANDROID_HOME/emulator/emulator -avd Android_5.1_API_22 -no-skin -no-audio -no-window -no-boot-anim -gpu off &
# Note: You will have to add a suitable time delay, to wait for the emulator to launch.
Note that x86_64 emulators are not currently supported. See Issue #18 for details.
Both Java 1.8 and Java 11 are installed.
docker-android-build-box version | Date released | Java version available |
---|---|---|
1.19 and below | 2 July 2020 and earlier | Java 8 installed only |
1.20 - 1.23 | 7 August 2020 - 23 Sept 2021 | Both Java 8 and Java 11 installed. The default is Java 8. |
1.23.1 | 28 September 2021 | Both Java 8 and Java 11 installed. The default is Java 11. |
Use update-alternatives
to switch java
version.
List all the available java
paths:
# update-alternatives --list java
/usr/lib/jvm/java-11-openjdk-arm64/bin/java
/usr/lib/jvm/java-8-openjdk-arm64/jre/bin/java
Switch current java
version to Java 8:
# update-alternatives --set java /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/java
update-alternatives: using /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/java to provide /usr/bin/java (java) in manual mode
root@9b816ba2e3cb:/project# java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
Switch current java
version to Java 11:
# update-alternatives --set java /usr/lib/jvm/java-11-openjdk-arm64/bin/java
update-alternatives: using /usr/lib/jvm/java-11-openjdk-arm64/bin/java to provide /usr/bin/java (java) in manual mode
root@9b816ba2e3cb:/project# java -version
openjdk version "11.0.14" 2022-01-18
OpenJDK Runtime Environment (build 11.0.14+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.14+9-Ubuntu-0ubuntu2.20.04, mixed mode)
If you want to build the docker image by yourself, you can use following command. The image itself is around 5 GB, so check your free disk space before building it.
docker build -t android-build-box .
You can use a tag to a specific stable version, rather than latest
of docker image,
to avoid breaking your build. For example mingc/android-build-box:1.22.0
Note: versions 1.0.0
up to 1.17.0
included every single Build Tool version and every
Android Platform version available. This generated large Docker images, around 5 GB.
Newer versions of android-build-box
only include a subset of the newest Android Tools,
so the Docker images are smaller.
- PR #76: Tidy up to reduce image size @ozmium
- Remove JDK 16, Android build not support JDK 16 yet.
NOTE: missed this tag in DockerHub due to a github action error, should use 1.23.1
instead.
- Upgrade Flutter 2.2.0 to 2.5.1
- PR #71: Ubuunt 20.04, JDK 16, gradle 7.2 @sedwards
- Fix #57: Correct repositories.cfg path
- Add jenv to choose java version
- Upgrade Nodejs from 12.x to 14.x
- Push image to docker hub from github action directly.
- Update dockerhub build hook.
- Upgrade Flutter to 2.2.0
- CI switched from travis-ci to Github Action.
- PR #63: Add cache gradle to README @dewijones92
- PR #62: Make the Android SDK directory writeable @DanDevine
- Fix #60: Remove BUNDLE_GEMFILE env.
- PR #59: Fix #58: Updated README: Run emulator with ADB_INSTALL_TIMEOUT @felHR85
- Upgrade Flutter to 1.22.0
- Upgrade NDK to r21d
- PR #50: Remove all the "extras" items of local libraries in the Android SDK @ozmium
- Fix #48: Add timezone setting
- Add platform sdk 30 and build build 30.0.0
- PR #47: Remove old Build Tools (versions 24-17), and old Android Platform versions (versions 24-16), and old Google APIs (versions 24-16) @ozmium
- Add build-tools;29.0.3
- Upgrade Flutter to 1.17.1.
- PR #41: Update Dockerfile to install Yarn, fastlane using bundler. @mayankkapoor
- Upgrade NDK to r21.
- Upgrade nodejs to 12.x.
- Upgrade flutter to v1.12.13+hotfix.8.
- Add bundler for fastlane.
- Fix #34: Add android sdk level 29 license.
- Add file, less and tiny-vim
- Upgrade NDK from r19 to r20.
- Upgrade Flutter from 1.2.1 to 1.5.4.
- Upgrade Ubuntu from 17.10 to 18.04.
- Upgrade Flutter from 1.0.0 to 1.2.1.
- Upgrade ndk from 18b to 19.
- Upgrade nodejs from 8.x to 10.x
- Do not send flutter analytics
- Add Flutter 1.0
- Add kotlin 1.3 support.
- PR #21: Update sdk to 28.
- PR #17: Update sdk to 27.
- PR #20: Fix issue #18 Remove pre-installed x86_64 emulator. Explain how to create and launch an ARM emulator.
- Fix License for package not accepted issue
- Fix environment variable concatenation
- Update to latest sdk 25.2.3 and ndk 13b; add build tools 21.1.2 22.0.1 23.0.1 23.0.2 23.0.3 24 24.0.1 24.0.2 24.0.3 25 25.0.1 25.0.2 25.2.3
- nodejs 7.x and react-native support
- fastlane support
- Initial release
- Android SDK 16,17,18,19.20,21,22,23,24
- Android build tool 24.0.2
- Android NDK r13
- extra-android-m2repository
- extra-google-google_play_services
- extra-google-m2repository
If you want to enhance this docker image or fix something, feel free to send pull request.