# Build environment for the Android app (android/): JDK + Android SDK # cmdline-tools, pinned to the versions validated on the maintainer's dev # machine (matching android/app/build.gradle.kts's compileSdk). Used both # by .gitea/workflows/build.yml's CI container and by ../run-image.sh for # a local, CI-equivalent build. Rebuild with ../build-image.sh whenever a # version below changes. # # fuelish's Android app has no native/NDK code, so unlike a build image # that also needs an NDK/CMake toolchain, this is just a JDK + the SDK's # own cmdline-tools/platform/build-tools. # # Does NOT contain any secrets - registry/SFTP credentials are injected # at job runtime from Gitea Actions secrets, never baked into this image. FROM ubuntu:24.04 ARG NODE_VERSION=24.16.0 ARG ANDROID_CMDLINE_TOOLS_VERSION=9862592 ARG ANDROID_PLATFORM_VERSION=36 ARG ANDROID_BUILD_TOOLS_VERSION=36.0.0 ENV DEBIAN_FRONTEND=noninteractive # openjdk-17-jdk-headless: Gradle/AGP's own minimum JDK (see # android/app/build.gradle.kts's compileOptions). # make: the root Makefile's `android` target (run by both run-image.sh # and .gitea/workflows/build.yml). # python3/python3-pil: android/scripts/gen_app_icons.py's Pillow # dependency (see android/app/build.gradle.kts's generateAppIcons # preBuild task) - apt's python3-pil is used instead of pip/venv since # nothing else in this image needs a Python environment. # git/curl/ca-certificates/unzip/xz-utils: checkout and SDK/Node tool # downloads (xz-utils: Node's release tarball below is .tar.xz). # openssh-client: the build workflow's `sftp` publish to dl.ladkau.de. RUN apt-get update && apt-get install -y --no-install-recommends \ openjdk-17-jdk-headless make python3 python3-pil \ git curl ca-certificates unzip xz-utils openssh-client \ && rm -rf /var/lib/apt/lists/* # Node.js: actions/checkout@v4 and actions/upload-artifact@v3 (used by # .gitea/workflows/build.yml) are both JS actions - Gitea's act_runner # execs them with whatever `node` is on this image's PATH rather than # injecting one itself (https://github.com/nektos/act/issues/107), and # this base image doesn't bring one. RUN curl -sSL -o /tmp/node.tar.xz \ "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" \ && tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 \ && rm /tmp/node.tar.xz # Android SDK: the cmdline-tools' own sdkmanager installs exactly the # platform/build-tools version android/app/build.gradle.kts pins - # resolved here so no `docker run` of this image needs network access to # install anything before `./gradlew assembleDebug` works. The Gradle # build itself still needs network access at build time (Gradle/AGP/ # androidx dependency resolution against Google's Maven + Maven Central) - # android/gradlew resolves its own pinned Gradle version, no Gradle # binary is baked into this image. ENV ANDROID_HOME=/opt/android-sdk \ ANDROID_SDK_ROOT=/opt/android-sdk ENV PATH=${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${PATH} RUN mkdir -p "${ANDROID_HOME}/cmdline-tools" \ && curl -sSL -o /tmp/cmdline-tools.zip \ "https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_CMDLINE_TOOLS_VERSION}_latest.zip" \ && unzip -q /tmp/cmdline-tools.zip -d "${ANDROID_HOME}/cmdline-tools" \ && mv "${ANDROID_HOME}/cmdline-tools/cmdline-tools" "${ANDROID_HOME}/cmdline-tools/latest" \ && rm /tmp/cmdline-tools.zip \ && yes | sdkmanager --licenses >/dev/null \ && sdkmanager --install \ "platform-tools" \ "platforms;android-${ANDROID_PLATFORM_VERSION}" \ "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" WORKDIR /workspace