Files
video/build_apk.sh
T
2026-10-15 22:00:52 +08:00

106 lines
3.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ============================================================
# 短视频 App Android APK 编译脚本(Linux 服务器用)
#
# 用法:
# chmod +x build_apk.sh
# ./build_apk.sh
#
# 首次使用前:修改下方「可配置参数」区域即可,无需改其他逻辑。
# 环境要求:JDK 17 + Flutter SDK(Linux) + Android SDK 命令行工具
# 详见 docs/04-部署运行文档.md
# ============================================================
set -euo pipefail
# ==================== 可配置参数 ====================
# 项目 app 目录(默认:脚本所在目录下的 app/)
APP_DIR="$(cd "$(dirname "$0")" && pwd)/app"
# Flutter SDK 路径
FLUTTER_HOME="/opt/flutter"
# Android SDK 路径(系统已设 ANDROID_HOME 环境变量时优先生效)
ANDROID_SDK="${ANDROID_HOME:-$HOME/android-sdk}"
# 构建类型:release / debug / profile
BUILD_MODE="release"
# API 直连地址;留空 = 走 DNS TXT 域名发现(正式发布推荐留空)
# 联调示例:API_BASE="https://api.example.com/api/v1"
API_BASE=""
# 编译产物拷贝目录(留空 = 只输出在 app/build 目录,不拷贝)
OUTPUT_DIR=""
# ===================================================
log() { printf '\033[1;32m[build]\033[0m %s\n' "$*"; }
die() { printf '\033[1;31m[错误]\033[0m %s\n' "$*" >&2; exit 1; }
export PATH="$FLUTTER_HOME/bin:$ANDROID_SDK/platform-tools:$PATH"
export ANDROID_HOME="$ANDROID_SDK"
# ---------- 环境检查 ----------
command -v java >/dev/null 2>&1 \
|| die "未找到 java,请先安装 JDK 17(如 apt install -y openjdk-17-jdk)"
[ -x "$FLUTTER_HOME/bin/flutter" ] \
|| die "未找到 Flutter SDK:$FLUTTER_HOME,请修改脚本中的 FLUTTER_HOME"
[ -d "$ANDROID_SDK" ] \
|| die "未找到 Android SDK:$ANDROID_SDK,请修改脚本中的 ANDROID_SDK"
# Java 17 校验(gradle 要求)
JAVA_MAJOR=$(java -version 2>&1 | head -1 | sed -E 's/.*version "([0-9]+).*/\1/')
[ "$JAVA_MAJOR" -ge 17 ] 2>/dev/null \
|| die "Java 版本过低($JAVA_MAJOR),需要 JDK 17+"
# JAVA_HOME 未设置时按 java 可执行文件位置推断
[ -n "${JAVA_HOME:-}" ] \
|| export JAVA_HOME="$(dirname "$(dirname "$(readlink -f "$(command -v java)")")")"
log "Java: $(java -version 2>&1 | head -1)"
log "JAVA_HOME: $JAVA_HOME"
log "Flutter: $(flutter --version 2>/dev/null | head -1)"
log "Android SDK: $ANDROID_SDK"
cd "$APP_DIR"
# local.properties 记录的是上一台编译机的路径,sdk.dir 失效时删除让 Flutter 重新生成
if [ -f android/local.properties ]; then
SDK_DIR=$(grep '^sdk.dir=' android/local.properties | cut -d= -f2- || true)
[ -n "$SDK_DIR" ] && [ -d "$SDK_DIR" ] || rm -f android/local.properties
fi
# 同意 Android 许可(已同意则静默跳过)
yes | flutter doctor --android-licenses >/dev/null 2>&1 || true
# ---------- 编译 ----------
log "拉取依赖..."
flutter pub get
log "开始编译 $BUILD_MODE APK..."
if [ -n "$API_BASE" ]; then
flutter build apk --"$BUILD_MODE" --dart-define="API_BASE=$API_BASE"
else
flutter build apk --"$BUILD_MODE"
fi
APK="$APP_DIR/build/app/outputs/flutter-apk/app-$BUILD_MODE.apk"
[ -f "$APK" ] || die "编译结束但未找到产物:$APK"
VERSION=$(grep -E '^version:' pubspec.yaml | awk '{print $2}')
SIZE=$(du -h "$APK" | cut -f1)
log "编译成功:$APK($SIZE,版本 $VERSION)"
if [ -n "$OUTPUT_DIR" ]; then
mkdir -p "$OUTPUT_DIR"
DEST="$OUTPUT_DIR/videoapp-$VERSION-$BUILD_MODE.apk"
cp "$APK" "$DEST"
log "已拷贝到:$DEST"
fi
if [ -n "$API_BASE" ]; then
log "此包直连:$API_BASE"
else
log "此包走 DNS TXT 域名发现(请确认 txt.256kb.top 记录已指向你的 API 入口)"
fi