#!/usr/bin/env bash # verify_java_offline.sh - compile the reconstructed Java layer WITHOUT Gradle/AGP, for environments # where dl.google.com (AGP/AndroidX) is unreachable. Uses the apt Android SDK: # aapt2 (generate R) + javac against android.jar. Proves the Java sources + SDK stubs compile and # that the resource set links. It does NOT dex/package (that is the Gradle build's job). # # Requires: android-sdk-build-tools + android-sdk-platform-23 (apt), a JDK. set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJ="$(cd "$HERE/../.." && pwd)" AAPT2="${AAPT2:-/usr/lib/android-sdk/build-tools/debian/aapt2}" ANDROID_JAR="${ANDROID_JAR:-/usr/lib/android-sdk/platforms/android-23/android.jar}" [ -x "$AAPT2" ] || { echo "aapt2 not found (apt install android-sdk-build-tools)"; exit 2; } [ -f "$ANDROID_JAR" ] || { echo "android.jar not found (apt install android-sdk-platform-23)"; exit 2; } WORK="$(mktemp -d)"; trap 'rm -rf "$WORK"' EXIT echo "[*] aapt2 compile+link resources -> R.java" "$AAPT2" compile --dir "$PROJ/app/src/main/res" -o "$WORK/res.flata" >/dev/null # AGP injects the package from the manifest 'namespace'; standalone aapt2 needs it present, and # android-23 lacks the API-24 attr resizeableActivity, so strip it for this offline check only. sed -e 's| "$WORK/AM.xml" "$AAPT2" link -o "$WORK/base.apk" -I "$ANDROID_JAR" --manifest "$WORK/AM.xml" \ --min-sdk-version 21 --target-sdk-version 23 -R "$WORK/res.flata" \ --java "$WORK/gen" --auto-add-overlay >/dev/null echo " R.java: $(find "$WORK/gen" -name R.java)" echo "[*] javac (app sources + SDK stubs + generated R) against android-23" find "$PROJ/app/src/main/java" "$PROJ/app/src/stubs/java" "$WORK/gen" -name '*.java' > "$WORK/srcs.txt" mkdir -p "$WORK/out" if javac -d "$WORK/out" -cp "$ANDROID_JAR" -encoding UTF-8 @"$WORK/srcs.txt" 2>"$WORK/err.txt"; then echo "[+] JAVA COMPILE OK - $(find "$WORK/out" -name '*.class' | wc -l) classes" echo " app sources: $(find "$PROJ/app/src/main/java" -name '*.java' | wc -l), stubs: $(find "$PROJ/app/src/stubs/java" -name '*.java' | wc -l)" echo " native methods (titan): $(grep -rhE 'native +[A-Za-z].*\(.*\) *;' "$PROJ/app/src/main/java/com/supercell/titan/"*.java | wc -l) (expected 60)" else echo "[x] JAVA COMPILE FAILED:"; grep 'error:' "$WORK/err.txt" | head -30; exit 1 fi