#!/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