name: Build Android APK on: push: branches: - main - develop tags: - 'v*' pull_request: branches: - main workflow_dispatch: # 允许手动触发 inputs: build_type: description: '构建类型' required: true default: 'release' type: choice options: - debug - release api_domain: description: 'API 域名' required: true default: 'api.maodag.top' type: string oss_url_1: description: 'OSS 配置地址 1' required: true default: 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' type: string oss_url_2: description: 'OSS 配置地址 2' required: true default: 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' type: string oss_url_3: description: 'OSS 配置地址 3' required: true default: 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' type: string oss_url_4: description: 'OSS 配置地址 4' required: true default: 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' type: string jobs: build-libcore: name: 编译 libcore.aar runs-on: client-server steps: - name: 📥 Checkout 代码 uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: 🔧 设置 Go 环境 uses: actions/setup-go@v5 with: go-version: '1.23' cache: true cache-dependency-path: libcore/go.sum - name: 🔧 设置 Node.js 环境 uses: actions/setup-node@v4 with: node-version: '20' - name: 🔧 设置 Java 环境 uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: '17' - name: 🔧 安装 gomobile run: | go install golang.org/x/mobile/cmd/gomobile@latest gomobile init - name: 📦 编译 libcore.aar working-directory: libcore run: | echo "🚀 开始编译 libcore..." make android echo "✅ 编译完成,检查产物..." ls -lh bin/ if [ -f "bin/libcore.aar" ]; then echo "✅ libcore.aar 生成成功" cp bin/libcore.aar ../android/app/libs/ else echo "❌ libcore.aar 未找到" exit 1 fi - name: 📤 上传 libcore.aar uses: actions/upload-artifact@v4 with: name: libcore-aar path: android/app/libs/libcore.aar retention-days: 7 build-apk: name: 编译 Android APK needs: build-libcore runs-on: ubuntu-latest strategy: matrix: build_type: [release] # 默认 release 构建 steps: - name: 📥 Checkout 代码 uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: 🔧 设置 Java 环境 uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: '17' - name: 🔧 设置 Flutter 环境 uses: subosito/flutter-action@v2 with: flutter-version: '3.24.5' channel: 'stable' cache: true - name: 📥 下载 libcore.aar uses: actions/download-artifact@v4 with: name: libcore-aar path: android/app/libs/ - name: ⚙️ 配置 API 域名和 OSS 地址 run: | CONFIG_FILE="lib/app/common/app_config.dart" # 获取参数(手动触发时使用输入值,自动触发时使用默认值) API_DOMAIN="${{ inputs.api_domain || 'api.maodag.top' }}" OSS_URL_1="${{ inputs.oss_url_1 || 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' }}" OSS_URL_2="${{ inputs.oss_url_2 || 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' }}" OSS_URL_3="${{ inputs.oss_url_3 || 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' }}" OSS_URL_4="${{ inputs.oss_url_4 || 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' }}" echo "🔧 配置构建参数:" echo " API 域名: $API_DOMAIN" echo " OSS 地址 1: $OSS_URL_1" echo " OSS 地址 2: $OSS_URL_2" echo " OSS 地址 3: $OSS_URL_3" echo " OSS 地址 4: $OSS_URL_4" # 替换 API 域名 sed -i "s|api\.maodag\.top|$API_DOMAIN|g" "$CONFIG_FILE" # 替换 OSS 地址 sed -i "s|https://ppp2\.oss-cn-hongkong\.aliyuncs\.com/bear1\.txt|$OSS_URL_1|g" "$CONFIG_FILE" sed -i "s|https://xgp3\.oss-ap-northeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_2|g" "$CONFIG_FILE" sed -i "s|https://xpp4\.oss-ap-northeast-2\.aliyuncs\.com/bear1\.txt|$OSS_URL_3|g" "$CONFIG_FILE" sed -i "s|https://xpp5\.oss-ap-southeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_4|g" "$CONFIG_FILE" echo "✅ 配置替换完成" echo "" echo "📄 查看修改后的配置:" grep -A 15 "kr_baseDomains" "$CONFIG_FILE" || true - name: 📦 安装 Flutter 依赖 run: | flutter pub get flutter pub run build_runner build --delete-conflicting-outputs - name: 🔨 构建 APK (Release) run: | flutter build apk --release --split-per-abi - name: 📋 生成构建信息 id: build_info run: | BUILD_DATE=$(date '+%Y-%m-%d %H:%M:%S') COMMIT_SHA=${GITHUB_SHA::7} echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT echo "commit_sha=$COMMIT_SHA" >> $GITHUB_OUTPUT echo "📊 构建信息:" echo " - 日期: $BUILD_DATE" echo " - 提交: $COMMIT_SHA" echo " - 分支: ${GITHUB_REF#refs/heads/}" - name: 📦 重命名 APK 文件 run: | COMMIT_SHA=${{ steps.build_info.outputs.commit_sha }} DATE=$(date '+%Y%m%d') cd build/app/outputs/flutter-apk/ for file in app-*-release.apk; do if [ -f "$file" ]; then # 提取架构名称 (arm64-v8a, armeabi-v7a, x86_64) ARCH=$(echo "$file" | sed "s/app-\(.*\)-release.apk/\1/") NEW_NAME="BearVPN-${ARCH}-release-${DATE}-${COMMIT_SHA}.apk" mv "$file" "$NEW_NAME" # 计算文件大小和 MD5 SIZE=$(ls -lh "$NEW_NAME" | awk '{print $5}') MD5=$(md5sum "$NEW_NAME" | awk '{print $1}') echo "✅ $NEW_NAME" echo " 大小: $SIZE" echo " MD5: $MD5" fi done ls -lh - name: 📤 上传 APK (arm64-v8a) uses: actions/upload-artifact@v4 with: name: apk-arm64-v8a-release path: build/app/outputs/flutter-apk/*arm64-v8a*.apk retention-days: 30 - name: 📤 上传 APK (armeabi-v7a) uses: actions/upload-artifact@v4 with: name: apk-armeabi-v7a-release path: build/app/outputs/flutter-apk/*armeabi-v7a*.apk retention-days: 30 - name: 📤 上传 APK (x86_64) uses: actions/upload-artifact@v4 with: name: apk-x86_64-release path: build/app/outputs/flutter-apk/*x86_64*.apk retention-days: 30 create-release: name: 创建 GitHub Release needs: build-apk runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') steps: - name: 📥 下载所有 APK uses: actions/download-artifact@v4 with: path: artifacts pattern: apk-* - name: 📋 生成 Release 说明 id: release_notes run: | cat > release_notes.md << 'EOF' ## 🎉 BearVPN Android 版本发布 ### 📦 安装包说明 | 架构 | 适用设备 | 文件大小 | |------|----------|----------| | arm64-v8a | 64位 ARM 设备(推荐,现代手机) | ~40MB | | armeabi-v7a | 32位 ARM 设备(老旧手机) | ~35MB | | x86_64 | x86_64 模拟器 | ~45MB | ### ✨ 主要特性 - ✅ 支持 Shadowsocks/VLESS/Trojan/Hysteria2 等协议 - ✅ 内置 sing-box 核心 - ✅ 支持自定义路由规则 - ✅ 支持 URL Test 节点延迟测试 ### 📥 下载建议 **不确定选哪个?** 下载 `arm64-v8a` 版本即可,适用于绝大多数现代 Android 手机。 ### 🔒 文件校验 下载后请验证 MD5 以确保文件完整性(见下方 Assets 描述)。 --- **构建信息:** - 提交: ${GITHUB_SHA::7} - 构建时间: $(date '+%Y-%m-%d %H:%M:%S UTC') - Flutter: 3.24.5 - sing-box: latest EOF echo "release_notes<> $GITHUB_OUTPUT cat release_notes.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: 🚀 创建 GitHub Release uses: softprops/action-gh-release@v2 with: files: | artifacts/apk-arm64-v8a-*/*.apk artifacts/apk-armeabi-v7a-*/*.apk artifacts/apk-x86_64-*/*.apk body: ${{ steps.release_notes.outputs.release_notes }} draft: false prerelease: false generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 📢 构建成功通知 run: | echo "✅ 构建完成!" echo "📦 Release 已创建: ${{ github.ref }}" echo "🔗 查看: https://github.com/${{ github.repository }}/releases"