# Tether API build tasks # Docker image for Android builds android_image := "cimg/android:2025.12" gradle_cache := env_var_or_default("GRADLE_CACHE", justfile_directory() + "/.gradle-cache") # Default task default: @just --list # Ensure build directories exist with correct permissions [private] setup-dirs: @mkdir -p {{gradle_cache}} .gradle .kotlin build @chmod 777 {{gradle_cache}} .gradle .kotlin build 2>/dev/null || true # Build debug APK build: setup-dirs docker run --rm \ -v {{justfile_directory()}}:/project \ -v {{gradle_cache}}:/gradle-cache \ -e GRADLE_USER_HOME=/gradle-cache \ -w /project \ {{android_image}} \ sh -c './gradlew assembleDebug --no-daemon && chown -R $(stat -c %u:%g /project) /project/.gradle /project/.kotlin /project/app/build 2>/dev/null || true' @echo "APK: app/build/outputs/apk/debug/app-debug.apk" # Build release bundle for Play Store (prompts for keystore password) release: setup-dirs #!/usr/bin/env bash set -euo pipefail read -s -p "Keystore password: " KEYSTORE_PASSWORD && echo read -p "Key alias [release]: " KEY_ALIAS KEY_ALIAS=${KEY_ALIAS:-release} read -s -p "Key password (enter for same as keystore): " KEY_PASSWORD && echo KEY_PASSWORD=${KEY_PASSWORD:-$KEYSTORE_PASSWORD} docker run --rm \ -v {{justfile_directory()}}:/project \ -v {{gradle_cache}}:/gradle-cache \ -e GRADLE_USER_HOME=/gradle-cache \ -e KEYSTORE_PASSWORD="$KEYSTORE_PASSWORD" \ -e KEY_ALIAS="$KEY_ALIAS" \ -e KEY_PASSWORD="$KEY_PASSWORD" \ -w /project \ {{android_image}} \ sh -c './gradlew bundleRelease --no-daemon && chown -R $(stat -c %u:%g /project) /project/.gradle /project/.kotlin /project/app/build 2>/dev/null || true' echo "Bundle: app/build/outputs/bundle/release/app-release.aab" # Clean build artifacts clean: docker run --rm -u root \ -v {{justfile_directory()}}:/project \ -w /project \ {{android_image}} \ rm -rf app/build build .gradle .kotlin @echo "Cleaned" # Run gradle tasks gradle *ARGS: setup-dirs docker run --rm \ -v {{justfile_directory()}}:/project \ -v {{gradle_cache}}:/gradle-cache \ -e GRADLE_USER_HOME=/gradle-cache \ -w /project \ {{android_image}} \ sh -c './gradlew {{ARGS}} --no-daemon && chown -R $(stat -c %u:%g /project) /project/.gradle /project/.kotlin /project/app/build 2>/dev/null || true' # Generate icons from SVG icons: inkscape assets/icon.svg -w 512 -h 512 -o assets/icon-512.png inkscape assets/icon.svg -w 192 -h 192 -o app/src/main/res/mipmap-xxxhdpi/ic_launcher.png inkscape assets/icon.svg -w 144 -h 144 -o app/src/main/res/mipmap-xxhdpi/ic_launcher.png inkscape assets/icon.svg -w 96 -h 96 -o app/src/main/res/mipmap-xhdpi/ic_launcher.png inkscape assets/icon.svg -w 72 -h 72 -o app/src/main/res/mipmap-hdpi/ic_launcher.png inkscape assets/icon.svg -w 48 -h 48 -o app/src/main/res/mipmap-mdpi/ic_launcher.png cp app/src/main/res/mipmap-xxxhdpi/ic_launcher.png app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png cp app/src/main/res/mipmap-xxhdpi/ic_launcher.png app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png cp app/src/main/res/mipmap-xhdpi/ic_launcher.png app/src/main/res/mipmap-xhdpi/ic_launcher_round.png cp app/src/main/res/mipmap-hdpi/ic_launcher.png app/src/main/res/mipmap-hdpi/ic_launcher_round.png cp app/src/main/res/mipmap-mdpi/ic_launcher.png app/src/main/res/mipmap-mdpi/ic_launcher_round.png inkscape assets/feature-graphic.svg -w 1024 -h 500 -o assets/feature-graphic.png @echo "Generated all icons" # Install APK on connected device install: build adb install -r app/build/outputs/apk/debug/app-debug.apk # Generate keystore for release signing keystore: keytool -genkey -v -keystore keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias release @echo "Created keystore.jks - keep this safe!"