Files
metabuilder/deployment/base-images/Dockerfile.android-sdk
2026-03-15 23:55:50 +00:00

98 lines
4.9 KiB
Docker

# metabuilder/base-android-sdk
#
# Android SDK 34 + Gradle 8.12 + common Android dependencies pre-downloaded.
# Self-contained — generates Gradle wrapper from web, no project files needed.
#
# Build: docker build -f Dockerfile.android-sdk -t metabuilder/base-android-sdk:latest .
ARG BASE_REGISTRY=metabuilder
FROM ${BASE_REGISTRY}/base-apt:latest
ENV ANDROID_HOME=/opt/android-sdk \
ANDROID_SDK_ROOT=/opt/android-sdk \
GRADLE_VERSION=8.12 \
GRADLE_HOME=/opt/gradle/gradle-8.12 \
PATH=/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/opt/gradle/gradle-8.12/bin:$PATH
# JAVA_HOME — detect dynamically, no hardcoded arch
RUN ln -sf "$(dirname "$(dirname "$(readlink -f "$(which java)")")")" /usr/lib/jvm/default-java
ENV JAVA_HOME=/usr/lib/jvm/default-java
# Android command-line tools (with retry — Google CDN is reliable but large)
RUN for i in 1 2 3 4 5; do \
mkdir -p $ANDROID_HOME/cmdline-tools && \
wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \
-O /tmp/cmdtools.zip && \
unzip -q /tmp/cmdtools.zip -d $ANDROID_HOME/cmdline-tools && \
mv $ANDROID_HOME/cmdline-tools/cmdline-tools $ANDROID_HOME/cmdline-tools/latest && \
rm /tmp/cmdtools.zip \
&& break \
|| (echo "Android cmdtools download failed (attempt $i/5), retrying in $((i*10))s..." \
&& rm -f /tmp/cmdtools.zip && sleep $((i*10))); \
done
# Accept licenses + install SDK platform 34, build-tools, platform-tools
RUN yes | sdkmanager --licenses > /dev/null 2>&1 && \
for i in 1 2 3 4 5; do \
sdkmanager \
"platforms;android-34" \
"build-tools;34.0.0" \
"platform-tools" \
&& break \
|| (echo "sdkmanager failed (attempt $i/5), retrying in $((i*10))s..." && sleep $((i*10))); \
done
# Gradle (used by gradlew wrappers — each project pins its own version).
# Install Gradle ${GRADLE_VERSION} to /opt/gradle for system availability.
# Hard-fail if install fails — devcontainer COPY depends on /opt/gradle existing.
RUN GRADLE_OK=false && \
for i in 1 2 3 4 5; do \
wget -q https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip \
-O /tmp/gradle.zip && \
mkdir -p /opt/gradle && \
unzip -q /tmp/gradle.zip -d /opt/gradle && \
rm /tmp/gradle.zip && \
GRADLE_OK=true && break \
|| (echo "Gradle download failed (attempt $i/5), retrying in $((i*10))s..." \
&& rm -f /tmp/gradle.zip && sleep $((i*10))); \
done && \
if [ "$GRADLE_OK" = "true" ] && [ -f /opt/gradle/gradle-${GRADLE_VERSION}/bin/gradle ]; then \
echo "Gradle ${GRADLE_VERSION} installed successfully"; \
else \
echo "ERROR: Gradle ${GRADLE_VERSION} install failed after 5 attempts" && exit 1; \
fi
# ── Pre-download Gradle wrapper + common Android dependencies ─────────────────
# Generate the wrapper from the system Gradle install (no COPY from projects).
# Then resolve a minimal Android app's dependency tree to warm the cache.
RUN mkdir -p /tmp/gradle-warmup && \
cd /tmp/gradle-warmup && \
touch settings.gradle.kts && \
gradle wrapper --gradle-version ${GRADLE_VERSION} --no-daemon
# Stub Android project to pull common dependencies (AGP, Kotlin, AndroidX)
RUN mkdir -p /tmp/gradle-warmup/app/src/main/java && \
echo 'package com.stub; public class Stub {}' \
> /tmp/gradle-warmup/app/src/main/java/Stub.java && \
printf '<?xml version="1.0" encoding="utf-8"?>\n<manifest package="com.stub"/>' \
> /tmp/gradle-warmup/app/src/main/AndroidManifest.xml && \
printf 'pluginManagement {\n repositories {\n google()\n mavenCentral()\n gradlePluginPortal()\n }\n}\ndependencyResolutionManagement {\n repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n repositories {\n google()\n mavenCentral()\n }\n}\nrootProject.name = "warmup"\ninclude(":app")\n' \
> /tmp/gradle-warmup/settings.gradle.kts && \
printf 'plugins {\n id("com.android.application") version "8.7.3"\n id("org.jetbrains.kotlin.android") version "2.1.0"\n}\nandroid {\n namespace = "com.stub"\n compileSdk = 34\n defaultConfig {\n applicationId = "com.stub"\n minSdk = 24\n targetSdk = 34\n }\n}\ndependencies {\n implementation("androidx.core:core-ktx:1.15.0")\n implementation("androidx.appcompat:appcompat:1.7.0")\n implementation("com.google.android.material:material:1.12.0")\n}\n' \
> /tmp/gradle-warmup/app/build.gradle.kts
WORKDIR /tmp/gradle-warmup
RUN chmod +x gradlew && \
for i in 1 2 3 4 5; do \
./gradlew dependencies --no-daemon --quiet \
&& break \
|| (echo "Gradle warmup failed attempt $i/5, retrying in $((i*10))s..." && sleep $((i*10))); \
done && \
rm -rf /tmp/gradle-warmup
WORKDIR /
LABEL org.metabuilder.image="base-android-sdk" \
org.metabuilder.description="Android SDK 34 + Gradle 8.12 + common Android deps pre-downloaded"