You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

70 lines
1.6 KiB

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