117 lines
4.2 KiB
Bash
Executable File
117 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# ─────────────────────────────────────────────────
|
||
# 工作手机 APK 一键编译 + 部署(全自动、零提问)
|
||
# 用法: ./deploy.sh [debug|release] [可选: 设备序列号]
|
||
# ─────────────────────────────────────────────────
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
cd "$SCRIPT_DIR"
|
||
|
||
# JDK:macOS 上**强制**优先 21/17,覆盖环境里指向 JDK 22+ 的 JAVA_HOME(Kotlin 1.9 守护进程会崩)
|
||
JAVA_HOME_FIXED=""
|
||
if [[ "${DEPLOY_USE_ENV_JAVA:-0}" != "1" && -x /usr/libexec/java_home ]]; then
|
||
for _jv in 21 17; do
|
||
if _jh="$(/usr/libexec/java_home -v "$_jv" 2>/dev/null)" && [[ -d "$_jh" ]]; then
|
||
JAVA_HOME_FIXED="$_jh"
|
||
break
|
||
fi
|
||
done
|
||
fi
|
||
if [[ -z "$JAVA_HOME_FIXED" && -d "/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home" ]]; then
|
||
JAVA_HOME_FIXED="/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home"
|
||
fi
|
||
if [[ -n "$JAVA_HOME_FIXED" ]]; then
|
||
export JAVA_HOME="$JAVA_HOME_FIXED"
|
||
elif [[ -n "${JAVA_HOME:-}" ]]; then
|
||
export JAVA_HOME
|
||
elif [[ -x /usr/libexec/java_home ]]; then
|
||
export JAVA_HOME="$(/usr/libexec/java_home 2>/dev/null || true)"
|
||
fi
|
||
if [[ -z "${JAVA_HOME:-}" || ! -d "$JAVA_HOME" ]]; then
|
||
echo "✗ 未找到可用 JAVA_HOME(请安装 Temurin 21 或设 DEPLOY_USE_ENV_JAVA=1)"
|
||
exit 1
|
||
fi
|
||
|
||
BUILD_TYPE="${1:-debug}"
|
||
SERIAL="${2:-}"
|
||
|
||
BUILD_CAP="$(tr '[:lower:]' '[:upper:]' <<< "${BUILD_TYPE:0:1}")${BUILD_TYPE:1}"
|
||
TASK="assemble${BUILD_CAP}"
|
||
APK_PATH="app/build/outputs/apk/${BUILD_TYPE}/app-${BUILD_TYPE}.apk"
|
||
PKG="com.system.cloudservice"
|
||
|
||
pick_adb_serial() {
|
||
# 优先 USB 真机(排除 emulator),否则第一个 device
|
||
local s
|
||
s="$(adb devices | awk '/\tdevice$/ {print $1}' | grep -v '^emulator-' | head -1)"
|
||
if [[ -z "$s" ]]; then
|
||
s="$(adb devices | awk '/\tdevice$/ {print $1}' | head -1)"
|
||
fi
|
||
echo "$s"
|
||
}
|
||
|
||
ADB_ARGS=()
|
||
if [[ -n "$SERIAL" ]]; then
|
||
ADB_ARGS=( -s "$SERIAL" )
|
||
else
|
||
AUTO_SERIAL="$(pick_adb_serial)"
|
||
if [[ -n "$AUTO_SERIAL" ]]; then
|
||
ADB_ARGS=( -s "$AUTO_SERIAL" )
|
||
fi
|
||
fi
|
||
|
||
echo "═══════════════════════════════════════"
|
||
echo " 工作手机 统一安装包部署(全自动)"
|
||
echo " 构建类型: ${BUILD_TYPE}"
|
||
echo " 设备序列号: ${SERIAL:-${AUTO_SERIAL:-(自动)}}"
|
||
echo " JAVA_HOME: ${JAVA_HOME}"
|
||
echo "═══════════════════════════════════════"
|
||
|
||
echo ""
|
||
echo "▸ [1/5] 停止守护进程并清理本地缓存(防路径错乱/Kotlin JDK 不匹配)…"
|
||
if [[ "${DEPLOY_NO_CLEAN:-0}" != "1" ]]; then
|
||
./gradlew --stop 2>/dev/null || true
|
||
rm -rf .gradle app/build
|
||
else
|
||
./gradlew --stop 2>/dev/null || true
|
||
fi
|
||
|
||
echo ""
|
||
echo "▸ [2/5] 编译..."
|
||
if ! ./gradlew "$TASK" --no-daemon -q; then
|
||
echo "✗ Gradle 失败"
|
||
exit 1
|
||
fi
|
||
|
||
if [[ ! -f "$APK_PATH" ]]; then
|
||
echo "✗ APK 未找到: $APK_PATH"
|
||
exit 1
|
||
fi
|
||
APK_SIZE=$(du -h "$APK_PATH" | cut -f1)
|
||
echo " ✓ 编译完成 ($APK_SIZE)"
|
||
|
||
echo ""
|
||
echo "▸ [3/5] 检查设备..."
|
||
DEVICE_COUNT=$(adb "${ADB_ARGS[@]}" devices 2>/dev/null | grep -c $'\tdevice$' || true)
|
||
if [[ "$DEVICE_COUNT" -eq 0 ]]; then
|
||
echo "✗ 未检测到设备(请 USB 调试 + 授权)"
|
||
exit 1
|
||
fi
|
||
DEVICE_MODEL=$(adb "${ADB_ARGS[@]}" shell getprop ro.product.model 2>/dev/null | tr -d '\r')
|
||
echo " ✓ 设备: $DEVICE_MODEL"
|
||
|
||
echo ""
|
||
echo "▸ [4/5] 安装..."
|
||
adb "${ADB_ARGS[@]}" shell am force-stop "$PKG" 2>/dev/null || true
|
||
adb "${ADB_ARGS[@]}" install -r -g -t "$APK_PATH" 2>&1
|
||
|
||
echo ""
|
||
echo "▸ [5/5] 启动(无桌面图标,仅显式启动)..."
|
||
adb "${ADB_ARGS[@]}" shell am start -n "${PKG}/.ui.SetupActivity" 2>/dev/null || true
|
||
|
||
echo ""
|
||
echo "═══════════════════════════════════════"
|
||
echo " ✓ 部署完成! ($APK_SIZE)"
|
||
echo "═══════════════════════════════════════"
|