Making.School.Asignment.app/making_school_asignment_app/flutter_build_apk_onmac.sh

135 lines
2.9 KiB
Bash

#!/bin/bash
# macOS版本的Flutter APK构建脚本
# 基于Windows版本的flutter_build_apk_onwindows.bat改写
# 设置错误处理
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 获取项目根目录
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$PROJECT_DIR"
log_info "项目目录: $PROJECT_DIR"
# 1. 终止相关进程
log_info "终止相关进程..."
pkill -f "java.*gradle" 2>/dev/null || true
pkill -f "gradle" 2>/dev/null || true
sleep 2
# 强制删除函数
force_delete() {
local target="$1"
local max_retries=3
local retry_delay=1
if [ ! -e "$target" ]; then
return 0
fi
for ((i=1; i<=max_retries; i++)); do
log_info "尝试删除 $target (第 $i 次,共 $max_retries 次)"
# 尝试删除
rm -rf "$target" 2>/dev/null || true
# 检查是否删除成功
if [ ! -e "$target" ]; then
log_success "成功删除 $target"
return 0
fi
# 如果未成功,等待后重试
if [ $i -lt $max_retries ]; then
sleep $retry_delay
retry_delay=$((retry_delay * 2)) # 指数退避策略
fi
done
log_warning "警告: 无法完全删除 $target,某些文件可能正在使用中"
return 1
}
# 2. Flutter清理
log_info "运行 flutter clean..."
if ! flutter clean; then
log_error "flutter clean 失败,错误码: $?"
exit 1
fi
# 3. 强制删除构建目录
log_info "删除残留文件"
force_delete "build"
force_delete ".dart_tool"
force_delete "pubspec.lock"
# 4. 获取依赖包
log_info "运行 flutter pub get..."
if ! flutter pub get; then
log_error "flutter pub get 失败,错误码: $?"
exit 1
fi
# 5. 运行build_runner
log_info "运行 build_runner..."
if ! flutter packages pub run build_runner build --delete-conflicting-outputs; then
log_error "build_runner 失败,错误码: $?"
exit 1
fi
# 6. 构建release APK
log_info "构建 release APK..."
if ! flutter build apk --release; then
log_error "APK 构建失败,错误码: $?"
exit 1
fi
# 7. 打开APK所在文件夹
log_info "打开 APK 目录"
APK_DIR="$PROJECT_DIR/build/app/outputs/flutter-apk"
if [ -d "$APK_DIR" ]; then
# macOS使用open命令打开Finder
open "$APK_DIR"
else
log_warning "APK 目录不存在: $APK_DIR"
fi
echo
log_success "所有步骤成功完成!"
log_success "APK 文件生成位置: $APK_DIR"
echo
# 显示生成的APK文件信息
if [ -d "$APK_DIR" ]; then
echo "生成的APK文件:"
ls -la "$APK_DIR"/*.apk 2>/dev/null || log_warning "未找到APK文件"
fi
sleep 3
exit 0