#!/usr/bin/env bash # Офлайн-сборка APK arc-shot напрямую через Android build-tools (без Gradle/AGP). # Использует только локальный SDK + android.jar. Требует: javac (JDK 17+), Android SDK. set -euo pipefail cd "$(dirname "$0")" SDK="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-$HOME/Library/Android/sdk}}" BT_VER="${BT_VER:-35.0.1}" PLATFORM="${PLATFORM:-android-34}" MIN_SDK="${MIN_SDK:-24}" TARGET_SDK="${TARGET_SDK:-34}" BT="$SDK/build-tools/$BT_VER" ANDROID_JAR="$SDK/platforms/$PLATFORM/android.jar" [ -d "$BT" ] || { echo "build-tools $BT_VER not found at $BT"; exit 1; } [ -f "$ANDROID_JAR" ] || { echo "android.jar not found at $ANDROID_JAR"; exit 1; } OUT="build" rm -rf "$OUT" mkdir -p "$OUT/classes" "$OUT/dex" echo "[1/6] javac" find src/main/java -name '*.java' > "$OUT/sources.txt" javac --release 17 -classpath "$ANDROID_JAR" -d "$OUT/classes" @"$OUT/sources.txt" echo "[2/6] d8 -> classes.dex" CLASSES=$(find "$OUT/classes" -name '*.class') "$BT/d8" --min-api "$MIN_SDK" --lib "$ANDROID_JAR" --output "$OUT/dex" $CLASSES echo "[3/6] aapt2 link" "$BT/aapt2" link \ -o "$OUT/app-unsigned.apk" \ -I "$ANDROID_JAR" \ --manifest src/main/AndroidManifest.xml \ --min-sdk-version "$MIN_SDK" \ --target-sdk-version "$TARGET_SDK" echo "[4/6] add classes.dex" cp "$OUT/dex/classes.dex" "$OUT/classes.dex" ( cd "$OUT" && zip -j -q app-unsigned.apk classes.dex ) echo "[5/6] zipalign" "$BT/zipalign" -f -p 4 "$OUT/app-unsigned.apk" "$OUT/app-aligned.apk" echo "[6/6] sign" # Keystore держим ВНЕ build/ — иначе rm -rf build стирает ключ и подпись меняется # каждую пересборку (INSTALL_FAILED_UPDATE_INCOMPATIBLE при обновлении на устройстве). KS="debug.keystore" if [ ! -f "$KS" ]; then keytool -genkeypair -keystore "$KS" -storepass android -keypass android \ -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 \ -dname "CN=Android Debug,O=Android,C=US" >/dev/null 2>&1 fi "$BT/apksigner" sign \ --ks "$KS" --ks-pass pass:android --ks-key-alias androiddebugkey --key-pass pass:android \ --out "$OUT/arc-shot.apk" "$OUT/app-aligned.apk" echo "OK -> $OUT/arc-shot.apk" "$BT/aapt2" dump badging "$OUT/arc-shot.apk" 2>/dev/null | grep -E "package:|launchable-activity:|uses-permission: name='android.permission.(MANAGE_EXTERNAL_STORAGE|FOREGROUND_SERVICE)'" || true