Go to file
2025-07-11 18:44:58 +05:00
2025-07-11 18:57:31 +05:00
2025-07-11 18:51:25 +05:00

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:

  1. Make gradlew executable
  2. Run ./gradlew assembleRelease
  3. 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.

Description
Build release APK
Readme 32 KiB
Languages
Dockerfile 100%