@@ -142,15 +142,16 @@ jobs:
142142 echo "PWA CDN prefetch done"
143143
144144 # ---------------------------------------------------------------------------
145- # Android APK(B 方案:TWA 打包):bubblewrap 基于已部署的 PWA manifest
146- # 生成 TWA 工程并构建签名 APK, 上传 GitHub Release + 服务器下载目录
145+ # Android APK(B 方案:TWA 打包):基于已入库的 android/twa 工程构建签名 APK,
146+ # 上传 GitHub Release + 服务器下载目录
147147 # (官网「下载 Android APK」直链 = entropydecrease.com/downloads/entropydecrease.apk)。
148148 #
149149 # ⚠️ 首次设置(2026-08-16 已完成:bubblewrap init 生成 android/twa/ + keystore):
150150 # keystore = android/twa/android.keystore(alias=android,packageId=com.entropydecrease.twa)
151151 # 1. 将 android/twa/android.keystore 转 base64 存入 Secret ANDROID_KEYSTORE_BASE64
152152 # 2. Secret ANDROID_KEYSTORE_PASS / ANDROID_KEY_PASS = keystore 密码(init 时 keytool 输入值)
153- # CI 只做非交互 update + build;android/twa/ 提交仓库(*.keystore 已 gitignore)
153+ # CI 直接 build(密码经 BUBBLEWRAP_* 环境变量传入,CLI 无密码参数);
154+ # android/twa/ 提交仓库(*.keystore 已 gitignore)
154155 # ---------------------------------------------------------------------------
155156 build-apk :
156157 needs : deploy
@@ -173,30 +174,52 @@ jobs:
173174 KEYSTORE_B64 : ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
174175 run : |
175176 if [ -z "$KEYSTORE_B64" ]; then
176- echo "::error::ANDROID_KEYSTORE_BASE64 未配置(见 job 注释首次设置),跳过 APK 构建 "
177- exit 0
177+ echo "::error::ANDROID_KEYSTORE_BASE64 未配置(见 job 注释首次设置),APK 构建无法继续 "
178+ exit 1
178179 fi
179180 echo "$KEYSTORE_B64" | base64 -d > /tmp/entropydecrease.keystore
180- - name : Update TWA project to latest PWA
181+ # bubblewrap 每次命令都会加载 ~/.bubblewrap/config.json;CI 全新 runner
182+ # 无此文件时 jdkPath/androidSdkPath 为空,会弹交互安装提示导致非交互环境
183+ # exit 130(v0.38~v0.40 发版 build-apk 连续失败根因)。预置配置指向
184+ # setup-java/setup-android 提供的路径,消除交互。
185+ - name : Configure bubblewrap (jdk/sdk paths)
181186 run : |
182- cd android
183- bubblewrap update \
184- --manifest https://entropydecrease.com/pwa/manifest.webmanifest \
185- --directory twa
187+ mkdir -p ~/.bubblewrap
188+ cat > ~/.bubblewrap/config.json <<EOF
189+ {"jdkPath":"$JAVA_HOME","androidSdkPath":"$ANDROID_HOME"}
190+ EOF
191+ # bubblewrap 校验 SDK 根目录需存在 tools/ 或 bin/(新式 cmdline-tools
192+ # 布局没有),缺则建空占位目录通过校验
193+ if [ ! -d "$ANDROID_HOME/tools" ] && [ ! -d "$ANDROID_HOME/bin" ]; then
194+ mkdir -p "$ANDROID_HOME/bin"
195+ fi
196+ # 缺 build-tools 36.1.0 时预装:bubblewrap 自动安装只找 tools/bin 或 bin
197+ # 下的 sdkmanager(新式布局找不到),故显式用 cmdline-tools 的 sdkmanager
198+ if [ ! -d "$ANDROID_HOME/build-tools/36.1.0" ]; then
199+ SDKMANAGER="$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager"
200+ [ -f "$SDKMANAGER" ] || SDKMANAGER=$(find "$ANDROID_HOME/cmdline-tools" -name sdkmanager -type f 2>/dev/null | head -n1)
201+ if [ -n "$SDKMANAGER" ]; then
202+ yes | "$SDKMANAGER" --sdk_root="$ANDROID_HOME" "build-tools;36.1.0"
203+ fi
204+ fi
205+ # TWA 工程已随仓库生成(8e2f68c),twa-manifest.json 与 manifest-checksum.txt
206+ # 一致,build 的变更检测不会触发交互;无需 update(其 --manifest 参数指向
207+ # 本地 twa-manifest.json 而非 web manifest URL)。版本号由仓库文件维护。
186208 - name : Build signed APK
187209 env :
188- KEYSTORE_PASS : ${{ secrets.ANDROID_KEYSTORE_PASS }}
189- KEY_PASS : ${{ secrets.ANDROID_KEY_PASS }}
210+ # bubblewrap build 的密码仅从这两个环境变量读取(CLI 无密码参数)
211+ BUBBLEWRAP_KEYSTORE_PASSWORD : ${{ secrets.ANDROID_KEYSTORE_PASS }}
212+ BUBBLEWRAP_KEY_PASSWORD : ${{ secrets.ANDROID_KEY_PASS }}
190213 run : |
191214 cd android/twa
192215 bubblewrap build \
193- --keystorePath /tmp/entropydecrease.keystore \
194- --keystorePass "$KEYSTORE_PASS" \
195- --keyAlias android \
196- --keyPass "$KEY_PASS"
216+ --signingKeyPath /tmp/entropydecrease.keystore \
217+ --signingKeyAlias android
197218 - name : Verify APK artifact
198219 run : test -f android/twa/app-release-signed.apk && echo "APK OK"
199220 - name : Upload APK to GitHub Release
221+ # 仅 tag 触发时存在对应 release;workflow_dispatch 补跑时跳过
222+ if : startsWith(github.ref, 'refs/tags/')
200223 uses : softprops/action-gh-release@v2
201224 with :
202225 files : android/twa/app-release-signed.apk
0 commit comments