Files
mail/scripts/build-android-test-apk.sh
T

110 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
project_dir="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
target_dir="$project_dir/target"
android_sdk="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-}}"
android_ndk="${ANDROID_NDK_ROOT:-${ANDROID_NDK_HOME:-}}"
# Keep this entry point for local development. CI always uses the same
# credentialed, pinned release builder as stable releases.
if [[ "${CI:-}" == true || "${GITHUB_ACTIONS:-}" == true ]]; then
exec bash "$project_dir/scripts/build-android-release.sh" --preview
fi
# Missing registrations are supported: the app shows Sign-in settings instead
# of sending a placeholder client ID to a provider. Reject invalid supplied IDs.
python3 "$project_dir/scripts/verify-android-oauth.py"
if [[ -z "$android_sdk" || ! -d "$android_sdk" ]]; then
printf 'Android SDK not found. Set ANDROID_HOME to your Android SDK directory.\n' >&2
exit 1
fi
if ! command -v keytool >/dev/null 2>&1; then
printf 'keytool not found. Install a JDK (Java 17 or newer is recommended).\n' >&2
exit 1
fi
gradle_command="${GRADLE_CMD:-}"
if [[ -z "$gradle_command" && -x "$project_dir/platform/android/gradle/gradlew" ]]; then
gradle_command="$project_dir/platform/android/gradle/gradlew"
fi
if [[ -z "$gradle_command" ]] && command -v gradle >/dev/null 2>&1; then
gradle_command="$(command -v gradle)"
fi
if [[ -z "$gradle_command" || ! -x "$gradle_command" ]]; then
printf 'Gradle wrapper not found. Restore platform/android/gradle/gradlew or set GRADLE_CMD.\n' >&2
exit 1
fi
if [[ -z "$android_ndk" || ! -d "$android_ndk/toolchains/llvm/prebuilt" ]]; then
printf 'Android NDK not found. Set ANDROID_NDK_HOME to an installed NDK directory.\n' >&2
exit 1
fi
toolchain="$(find "$android_ndk/toolchains/llvm/prebuilt" -mindepth 1 -maxdepth 1 -type d -print | head -n 1)/bin"
if [[ ! -x "$toolchain/aarch64-linux-android26-clang" ]]; then
printf 'Android ARM64 API 26 compiler not found under %s.\n' "$toolchain" >&2
exit 1
fi
export CC_aarch64_linux_android="$toolchain/aarch64-linux-android26-clang"
export CXX_aarch64_linux_android="$toolchain/aarch64-linux-android26-clang++"
export AR_aarch64_linux_android="$toolchain/llvm-ar"
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$toolchain/aarch64-linux-android26-clang"
# Local development may generate its own key; these APKs are never published.
data_home="${XDG_DATA_HOME:-$HOME/.local/share}"
keystore_dir="$data_home/flectar-mail/android"
keystore="${FLECTAR_ANDROID_TEST_KEYSTORE:-$keystore_dir/test-signing.keystore}"
mkdir -p "$keystore_dir"
if [[ -n "${FLECTAR_ANDROID_TEST_KEYSTORE:-}" && ! -f "$keystore" ]]; then
printf 'Configured Android test keystore does not exist: %s\n' "$keystore" >&2
exit 1
fi
if [[ ! -f "$keystore" ]]; then
umask 077
keytool \
-genkeypair \
-noprompt \
-keystore "$keystore" \
-storepass android \
-alias androiddebugkey \
-keypass android \
-dname 'CN=Flectar Mail Test,O=Android,C=US' \
-keyalg RSA \
-keysize 2048 \
-validity 10000
fi
export ANDROID_HOME="$android_sdk"
export CARGO_TARGET_DIR="$target_dir"
cargo build \
--locked \
--manifest-path "$project_dir/platform/android/Cargo.toml" \
--target aarch64-linux-android \
--release \
--lib
native_lib="$target_dir/aarch64-linux-android/release/libflectar_mail_android.so"
jni_dir="$target_dir/android/gradle-jni/arm64-v8a"
mkdir -p "$jni_dir"
cp "$native_lib" "$jni_dir/libflectar_mail_android.so"
python3 "$project_dir/scripts/stage-pdfium.py" android-arm64 "$jni_dir" \
--cache "$target_dir/pdfium-downloads"
export FLECTAR_ANDROID_KEYSTORE="$keystore"
export FLECTAR_ANDROID_KEYSTORE_PASSWORD=android
export FLECTAR_ANDROID_KEY_ALIAS=androiddebugkey
export FLECTAR_ANDROID_KEY_PASSWORD=android
"$gradle_command" \
--no-daemon \
--project-cache-dir "$target_dir/android/gradle-cache" \
-p "$project_dir/platform/android/gradle" \
:app:assembleRelease
gradle_apk="$target_dir/android/gradle/app/outputs/apk/release/app-release.apk"
artifact_dir="$target_dir/android/release/apk"
mkdir -p "$artifact_dir"
cp "$gradle_apk" "$artifact_dir/flectar-mail.apk"
printf 'Built Google-AuthorizationClient Android package %s\n' "$artifact_dir/flectar-mail.apk"