#!/bin/bash # usage: # ./scripts/build_android.sh --output /absolute/path/to/dir_or_apk [extra flutter build args...] set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" DEFAULT_OUTPUT_DIR="$PROJECT_ROOT/build/android_release" DEFAULT_OUTPUT_PATH="$DEFAULT_OUTPUT_DIR/app-release.apk" OUTPUT_PATH="$DEFAULT_OUTPUT_PATH" EXTRA_ARGS=() while [[ $# -gt 0 ]]; do case "$1" in --output=*) OUTPUT_PATH="${1#*=}" shift ;; --output) if [[ $# -lt 2 ]]; then echo "参数错误: --output 需要一个路径" >&2 exit 1 fi OUTPUT_PATH="$2" shift 2 ;; *) EXTRA_ARGS+=("$1") shift ;; esac done pushd "$PROJECT_ROOT" >/dev/null echo "📦 清理旧构建..." flutter clean echo "📚 获取依赖..." flutter pub get echo "🤖 开始构建 Android APK..." flutter build apk --release "${EXTRA_ARGS[@]}" popd >/dev/null ARTIFACT_DIR="$PROJECT_ROOT/build/app/outputs/flutter-apk" if [[ ! -d "$ARTIFACT_DIR" ]]; then echo "未找到 APK 输出目录:$ARTIFACT_DIR" >&2 exit 1 fi BUILT_APK="$(find "$ARTIFACT_DIR" -maxdepth 1 -name '*.apk' -print | head -n 1)" if [[ -z "$BUILT_APK" || ! -f "$BUILT_APK" ]]; then echo "未找到构建出的 APK 文件" >&2 exit 1 fi if [[ "$OUTPUT_PATH" == *.apk ]]; then TARGET_PATH="$OUTPUT_PATH" mkdir -p "$(dirname "$TARGET_PATH")" else mkdir -p "$OUTPUT_PATH" TARGET_PATH="$OUTPUT_PATH/$(basename "$BUILT_APK")" fi cp "$BUILT_APK" "$TARGET_PATH" echo "✅ 构建完成,APK 已保存到:$TARGET_PATH"