vpn/scripts/build-android.sh
2026-09-23 01:19:36 +00:00

56 lines
2 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")/.."
command -v uv >/dev/null || { echo "uv is required" >&2; exit 1; }
BRIDGE_ANDROID_DIR="native/android/flet_vpn_bridge/src/flutter/vpn_native_bridge/android"
mkdir -p "$BRIDGE_ANDROID_DIR/libs"
# Remove artifacts from older builds that used the unsupported direct-AAR
# dependency path. The reviewed source artifacts remain under native/android.
rm -f "$BRIDGE_ANDROID_DIR/libs/freeturn.aar" "$BRIDGE_ANDROID_DIR/libs/libbox.aar"
JNI_DIR="$BRIDGE_ANDROID_DIR/src/main/jniLibs"
rm -rf "$JNI_DIR"
mkdir -p "$JNI_DIR"
# A Flutter/Flet extension is itself built as an Android AAR. Gradle rejects
# direct local .aar dependencies in that situation, so unpack only the AAR's
# classes.jar and native libraries into the extension. The resulting plugin
# AAR carries the same reviewed engine payload into the final APK.
prepare_engine_artifact() {
local artifact="$1"
local stem="${artifact%.aar}"
local source="native/android/libs/$artifact"
local jar_target="$BRIDGE_ANDROID_DIR/libs/${stem}-classes.jar"
rm -f "$jar_target"
if [[ -f "$source" ]]; then
unzip -p "$source" classes.jar > "$jar_target"
local unpack_dir
unpack_dir="$(mktemp -d)"
unzip -q "$source" 'jni/*' -d "$unpack_dir"
if [[ -d "$unpack_dir/jni" ]]; then
cp -R "$unpack_dir/jni/." "$JNI_DIR/"
fi
rm -rf "$unpack_dir"
fi
}
for artifact in freeturn.aar libbox.aar; do
prepare_engine_artifact "$artifact"
done
if [[ ! -f native/android/libs/freeturn.aar || ! -f native/android/libs/libbox.aar ]]; then
cat >&2 <<'EOF'
Warning: one or more native engine artifacts are missing.
The APK will build, but the affected runtime reports UNSUPPORTED and cannot connect.
For a release build set REQUIRE_NATIVE_ARTIFACTS=1 after placing reviewed, pinned files at:
native/android/libs/freeturn.aar
native/android/libs/libbox.aar
EOF
if [[ "${REQUIRE_NATIVE_ARTIFACTS:-0}" == "1" ]]; then
exit 2
fi
fi
uv run flet build apk --project vpn-app --org su.snw --artifact vpn-app-arm64 --arch arm64-v8a