diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..ff3bde7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,93 @@ +# Android CI — 7maHelper (4ma 用车计时助手) +# +# 触发条件: +# - push / pull_request 到 main 或 master +# - 手动触发 (Actions 页面的 Run workflow 按钮) +# +# 任务: +# 1. JDK 17 + Android SDK (platforms;android-35, build-tools;35.0.0) +# 2. Gradle wrapper 校验 + 依赖缓存 (gradle/actions/setup-gradle) +# 3. 构建 Debug / Release APK +# 4. 上传 APK 为 Actions artifact + +name: Android CI + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + name: Build APK + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '17' + + - name: Set up Android SDK + run: | + # GitHub 托管 runner 已预装 Android SDK (ANDROID_HOME 默认已设置), + # 这里只显式安装本项目所需的平台与构建工具,并接受所有许可。 + yes | sdkmanager --licenses >/dev/null 2>&1 || true + sdkmanager "platforms;android-35" "build-tools;35.0.0" + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + # local.properties 已被 .gitignore 忽略,CI 上不存在; + # AGP 自动使用 ANDROID_HOME 环境变量定位 SDK。 + run: ./gradlew assembleDebug assembleRelease --no-daemon + + - name: Upload APK artifacts + uses: actions/upload-artifact@v4 + with: + name: apk + path: | + app/build/outputs/apk/debug/*.apk + app/build/outputs/apk/release/*.apk + if-no-files-found: error + + # 可选:对 Release APK 进行正式签名。 + # 启用方法(在仓库 Settings -> Secrets and variables -> Actions 中配置): + # KEYSTORE_BASE64 - base64 编码的 keystore 文件内容 + # KEYSTORE_PASSWORD / KEY_ALIAS / KEY_PASSWORD + # 未配置时此步骤自动跳过。 + - name: Sign Release APK (optional) + if: env.KEYSTORE_BASE64 != '' + env: + KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + run: | + APK="app/build/outputs/apk/release/app-release-unsigned.apk" + if [ -f "$APK" ]; then + echo "$KEYSTORE_BASE64" | base64 -d > release.keystore + "$ANDROID_HOME/build-tools/35.0.0/apksigner" sign \ + --ks release.keystore \ + --ks-pass "pass:${KEYSTORE_PASSWORD}" \ + --key-pass "pass:${KEY_PASSWORD}" \ + --ks-key-alias "$KEY_ALIAS" \ + --out app/build/outputs/apk/release/app-release.apk \ + "$APK" + echo "已签名: app/build/outputs/apk/release/app-release.apk" + else + echo "未找到 release 未签名 APK,跳过签名" + fi diff --git a/.gitignore b/.gitignore index c27b900..27bcd8b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,10 @@ app/build/ *.apk local.properties +# 签名密钥 +release.keystore +release.keystore.b64 + # 自包含的工具链(体积大,若用 git 建议忽略;重装见 SETUP.md) android-sdk/ tools/*