Android Builder
A Docker image for building Android applications with Kotlin support. Includes Android SDK, build tools, and Java 17.
Features
- Debian Stable base image
- Java 17 (OpenJDK)
- Android SDK with latest command line tools
- Android API 35 and Build Tools 35.0.0
- NDK support
- Network access for dependency downloads
- Ready for CI/CD pipelines
Quick Start
Using with Docker Compose
Create a compose.yml
in your Android project:
services:
release:
image: android-builder:latest
network_mode: host
volumes:
- ./release:/release
- .:/source
- ./path/to/your/keystore.jks:/tmp/key.jks:ro
environment:
- KEYSTORE_PASSWORD=your_keystore_password
- KEY_ALIAS=your_key_alias
- KEY_PASSWORD=your_key_password
Run the build:
docker compose run --rm release
Using with Docker Run
docker run --rm \
--network host \
-v $(pwd):/source \
-v $(pwd)/release:/release \
-v $(pwd)/keystore.jks:/tmp/key.jks:ro \
-e KEYSTORE_PASSWORD=your_password \
-e KEY_ALIAS=your_alias \
-e KEY_PASSWORD=your_key_password \
android-builder:latest
Environment Variables
Variable | Description | Required |
---|---|---|
KEYSTORE_PASSWORD |
Password for your Android keystore | Yes (for signed builds) |
KEY_ALIAS |
Alias of the key in your keystore | Yes (for signed builds) |
KEY_PASSWORD |
Password for the specific key | Yes (for signed builds) |
Volume Mounts
Host Path | Container Path | Description |
---|---|---|
Your project root | /source |
Android project source code |
Output directory | /release |
Where built APKs will be placed |
Your keystore file | /tmp/key.jks |
Android signing keystore (read-only) |
Gradle Configuration
For signed builds, configure your app/build.gradle.kts
:
android {
signingConfigs {
create("release") {
storeFile = file("/tmp/key.jks")
storePassword = System.getenv("KEYSTORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
// ... other release config
}
}
}
Build Process
The container will:
- Make
gradlew
executable - Run
./gradlew assembleRelease
- Copy built APKs to
/release
directory
Output
After building, you'll find your APKs in the mounted release directory:
app-release.apk
- Signed release APK (if keystore provided)- Debug APKs (if building debug variants)
Creating a Keystore
If you don't have a keystore yet:
keytool -genkey -v -keystore keystore.jks \
-alias your_alias \
-keyalg RSA \
-keysize 2048 \
-validity 10000
Supported Android Versions
- Target SDK: 35
- Min SDK: Depends on your project
- Build Tools: 35.0.0
- NDK: 26.1.10909125
Building the Image
docker build -t android-builder:latest .
CI/CD Usage
This image is perfect for CI/CD pipelines. Example for Gitea Actions:
jobs:
build:
runs-on: ubuntu-latest
container:
image: android-builder:latest
steps:
- uses: actions/checkout@v4
- name: Build APK
run: |
chmod +x ./gradlew
./gradlew assembleRelease
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
Troubleshooting
Network Issues
If you get UnknownHostException
, ensure you're using network_mode: host
in Docker Compose or --network host
with Docker run.
Permission Issues
The container runs as root. If you have permission issues with output files, you may need to adjust file ownership after build.
Keystore Not Found
Ensure your keystore path is correct and the file exists on the host system before mounting.