135 lines
2.9 KiB
Bash
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
|