From 1983598e3894bf43d2c130b026ab8a82abb00cef Mon Sep 17 00:00:00 2001 From: arnef Date: Wed, 12 Aug 2026 11:47:00 +0200 Subject: [PATCH] Add Docker-based Android APK build tooling Multi-stage Dockerfile.android (Bun + Android SDK + Gradle) built via build-apk.sh, so the APK can be built reproducibly without a local Android SDK install. --- Dockerfile.android | 59 ++++++++++++++++++++++++++++++++++++++++++++++ build-apk.sh | 23 ++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 Dockerfile.android create mode 100755 build-apk.sh diff --git a/Dockerfile.android b/Dockerfile.android new file mode 100644 index 0000000..4357a5f --- /dev/null +++ b/Dockerfile.android @@ -0,0 +1,59 @@ +# ── Stage 1: Tools (wird gecacht – nur bei SDK-Änderungen neu gebaut) ──────── +FROM eclipse-temurin:21-jdk-jammy AS tools + +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl unzip wget ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Bun +RUN curl -fsSL https://bun.sh/install | bash +ENV PATH="/root/.bun/bin:$PATH" +# Symlink damit Tools mit #!/usr/bin/env node funktionieren +RUN ln -s /root/.bun/bin/bun /usr/local/bin/node + +# Android SDK +ENV ANDROID_HOME=/opt/android-sdk +ENV PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools" + +RUN mkdir -p $ANDROID_HOME/cmdline-tools && \ + wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \ + -O /tmp/tools.zip && \ + unzip -q /tmp/tools.zip -d $ANDROID_HOME/cmdline-tools && \ + mv $ANDROID_HOME/cmdline-tools/cmdline-tools $ANDROID_HOME/cmdline-tools/latest && \ + rm /tmp/tools.zip + +RUN yes | sdkmanager --licenses > /dev/null 2>&1 && \ + sdkmanager \ + "platforms;android-35" \ + "build-tools;35.0.0" \ + "platform-tools" + +# ── Stage 2: Build ──────────────────────────────────────────────────────────── +FROM tools AS builder + +WORKDIR /app + +# Abhängigkeiten cachen +COPY client/package.json client/bun.lock* ./client/ +RUN cd client && bun install + +COPY . . + +# 1. Web-App bauen (ohne PWA Service Worker für Capacitor) +RUN cd client && CAPACITOR=1 bun run build + +# 2. Web-Assets in das Android-Projekt synchronisieren +# (android/ ist im Repo eingecheckt – kein cap add nötig) +RUN cd client && CI=true ./node_modules/.bin/cap sync android + +# 3. APK bauen +RUN cd client/android && \ + chmod +x gradlew && \ + GRADLE_OPTS="-Xmx3g -XX:MaxMetaspaceSize=512m" \ + ./gradlew assembleDebug --no-daemon + +# ── Stage 3: Nur die APK (für --output) ────────────────────────────────────── +FROM scratch +COPY --from=builder \ + /app/client/android/app/build/outputs/apk/debug/app-debug.apk \ + /tiptoi-sync.apk diff --git a/build-apk.sh b/build-apk.sh new file mode 100755 index 0000000..4273086 --- /dev/null +++ b/build-apk.sh @@ -0,0 +1,23 @@ +#!/bin/sh +set -e + +if command -v podman > /dev/null 2>&1; then + DOCKER=podman +elif command -v docker > /dev/null 2>&1; then + DOCKER=docker +else + echo "Fehler: weder podman noch docker gefunden." >&2 + exit 1 +fi + +OUT="$(pwd)/apk-output" +mkdir -p "$OUT" + +# Immer ohne Cache bauen – verhindert dass alte Schichten das Ergebnis verfälschen +$DOCKER build --no-cache \ + -f Dockerfile.android \ + --output "type=local,dest=$OUT" \ + . + +echo "" +echo "✓ APK bereit: $OUT/tiptoi-sync.apk"