#!/usr/bin/env bash
# favela-android spike APK — manual build, no Gradle.
#
# WHY NO GRADLE. The Android Gradle Plugin resolves itself and a large dependency graph from Google's
# maven at build time, which is more download and more failure modes than this needs. bare-kit ships an
# EXPLODED aar (classes.jar + jni/), not a maven artifact, so the usual reason to want Gradle — dependency
# resolution — does not apply. Six tools in a row is the whole build.
#
# ⛔ THE KEYSTORE IS DURABLE ON PURPOSE. Android refuses to UPGRADE an APK signed with a different key,
# and the only way out is uninstall — which deletes app-private storage, i.e. the node's identity and its
# repo. A per-build debug key would therefore make every rebuild a data-loss event. Generated once here
# and reused; keep favela-spike.keystore if you want to keep upgrading a phone in place.
set -euo pipefail
T=$HOME/android-toolchain
APP=$T/app
SDK=$T/sdk
BT=$SDK/build-tools/34.0.0
export JAVA_HOME=$T/jdk-17.0.13+11
PATH=$JAVA_HOME/bin:$PATH
BAREKIT=$T/barekit/android/bare-kit
OUT=$APP/out
rm -rf "$OUT"; mkdir -p "$OUT/classes"
echo "==> native libs"
for abi in arm64-v8a x86_64; do
mkdir -p "$APP/lib/$abi"
cp -f "$BAREKIT/jni/$abi/libbare-kit.so" "$APP/lib/$abi/"
cp -f "$BAREKIT/jni/$abi/libc++_shared.so" "$APP/lib/$abi/" 2>/dev/null || true
echo " $abi: $(ls "$APP/lib/$abi" | wc -l) libs, $(du -sh "$APP/lib/$abi" | cut -f1)"
done
echo "==> javac"
javac -source 17 -target 17 -nowarn \
-classpath "$SDK/platforms/android-34/android.jar:$BAREKIT/classes.jar" \
-d "$OUT/classes" $(find "$APP/src" -name '*.java')
echo "==> d8 (dex)"
"$BT/d8" --min-api 31 --output "$OUT" \
--lib "$SDK/platforms/android-34/android.jar" \
$(find "$OUT/classes" -name '*.class') "$BAREKIT/classes.jar"
echo "==> aapt2 link (manifest -> base apk)"
"$BT/aapt2" link -o "$OUT/base.apk" \
--manifest "$APP/AndroidManifest.xml" \
-I "$SDK/platforms/android-34/android.jar" \
--min-sdk-version 31 --target-sdk-version 34
echo "==> package dex + libs + assets"
cd "$OUT" && zip -q "$OUT/base.apk" classes.dex
cd "$APP" && zip -qr "$OUT/base.apk" lib assets -x '.*'
echo "==> zipalign"
"$BT/zipalign" -f -p 4 "$OUT/base.apk" "$OUT/favela-spike.apk"
echo "==> sign"
KS=$T/favela-spike.keystore
if [ ! -f "$KS" ]; then
keytool -genkeypair -v -keystore "$KS" -storepass favela -keypass favela \
-alias favela -keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=favela spike, OU=dev, O=favela, C=US" >/dev/null 2>&1
echo " generated durable keystore: $KS (KEEP THIS — losing it means uninstall-to-upgrade)"
fi
"$BT/apksigner" sign --ks "$KS" --ks-pass pass:favela --key-pass pass:favela "$OUT/favela-spike.apk"
"$BT/apksigner" verify "$OUT/favela-spike.apk" && echo " signature OK"
echo
echo "APK: $OUT/favela-spike.apk ($(du -h "$OUT/favela-spike.apk" | cut -f1))"
echo "install: $SDK/platform-tools/adb install -r $OUT/favela-spike.apk"