name: Build Wanxiang Matrix APK on: workflow_dispatch: push: tags: - 'v*' jobs: build_apks: runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: branch: - wanxiang-hanxin-fuzhu - wanxiang-wubi-fuzhu - wanxiang-flypy-fuzhu - wanxiang-moqi-fuzhu - wanxiang-tiger-fuzhu - wanxiang-zrm-fuzhu - wanxiang-shouyou-fuzhu - wanxiang-base steps: - name: Checkout Wanxiang Repo uses: actions/checkout@v4 with: path: wanxiang_root - name: Checkout Trime Source uses: actions/checkout@v4 with: repository: osfans/trime submodules: recursive fetch-depth: 0 path: trime_src - name: Download Shared Gram Model run: | mkdir -p "$GITHUB_WORKSPACE/common_assets" curl -L "https://github.com/amzxyz/RIME-LMDG/releases/download/LTS/wanxiang-lts-zh-hans.gram" \ -o "$GITHUB_WORKSPACE/common_assets/wanxiang-lts-zh-hans.gram" # 2. 注入方案 (核弹模式 + 智能分流) - name: Inject Scheme & Smart Sync env: # 垃圾文件过滤 DELETE_LIST: ".git .github .gitignore *.md plum weasel.yaml version.txt wanxiang_t9.schema.yaml LICENSE *.png *.jpg unused_folder update_log.txt" run: | # === 0. 安装编译工具 === echo ">>> [System] 安装 OpenCC 工具..." sudo apt-get update sudo apt-get install -y opencc echo ">>> [Scheme] 正在执行【核弹级】重置..." RIME_DEST="$GITHUB_WORKSPACE/trime_src/app/src/main/assets/rime" SHARED_DEST="$GITHUB_WORKSPACE/trime_src/app/src/main/assets/shared" SCRIPT_PATH="$GITHUB_WORKSPACE/wanxiang_root/.github/workflows/scripts/openccset.py" DM_PATH="$GITHUB_WORKSPACE/trime_src/app/src/main/java/com/osfans/trime/data/base/DataManager.kt" # === 1. 彻底删除官方 rime 目录 (纯净模式) === rm -rf "$RIME_DEST" rm -rf "$SHARED_DEST" mkdir -p "$RIME_DEST" mkdir -p "$SHARED_DEST" # === 2. 拉取你的分支代码 === echo ">>> [Scheme] 拉取分支: ${{ matrix.branch }} ..." git clone -b ${{ matrix.branch }} --single-branch --depth 1 https://github.com/${{ github.repository }}.git temp_scheme # === 3. 执行 Python 转换脚本 === if [ -d "temp_scheme/opencc" ]; then echo ">>> [OpenCC] 发现 opencc 目录,开始预编译..." python3 "$SCRIPT_PATH" "$GITHUB_WORKSPACE/temp_scheme/opencc" else echo ">>> [OpenCC] 未发现 opencc 目录,跳过。" fi # === 4. 清理垃圾 === cd temp_scheme for pattern in ${{ env.DELETE_LIST }}; do rm -rf $pattern || true done cd .. # === 5. 将所有文件注入 rime (Engine Base) === echo ">>> [Scheme] 全量注入 rime 目录..." cp -rf temp_scheme/* "$SHARED_DEST"/ rm -rf temp_scheme # === 注入 Gram 模型 === echo ">>> [Gram] 注入公共模型到 Shared..." cp -f "$GITHUB_WORKSPACE/common_assets/wanxiang-lts-zh-hans.gram" "$SHARED_DEST/wanxiang-lts-zh-hans.gram" cd "$SHARED_DEST" THEME_FILE=$(find . -maxdepth 1 -name "*简纯*.yaml" | head -n 1) if [ -n "$THEME_FILE" ]; then echo "🎨 锁定默认主题: $THEME_FILE -> trime.yaml" mv -f "$THEME_FILE" "trime.yaml" fi echo ">>> [Cleanup] 正在执行多目录深度清理..." # 清理 custom 目录 (例如图片、多余文本) if [ -d "custom" ]; then rm -rf custom/*.jpg custom/*.png custom/*.md 2>/dev/null || true fi # 清理 opencc 目录 (例如转换后的冗余 txt) if [ -d "opencc" ]; then rm -rf opencc/*.txt 2>/dev/null || true fi # 清理 dicts 目录 (例如文档、说明文件) if [ -d "dicts" ]; then rm -rf dicts/wuzhong.dict.yaml 2>/dev/null || true fi # 修改源码 DataManager.kt echo ">>> [Source] 正在修改 DataManager.kt ..." if [ -f "$DM_PATH" ]; then # (1) 修改默认数据目录 (rime -> wanxiang) sed -i 's/File(Environment.getExternalStorageDirectory(), "rime")/File(Environment.getExternalStorageDirectory(), "wanxiang")/g' "$DM_PATH" # (2) 动态修改默认 Schema List # 判断当前编译的分支 if [[ "${{ matrix.branch }}" == "wanxiang-base" ]]; then echo "📝 检测为 Base 包,注入 wanxiang 方案" NEW_SCHEMAS=" - schema: wanxiang" else echo "📝 检测为 Pro 包,注入 wanxiang_pro 方案" NEW_SCHEMAS=" - schema: wanxiang_pro" fi # 使用 perl 进行多行精准替换,处理那个包含 luna_pinyin 的段落 # 我们直接替换整个 schema_list 部分 perl -i -0777 -pe 's/- schema: luna_pinyin\n\s+- schema: luna_pinyin_simp/'"$NEW_SCHEMAS"'/g' "$DM_PATH" echo "✅ DataManager.kt 源码 Patch 完成" fi echo ">>> [Check] 最终状态检查:" echo "--- Shared (只有配置):" ls -1 "$SHARED_DEST" echo "--- Rime (完整数据):" ls -1 "$RIME_DEST" | head -n 10 # 编译环境准备 (删除 NDK 28) - name: Setup Java uses: actions/setup-java@v4 with: distribution: "temurin" java-version: 17 cache: 'gradle' - name: Setup Android SDK uses: android-actions/setup-android@v3 - name: Install NDK 25 and Remove NDK 28 run: | echo ">>> 1. 安装 NDK 25.2.9519653 ..." yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;25.2.9519653" "cmake;3.22.1" echo ">>> 2. 【核弹操作】物理删除系统预装的 NDK 28 ..." if [ -d "$ANDROID_HOME/ndk/28.0.13004108" ]; then sudo rm -rf $ANDROID_HOME/ndk/28.0.13004108 echo "✅ 已删除 NDK 28" else echo "ℹ️ 未发现 NDK 28,跳过" fi echo ">>> 3. 验证当前 NDK 版本 ..." ls -l $ANDROID_HOME/ndk/ - name: Setup Keystore working-directory: trime_src run: | echo "${{ secrets.SIGNING_KEY }}" | base64 -d > trime.jks cat << EOF > keystore.properties storeFile=$(pwd)/trime.jks storePassword=${{ secrets.KEY_STORE_PASSWORD }} keyAlias=${{ secrets.ALIAS }} keyPassword=${{ secrets.KEY_PASSWORD }} EOF # 7. 编译打包 (修改包名 + 锁定NDK + 注入版本) - name: Build Release APK working-directory: trime_src run: | echo ">>> 2. 准备 NDK 环境..." NDK_PATH=$(find $ANDROID_HOME/ndk -maxdepth 1 -name "25*" | head -n 1) if [ -z "$NDK_PATH" ]; then echo "❌ 错误:未找到 NDK 25" else echo "ndk.dir=$NDK_PATH" >> local.properties fi echo ">>> 3. 修改 Gradle 脚本..." # --- 【核心修改】修改包名 (Application ID) --- echo ">>> 正在修改包名为 amzxyz.wanxiang.trime ..." sed -i 's/applicationId = "com.osfans.trime"/applicationId = "amzxyz.wanxiang.trime"/g' app/build.gradle.kts # 锁定 NDK 版本 sed -i '/ndkVersion/d' app/build.gradle.kts sed -i 's/android {/android { \n ndkVersion = "25.2.9519653"/' app/build.gradle.kts echo ">>> 4. 注入版本号信息..." TRIME_VERSION=$(grep -oE "[0-9]+\.[0-9]+\.[0-9]+" CHANGELOG.md | head -n 1) if [ -z "$TRIME_VERSION" ]; then TRIME_VERSION="3.3.x"; fi COMMIT_ID=$(git rev-parse --short HEAD || echo "custom") # 替换 BuildConfig 变量 sed -i 's/buildConfigField("String", "BUILDER", .*)/buildConfigField("String", "BUILDER", "\\"GitHub Actions\\"")/g' app/build.gradle.kts sed -i 's/buildConfigField("long", "BUILD_TIMESTAMP", .*)/buildConfigField("long", "BUILD_TIMESTAMP", "0L")/g' app/build.gradle.kts sed -i 's/buildConfigField("String", "BUILD_COMMIT_HASH", .*)/buildConfigField("String", "BUILD_COMMIT_HASH", "\\"'${COMMIT_ID}'\\"")/g' app/build.gradle.kts sed -i 's/buildConfigField("String", "BUILD_GIT_REPO", .*)/buildConfigField("String", "BUILD_GIT_REPO", "\\"Wanxiang\\"")/g' app/build.gradle.kts sed -i 's/buildConfigField("String", "BUILD_VERSION_NAME", .*)/buildConfigField("String", "BUILD_VERSION_NAME", "\\"v'${TRIME_VERSION}-${COMMIT_ID}'\\"")/g' app/build.gradle.kts # 配置 Git 安全目录 git config --global --add safe.directory "*" echo ">>> 5. 开始编译..." chmod +x gradlew ./gradlew :app:assembleRelease --stacktrace # 8. 重命名逻辑 - name: Rename APK working-directory: trime_src/app/build/outputs/apk/release/ run: | ORIGINAL_APK=$(ls *arm64-v8a*release*.apk | head -n 1) NEW_NAME="trime-${{ matrix.branch }}-armv8a.apk" echo ">>> 重命名操作: 将 $ORIGINAL_APK 改为 $NEW_NAME" mv "$ORIGINAL_APK" "$NEW_NAME" # 9. 上传路径指向新名字 - name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: APK-${{ matrix.branch }} path: trime_src/app/build/outputs/apk/release/trime-${{ matrix.branch }}-armv8a.apk release_all: needs: build_apks runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' permissions: contents: write steps: - name: Get current date id: date run: echo "date=$(date +'%Y-%m-%d %H:%M')" >> $GITHUB_OUTPUT - name: Download All Artifacts uses: actions/download-artifact@v4 with: path: all_apks merge-multiple: true - name: Delete 'apk' tag and release uses: dev-drprasad/delete-tag-and-release@v1.1 if: github.event_name == 'workflow_dispatch' with: delete_release: true tag_name: apk github_token: ${{ secrets.GITHUB_TOKEN }} - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: files: all_apks/*.apk name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || '同文万象安卓版本APP下载' }} tag_name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || 'apk' }} body: | ### 🛠️ 构建信息 - **构建时间**: ${{ steps.date.outputs.date }} - **包名**: `amzxyz.wanxiang.trime` - **主题**: 默认集成简纯主题 - **用户目录**: `wanxiang` ## 📢 版权与归属声明 - **软件内核**:基于 [Trime (同文)](https://github.com/osfans/trime) 编译,归原作者所有。 - **输入方案**:归 [万象拼音](https://github.com/${{ github.repository }}) 所有。 - **作品性质**:再打包集成版。 --- *由 GitHub Actions 自动构建生成。* draft: false prerelease: true