From dfa45569bde197430aaacf5663fcca3e6cfa58e8 Mon Sep 17 00:00:00 2001 From: shiaho <222622008+shiaho777@users.noreply.github.com> Date: Tue, 6 Oct 2026 21:20:14 +0800 Subject: [PATCH 1/3] build(abi): drop the duplicate universal ABI flavor The abi dimension had two flavors, arm64 and universal, whose abiFilters were both arm64-v8a, so every release pipeline built each APK twice. Remove the duplicate and keep the single arm64 flavor: - drop the universal flavor from app and from the library convention plugin - drop the now non-existent "universalApi" dependency configuration from the 23 modules that declared MMKV on it; "arm64Api" stays - make the abi_flavor CI input, matrix and build_release.sh arm64-only - update the variant names in the docs and release scripts --- .github/workflows/android.yml | 15 +++++++-------- .github/workflows/pr-check.yml | 4 ++-- CONTRIBUTING.md | 10 +++++----- README.md | 10 +++++----- README.zh-CN.md | 14 +++++++------- app/build.gradle.kts | 14 +------------- .../src/main/kotlin/ImageToolboxLibraryPlugin.kt | 7 ------- build_release.sh | 8 ++++---- core/base/build.gradle.kts | 1 - core/database/build.gradle.kts | 1 - core/empty/build.gradle.kts | 1 - core/network/build.gradle.kts | 1 - core/storage/build.gradle.kts | 1 - fastlane/README.md | 2 +- fastlane/push_release.py | 2 +- feature/ad-watch/build.gradle.kts | 1 - feature/ai/build.gradle.kts | 1 - feature/app/build.gradle.kts | 1 - feature/blog/build.gradle.kts | 1 - feature/cloud-storage/build.gradle.kts | 1 - feature/common/build.gradle.kts | 1 - feature/decision-wheel/build.gradle.kts | 1 - feature/dice-roller/build.gradle.kts | 1 - feature/game2048/build.gradle.kts | 1 - feature/iching-divination/README.md | 4 ++-- feature/iching-divination/build.gradle.kts | 1 - feature/marquee/build.gradle.kts | 1 - feature/online/build.gradle.kts | 1 - feature/profile/build.gradle.kts | 1 - feature/search/build.gradle.kts | 1 - feature/survive30s/build.gradle.kts | 1 - feature/webview/build.gradle.kts | 1 - feature/wechat/build.gradle.kts | 1 - run.md | 15 +++++++-------- scripts/publish_gitcode_release.py | 2 +- 35 files changed, 43 insertions(+), 86 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index ecb5400a1..d1de22966 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -24,10 +24,9 @@ on: description: ABI flavor type: choice required: true - default: universal + default: arm64 options: - arm64 - - universal build_type: description: Build type type: choice @@ -48,7 +47,7 @@ on: env: DEFAULT_APP_FLAVOR: google - DEFAULT_ABI_FLAVOR: universal + DEFAULT_ABI_FLAVOR: arm64 DEFAULT_BUILD_TYPE: debug concurrency: @@ -62,15 +61,15 @@ jobs: should_publish_release: ${{ steps.compute.outputs.should_publish_release }} release_tag: ${{ steps.compute.outputs.release_tag }} - # tag 推送: 海外(google/foss)各出 universal + arm64, 国内 6 渠道各出 arm64(给 GitCode 当国内更新源); + # tag 推送: 海外(google/foss)各出 arm64, 国内 6 渠道各出 arm64(给 GitCode 当国内更新源); # 手动触发: 单个所选变体(include 为空, 行为与以前完全一致) strategy: fail-fast: false matrix: app_flavor: ${{ github.event_name == 'push' && fromJSON('["google","foss"]') || fromJSON(format('["{0}"]', inputs.app_flavor || 'google')) }} - abi_flavor: ${{ github.event_name == 'push' && fromJSON('["universal","arm64"]') || fromJSON(format('["{0}"]', inputs.abi_flavor || 'universal')) }} + abi_flavor: ${{ github.event_name == 'push' && fromJSON('["arm64"]') || fromJSON(format('"{0}"', inputs.abi_flavor || 'arm64')) }} # 国内渠道用 include 追加(不覆盖上面的组合): arm64 一个架构足够 —— - # 手机端全是 arm64, 且 arm64/universal 两个 abi flavor 的 abiFilters 都是 arm64-v8a。 + # 手机端全是 arm64, 且 abi 维度只有 arm64 这一个 flavor。 include: ${{ github.event_name == 'push' && fromJSON('[{"app_flavor":"xiaomi","abi_flavor":"arm64"},{"app_flavor":"yyb","abi_flavor":"arm64"},{"app_flavor":"oppo","abi_flavor":"arm64"},{"app_flavor":"vivo","abi_flavor":"arm64"},{"app_flavor":"huawei","abi_flavor":"arm64"},{"app_flavor":"onebox","abi_flavor":"arm64"}]') || fromJSON('[]') }} runs-on: ubuntu-latest @@ -156,7 +155,7 @@ jobs: BUILD_TYPE_CAPITALIZED="$(capitalize "$BUILD_TYPE")" VARIANT_NAME="$(capitalize "$APP_FLAVOR")$(capitalize "$ABI_FLAVOR")$BUILD_TYPE_CAPITALIZED" - # AGP 输出目录是 flavor 组合的 camelCase: 第一个小写, 后续首字母大写 (googleUniversal) + # AGP 输出目录是 flavor 组合的 camelCase: 第一个小写, 后续首字母大写 (googleArm64) VARIANT_DIR="${APP_FLAVOR}$(capitalize "$ABI_FLAVOR")" APK_DIR="app/build/outputs/apk/$VARIANT_DIR/$BUILD_TYPE" OUTPUT_APK_NAME="OneBox-${ARTIFACT_SUFFIX}-${APP_FLAVOR}-${ABI_FLAVOR}-${BUILD_TYPE}.apk" @@ -275,7 +274,7 @@ jobs: exit 0 fi - # VARIANT_DIR 由前面的步骤算出, 已是 AGP 产物目录的小写首字母形式 (googleUniversal) + # VARIANT_DIR 由前面的步骤算出, 已是 AGP 产物目录的小写首字母形式 (googleArm64) MAPPING="app/build/outputs/mapping/${VARIANT_DIR}Release/mapping.txt" if [[ ! -f "$MAPPING" ]]; then MAPPING="$(find app/build/outputs/mapping -maxdepth 2 -type f -name mapping.txt \ diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 9598ed71f..781c8c9ed 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -53,5 +53,5 @@ jobs: # 选 foss: 不含 GMS / Firebase / 微信 / 支付宝 SDK, 也不需要 keystore, # 但仍然会编译全部 127 个模块, 是最便宜又不缺覆盖的变体。 - - name: Assemble foss universal debug - run: ./gradlew :app:assembleFossUniversalDebug --stacktrace + - name: Assemble foss arm64 debug + run: ./gradlew :app:assembleFossArm64Debug --stacktrace diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index edac0a3ae..784f30dd6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,9 +46,9 @@ git remote add upstream https://github.com/wangzhishou/OneBox.git ### Build ```bash -./gradlew :app:assembleFossUniversalDebug # the variant CI checks -./gradlew :app:assembleGoogleUniversalDebug # recommended local build (Google / Play channel) -./gradlew :feature:ai:compileGoogleUniversalDebugKotlin # one module, much faster +./gradlew :app:assembleFossArm64Debug # the variant CI checks +./gradlew :app:assembleGoogleArm64Debug # recommended local build (Google / Play channel) +./gradlew :feature:ai:compileGoogleArm64DebugKotlin # one module, much faster ``` `google` is the overseas / Play flavor and the default local build target; swap `Google` for `Onebox`, `Xiaomi`, `Huawei`, … when you need a domestic channel. @@ -58,7 +58,7 @@ git remote add upstream https://github.com/wangzhishou/OneBox.git If you hit `InjectProcessingStep was unable to process ... could not be resolved`, that is a KSP/Hilt cache problem, not your code: ```bash -./gradlew clean :feature:app:kspGoogleUniversalDebugKotlin +./gradlew clean :feature:app:kspGoogleArm64DebugKotlin ``` ### Keys are optional @@ -89,7 +89,7 @@ Be aware before you write any: this project has almost no test culture, delibera 1. Branch from `main`. Name the branch after what you are fixing. 2. Keep the PR to one concern. A rename plus a behaviour change plus a formatting pass is three PRs. 3. Describe what changed and **how you verified it**. -4. CI builds `:app:assembleFossUniversalDebug` on every PR. A red PR will not be reviewed until it is green. +4. CI builds `:app:assembleFossArm64Debug` on every PR. A red PR will not be reviewed until it is green. 5. The maintainer is one person in UTC+8. Expect a first response within a few days. If a week passes with no reply, a ping is welcome, not rude. 6. PRs are squash-merged, so do not worry about cleaning up branch history. diff --git a/README.md b/README.md index 9b24de825..85c5f57d3 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ git clone --depth=1 https://github.com/wangzhishou/OneBox.git ### Common Commands ```bash -./gradlew :app:assembleGoogleUniversalDebug # single-variant debug APK (google = default channel) +./gradlew :app:assembleGoogleArm64Debug # single-variant debug APK (google = default channel) ./gradlew tasks --group=assemble # list all assemble tasks ./gradlew :app:tasks ``` @@ -126,11 +126,11 @@ The `app` module uses two flavor dimensions: - `app`: `xiaomi` / `yyb` / `oppo` / `vivo` / `huawei` / `onebox` / `google` / `foss` (`foss` is the fully-FOSS build: no GMS, Firebase, WeChat or Alipay SDKs; this is the variant CI verifies) -- `abi`: `arm64` / `universal` (64-bit only) +- `abi`: `arm64` (64-bit only) **Build and verify with the `google` (overseas / Play) flavor by default**; pick a domestic flavor only when it is actually needed. Task names combine the two dimensions, e.g.: -- `:app:assembleGoogleUniversalDebug` +- `:app:assembleGoogleArm64Debug` - `:app:assembleGoogleArm64Release` - `:app:assembleHuaweiArm64Debug` @@ -153,10 +153,10 @@ Both target files are git-ignored; never commit real values. ### Multi-channel Release Builds -`build_release.sh` builds **7 channels × 2 ABIs (arm64 / universal, 64-bit only) = 14 release APKs** into `release/` with a `release/manifest.txt` summary. Examples: +`build_release.sh` builds **7 channels × 1 ABI (arm64, 64-bit only) = 7 release APKs** into `release/` with a `release/manifest.txt` summary. Examples: ```bash -./build_release.sh # all 14 +./build_release.sh # all 7 ./build_release.sh --channel xiaomi huawei # selected channels ./build_release.sh --abi arm64 # 64-bit only ./build_release.sh --no-offline --clean # fetch deps online + clean first diff --git a/README.zh-CN.md b/README.zh-CN.md index 3c7cefbe1..9e631831d 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -104,7 +104,7 @@ AI 理解、执行、反馈,一气呵成。 ### 常用命令 ```bash -./gradlew :app:assembleGoogleUniversalDebug # 单变体 debug 包 +./gradlew :app:assembleGoogleArm64Debug # 单变体 debug 包 ./gradlew tasks --group=assemble # 查看全部打包任务 ./gradlew :app:tasks ``` @@ -115,11 +115,11 @@ AI 理解、执行、反馈,一气呵成。 - `app`:`xiaomi` / `yyb` / `oppo` / `vivo` / `huawei` / `onebox` / `google` / `foss` (`foss` 为完全 FOSS 构建:无 GMS、Firebase、微信/支付宝 SDK,也是 CI 校验的变体) -- `abi`:`arm64` / `universal`(仅 64 位) +- `abi`:`arm64`(仅 64 位) **默认使用 `google`(海外 / Play 渠道)变体做构建与验证**,确需国内渠道时再替换。最终任务名会组合为: -- `:app:assembleGoogleUniversalDebug` +- `:app:assembleGoogleArm64Debug` - `:app:assembleGoogleArm64Release` - `:app:assembleHuaweiArm64Debug` @@ -142,14 +142,14 @@ AI 理解、执行、反馈,一气呵成。 ### 多渠道发布打包 -项目根目录提供 `build_release.sh` 脚本,用于本地一次性打出 **7 渠道 × 2 架构 (arm64 / universal,仅 64 位) = 14 个 Release APK**,统一归集到 `release/` 目录,并生成 `release/manifest.txt` 汇总清单。 +项目根目录提供 `build_release.sh` 脚本,用于本地一次性打出 **7 渠道 × 1 架构 (arm64,仅 64 位) = 7 个 Release APK**,统一归集到 `release/` 目录,并生成 `release/manifest.txt` 汇总清单。 文件名沿用 Gradle 生成的 `OneBox--<渠道>-<架构>-release.apk`(如 `OneBox-1.2.3-xiaomi-arm64-release.apk`)。 **常用命令** ```bash -./build_release.sh # 全部 14 个 +./build_release.sh # 全部 7 个 ./build_release.sh --channel xiaomi huawei # 指定渠道 ./build_release.sh --abi arm64 # 只打 arm64 (7 个) ./build_release.sh --channel onebox --abi arm64 # 单个组合 @@ -162,7 +162,7 @@ AI 理解、执行、反馈,一气呵成。 | 参数 | 说明 | | --- | --- | | `--channel [b...]` | 只构建指定渠道 (可空格分隔多个) | -| `--abi ` | 只构建指定架构 (可空格分隔多个) | +| `--abi ` | 只构建指定架构 (可空格分隔多个) | | `--no-offline` | 覆盖离线模式配置,允许联网拉依赖(本仓库默认在线) | | `--clean` | 构建前先执行 `clean` | | `--skip-build` | 跳过 `gradlew`,只把已有 `app/build/outputs/apk/...` 复制到 `release/` | @@ -206,7 +206,7 @@ git push gitcode --tags ./scripts/publish_gitcode_release.py --tag 1.4.0 --dir release --abi arm64 ``` -GitHub Release 只挂海外包(google/foss 各 universal + arm64),国内 6 渠道包只进 GitCode。 +GitHub Release 只挂海外包(google/foss 各 arm64),国内 6 渠道包只进 GitCode。 **GitCode 仓库必须公开**,否则匿名 API 返回 403。 ## AI / Agent 能力边界 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 09da039d1..d615be930 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -266,16 +266,6 @@ android { // Crashlytics 反混淆 id, 仅 google flavor 的 SDK 会读; 国内包无 Firebase, 资源闲置 resValue("string", "com.google.firebase.crashlytics.mapping_file_id", crashlyticsMappingFileId("arm64")) } - - create("universal") { - dimension = "abi" - ndk { - abiFilters.clear() - abiFilters.add("arm64-v8a") - } - manifestPlaceholders["flavorAbi"] = "universal" - resValue("string", "com.google.firebase.crashlytics.mapping_file_id", crashlyticsMappingFileId("universal")) - } } @@ -477,10 +467,9 @@ base { // 由 build_release.sh 在 google release 构建后用于手动上传 val writeCrashlyticsMappingFileIds by tasks.registering { val outputDir = layout.buildDirectory.dir("crashlytics") - // 配置期算好两个 id, doLast 只捕获普通 Map, 避免引用脚本对象破坏 configuration cache + // 配置期算好 id, doLast 只捕获普通 Map, 避免引用脚本对象破坏 configuration cache val idByAbi = mapOf( "arm64" to crashlyticsMappingFileId("arm64"), - "universal" to crashlyticsMappingFileId("universal"), ) outputs.dir(outputDir) doLast { @@ -527,7 +516,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) api(libs.coil) api(libs.coil.network) api(libs.ktor) diff --git a/build-logic/convention/src/main/kotlin/ImageToolboxLibraryPlugin.kt b/build-logic/convention/src/main/kotlin/ImageToolboxLibraryPlugin.kt index 3206773f8..616fdec73 100644 --- a/build-logic/convention/src/main/kotlin/ImageToolboxLibraryPlugin.kt +++ b/build-logic/convention/src/main/kotlin/ImageToolboxLibraryPlugin.kt @@ -64,13 +64,6 @@ class ImageToolboxLibraryPlugin : Plugin { abiFilters.add("arm64-v8a") } } - create("universal") { - dimension = "abi" - ndk { - abiFilters.clear() - abiFilters.add("arm64-v8a") - } - } } val properties = Properties() diff --git a/build_release.sh b/build_release.sh index 4500cf297..f6540452b 100755 --- a/build_release.sh +++ b/build_release.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash # ----------------------------------------------------------------------------- -# build_release.sh — 打各个渠道的 Release 包 (仅 64 位: arm64 / universal) +# build_release.sh — 打各个渠道的 Release 包 (仅 64 位: arm64) # # 用法: -# ./build_release.sh # 7 渠道 × 2 架构 = 14 个 APK +# ./build_release.sh # 7 渠道 × 1 架构 = 7 个 APK # ./build_release.sh --channel xiaomi huawei # ./build_release.sh --abi arm64 # ./build_release.sh --channel onebox --abi arm64 @@ -25,7 +25,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" ALL_CHANNELS=("xiaomi" "yyb" "oppo" "vivo" "huawei" "onebox" "google") -ALL_ABIS=("arm64" "universal") +ALL_ABIS=("arm64") OUT_DIR="release" GRADLE="./gradlew" KEYSTORE_FILE="keystore.properties" @@ -216,7 +216,7 @@ for c in data.get("client", []): echo " [跳过] 未能从 google-services.json 解析 com.shifenmiao.app 的 mobilesdk_app_id" else for a in "${ABIS[@]}"; do - # AGP 产物目录首字母小写 (googleUniversalRelease); macOS 大小写不敏感所以 + # AGP 产物目录首字母小写 (googleArm64Release); macOS 大小写不敏感所以 # 之前写成 Google 也能命中, 但脚本若在 Linux 上跑就会找不到文件 variant="google$(to_pascal <<< "$a")Release" mapping="app/build/outputs/mapping/$variant/mapping.txt" diff --git a/core/base/build.gradle.kts b/core/base/build.gradle.kts index 095034332..c624a4025 100644 --- a/core/base/build.gradle.kts +++ b/core/base/build.gradle.kts @@ -65,7 +65,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) /** * lottie */ diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index e2d9ef83e..e4ae3b954 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -28,7 +28,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) /** * 数据库 diff --git a/core/empty/build.gradle.kts b/core/empty/build.gradle.kts index 633740292..d78afad7a 100644 --- a/core/empty/build.gradle.kts +++ b/core/empty/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) implementation(projects.core.model) implementation(projects.core.theme) diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 3fe9c5830..c9552da2f 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) /** * 事件总线 */ diff --git a/core/storage/build.gradle.kts b/core/storage/build.gradle.kts index edf8a9c14..8c227bade 100644 --- a/core/storage/build.gradle.kts +++ b/core/storage/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) implementation(libs.datastore.preferences.android) diff --git a/fastlane/README.md b/fastlane/README.md index 880725d36..e35deab4a 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -63,7 +63,7 @@ python3 -m venv .venv && .venv/bin/pip install google-api-python-client google-a `push_release.py` 把本地构建的 AAB 上传并发布到指定轨道(内部 edits.insert → bundles.upload → tracks.update → edits.commit,失败自动 delete edit 回滚;版本名形如 `130 (1.3.0)`,changelog 取 `metadata/android//changelogs/.txt`,单条 ≤500 字符): ```bash -./gradlew :app:bundleGoogleUniversalRelease # 构建 AAB(在 android/ 下) +./gradlew :app:bundleGoogleArm64Release # 构建 AAB(在 android/ 下) .venv/bin/python push_release.py --dry-run # 预览(默认最新 AAB + production) .venv/bin/python push_release.py # 正式发布 ``` diff --git a/fastlane/push_release.py b/fastlane/push_release.py index 6bf39406b..c5c019a28 100644 --- a/fastlane/push_release.py +++ b/fastlane/push_release.py @@ -28,7 +28,7 @@ HERE = os.path.dirname(os.path.abspath(__file__)) META = os.path.join(HERE, "metadata", "android") DEFAULT_AAB_GLOB = os.path.join( - HERE, "..", "app", "build", "outputs", "bundle", "googleUniversalRelease", "*.aab" + HERE, "..", "app", "build", "outputs", "bundle", "googleArm64Release", "*.aab" ) VERSIONS_TOML = os.path.join(HERE, "..", "gradle", "libs.versions.toml") NOTES_LIMIT = 500 diff --git a/feature/ad-watch/build.gradle.kts b/feature/ad-watch/build.gradle.kts index 0446b08e6..0b2bd463f 100644 --- a/feature/ad-watch/build.gradle.kts +++ b/feature/ad-watch/build.gradle.kts @@ -32,7 +32,6 @@ dependencies { // MMKV (by ABI, 每日观看计数持久化) "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) // AdMob 激励广告仅 google 渠道, GroMore 聚合激励广告仅国内 6 渠道, foss 不携带广告 SDK "googleApi"(libs.play.services.ads) diff --git a/feature/ai/build.gradle.kts b/feature/ai/build.gradle.kts index da0316a2e..12f32fbe4 100644 --- a/feature/ai/build.gradle.kts +++ b/feature/ai/build.gradle.kts @@ -58,7 +58,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) /** * 数据库 diff --git a/feature/app/build.gradle.kts b/feature/app/build.gradle.kts index 553f3d59b..172de92e8 100644 --- a/feature/app/build.gradle.kts +++ b/feature/app/build.gradle.kts @@ -13,7 +13,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) implementation(libs.com.airbnb.lottie) implementation(projects.feature.settings) diff --git a/feature/blog/build.gradle.kts b/feature/blog/build.gradle.kts index 16d9f81c8..0a208e85c 100644 --- a/feature/blog/build.gradle.kts +++ b/feature/blog/build.gradle.kts @@ -13,7 +13,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) //Di implementation(libs.dagger.hilt.android) /** diff --git a/feature/cloud-storage/build.gradle.kts b/feature/cloud-storage/build.gradle.kts index 50c29d519..0cb9a4f37 100644 --- a/feature/cloud-storage/build.gradle.kts +++ b/feature/cloud-storage/build.gradle.kts @@ -24,5 +24,4 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) } diff --git a/feature/common/build.gradle.kts b/feature/common/build.gradle.kts index 3472cc6a4..aa0d3772a 100644 --- a/feature/common/build.gradle.kts +++ b/feature/common/build.gradle.kts @@ -15,7 +15,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) implementation(projects.core.theme) implementation(projects.core.model) diff --git a/feature/decision-wheel/build.gradle.kts b/feature/decision-wheel/build.gradle.kts index ebccea4ec..88731d7f3 100644 --- a/feature/decision-wheel/build.gradle.kts +++ b/feature/decision-wheel/build.gradle.kts @@ -25,7 +25,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) /** * 数据库 diff --git a/feature/dice-roller/build.gradle.kts b/feature/dice-roller/build.gradle.kts index a84761319..4df8ea4c8 100644 --- a/feature/dice-roller/build.gradle.kts +++ b/feature/dice-roller/build.gradle.kts @@ -19,6 +19,5 @@ dependencies { // MMKV (按 ABI) "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) } diff --git a/feature/game2048/build.gradle.kts b/feature/game2048/build.gradle.kts index a27258a1f..9246f6155 100644 --- a/feature/game2048/build.gradle.kts +++ b/feature/game2048/build.gradle.kts @@ -19,6 +19,5 @@ dependencies { // MMKV (按 ABI) "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) } diff --git a/feature/iching-divination/README.md b/feature/iching-divination/README.md index 134586f43..21c85bf9f 100644 --- a/feature/iching-divination/README.md +++ b/feature/iching-divination/README.md @@ -16,8 +16,8 @@ Lines use values 6–9 and are stored bottom-to-top. AI text is explicitly prese ## Verification ```bash -./gradlew :feature:iching-divination:testOneboxUniversalDebugUnitTest -./gradlew :feature:app:compileOneboxUniversalDebugKotlin +./gradlew :feature:iching-divination:testOneboxArm64DebugUnitTest +./gradlew :feature:app:compileOneboxArm64DebugKotlin ``` ## Data source diff --git a/feature/iching-divination/build.gradle.kts b/feature/iching-divination/build.gradle.kts index dfe74c075..758dbe403 100644 --- a/feature/iching-divination/build.gradle.kts +++ b/feature/iching-divination/build.gradle.kts @@ -21,7 +21,6 @@ dependencies { implementation(libs.kotlinx.serialization.json) "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) testImplementation(kotlin("test")) testImplementation(libs.junit) diff --git a/feature/marquee/build.gradle.kts b/feature/marquee/build.gradle.kts index d26bed14a..5195ff4f4 100644 --- a/feature/marquee/build.gradle.kts +++ b/feature/marquee/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) api(projects.core.theme) api(projects.core.r) api(projects.core.ui) diff --git a/feature/online/build.gradle.kts b/feature/online/build.gradle.kts index 1ab855def..5d610dd7d 100644 --- a/feature/online/build.gradle.kts +++ b/feature/online/build.gradle.kts @@ -24,7 +24,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) /** * 数据库 diff --git a/feature/profile/build.gradle.kts b/feature/profile/build.gradle.kts index 051baf5ed..7e78f69b8 100644 --- a/feature/profile/build.gradle.kts +++ b/feature/profile/build.gradle.kts @@ -19,7 +19,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) /** * 数据库 diff --git a/feature/search/build.gradle.kts b/feature/search/build.gradle.kts index b6d74c5ad..e2057353e 100644 --- a/feature/search/build.gradle.kts +++ b/feature/search/build.gradle.kts @@ -13,7 +13,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) implementation(projects.core.ui) diff --git a/feature/survive30s/build.gradle.kts b/feature/survive30s/build.gradle.kts index 825cd9b53..053898406 100644 --- a/feature/survive30s/build.gradle.kts +++ b/feature/survive30s/build.gradle.kts @@ -19,5 +19,4 @@ dependencies { // MMKV (by ABI) "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) } diff --git a/feature/webview/build.gradle.kts b/feature/webview/build.gradle.kts index 8e5d56b11..6f5087f62 100644 --- a/feature/webview/build.gradle.kts +++ b/feature/webview/build.gradle.kts @@ -40,7 +40,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) // Coil SVG decoder for mermaid SVG rendering implementation(libs.coilSvg) diff --git a/feature/wechat/build.gradle.kts b/feature/wechat/build.gradle.kts index bd45c9b95..44cdc29d9 100644 --- a/feature/wechat/build.gradle.kts +++ b/feature/wechat/build.gradle.kts @@ -24,7 +24,6 @@ dependencies { * mmkv */ "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) // 专有 SDK 按 flavor 注入, foss 变体不携带 listOf("onebox", "xiaomi", "yyb", "oppo", "vivo", "huawei", "google").forEach { flavor -> diff --git a/run.md b/run.md index e44314cde..21016b977 100644 --- a/run.md +++ b/run.md @@ -18,7 +18,7 @@ 本项目 `app` 模块有 2 个 flavor 维度:`app` + `abi`(见 `app/build.gradle.kts`)。 - app flavors:`xiaomi` / `yyb` / `oppo` / `vivo` / `huawei` / `onebox` / `google` / `foss` -- abi flavors:`arm64` / `universal`(仅 64 位) +- abi flavors:`arm64`(仅 64 位) - buildTypes:`Debug` / `Release` 最终 Variant 名称形如:``(首字母大写驼峰) @@ -27,7 +27,7 @@ 示例: -- `GoogleUniversalDebug` +- `GoogleArm64Debug` - `GoogleArm64Release` ## 先查任务名(推荐) @@ -63,7 +63,7 @@ 构建指定 APK(推荐直接指定 Variant,输出更可控;默认 `google` 渠道): ```bash -./gradlew :app:assembleGoogleUniversalDebug +./gradlew :app:assembleGoogleArm64Debug ./gradlew :app:assembleGoogleArm64Release ./gradlew :app:assembleHuaweiArm64Debug ``` @@ -72,7 +72,6 @@ ```bash ./gradlew :app:bundleGoogleArm64Release -./gradlew :app:bundleGoogleUniversalRelease ``` 构建所有 Release 变体(通常很慢): @@ -109,14 +108,14 @@ adb devices -l ## 安装到设备(ADB 已连接) ```bash -./gradlew :app:installGoogleUniversalDebug +./gradlew :app:installGoogleArm64Debug ./gradlew :app:installHuaweiArm64Debug ``` 有些环境下也可以直接跑根任务(不带 `:app:` 前缀),以 `tasks --group=install` 的结果为准: ```bash -./gradlew installGoogleUniversalDebug +./gradlew installGoogleArm64Debug ``` ## 检查与诊断 @@ -124,7 +123,7 @@ adb devices -l Lint: ```bash -./gradlew :app:lintGoogleUniversalDebug +./gradlew :app:lintGoogleArm64Debug ``` ## 常用排错参数(复制到命令末尾) @@ -138,7 +137,7 @@ Lint: 示例: ```bash -./gradlew :app:assembleGoogleUniversalDebug --stacktrace --info +./gradlew :app:assembleGoogleArm64Debug --stacktrace --info adb pull /data/data//cache/startup_trace.log,查看启动性能日志 ``` diff --git a/scripts/publish_gitcode_release.py b/scripts/publish_gitcode_release.py index e648d3576..a8c5e017d 100644 --- a/scripts/publish_gitcode_release.py +++ b/scripts/publish_gitcode_release.py @@ -215,7 +215,7 @@ def main() -> int: parser.add_argument("--apk", nargs="*", help="要上传的 APK 路径(可多个)") parser.add_argument("--dir", help="从目录里收集 APK(会递归查找)") parser.add_argument("--channels", nargs="*", default=DOMESTIC_CHANNELS, help="只上传这些渠道的包") - parser.add_argument("--abi", help="只上传该架构的包,如 arm64 / universal") + parser.add_argument("--abi", help="只上传该架构的包,如 arm64") parser.add_argument("--body", default="", help="release 说明(默认用 tag)") parser.add_argument("--overwrite", action="store_true", help="覆盖 GitCode 上已有的同名附件") parser.add_argument("--dry-run", action="store_true", help="只打印将要执行的动作") From 1e99fd74d6c9ee9b8ab5894465df6b13b26e5bb7 Mon Sep 17 00:00:00 2001 From: shiaho <222622008+shiaho777@users.noreply.github.com> Date: Tue, 6 Oct 2026 22:34:25 +0800 Subject: [PATCH 2/3] build(release): collect APKs from the correctly cased ABI directory build_release.sh looked in app/build/outputs/apk//release, which expands to fossarm64 while AGP writes fossArm64 - the same casing trap the mapping path below already documents. The lookup only resolved on case-insensitive filesystems. Also drop the two remaining comments that still described the abi dimension as having two flavors, and keep the abi_flavor matrix in its array form for the manual dispatch branch. --- .github/workflows/android.yml | 2 +- build_release.sh | 2 +- feature/xiangqi/build.gradle.kts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index d1de22966..cb0373562 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -67,7 +67,7 @@ jobs: fail-fast: false matrix: app_flavor: ${{ github.event_name == 'push' && fromJSON('["google","foss"]') || fromJSON(format('["{0}"]', inputs.app_flavor || 'google')) }} - abi_flavor: ${{ github.event_name == 'push' && fromJSON('["arm64"]') || fromJSON(format('"{0}"', inputs.abi_flavor || 'arm64')) }} + abi_flavor: ${{ github.event_name == 'push' && fromJSON('["arm64"]') || fromJSON(format('["{0}"]', inputs.abi_flavor || 'arm64')) }} # 国内渠道用 include 追加(不覆盖上面的组合): arm64 一个架构足够 —— # 手机端全是 arm64, 且 abi 维度只有 arm64 这一个 flavor。 include: ${{ github.event_name == 'push' && fromJSON('[{"app_flavor":"xiaomi","abi_flavor":"arm64"},{"app_flavor":"yyb","abi_flavor":"arm64"},{"app_flavor":"oppo","abi_flavor":"arm64"},{"app_flavor":"vivo","abi_flavor":"arm64"},{"app_flavor":"huawei","abi_flavor":"arm64"},{"app_flavor":"onebox","abi_flavor":"arm64"}]') || fromJSON('[]') }} diff --git a/build_release.sh b/build_release.sh index f6540452b..411a6b126 100755 --- a/build_release.sh +++ b/build_release.sh @@ -167,7 +167,7 @@ MANIFEST="$OUT_DIR/manifest.txt" FOUND=0 for c in "${CHANNELS[@]}"; do for a in "${ABIS[@]}"; do - variant_dir="app/build/outputs/apk/${c}${a}/release" + variant_dir="app/build/outputs/apk/${c}$(to_pascal <<< "$a")/release" # 取该目录下第一个 .apk(正常只有一个 release apk) apk="$(find "$variant_dir" -maxdepth 1 -name '*.apk' -type f 2>/dev/null | head -n1 || true)" if [[ -z "$apk" ]]; then diff --git a/feature/xiangqi/build.gradle.kts b/feature/xiangqi/build.gradle.kts index b6d5e4620..ceb47d776 100644 --- a/feature/xiangqi/build.gradle.kts +++ b/feature/xiangqi/build.gradle.kts @@ -19,7 +19,7 @@ android.ndkVersion = libs.versions.androidNdk.get() * 产物是 **PIE 可执行文件但命名为 `libfairystockfish.so`**:AGP 会按 ABI 打包它, * 安装时解压到可执行的 native 库目录,App 侧以 UCI 子进程驱动(见 `LocalXiangqiEngine`)。 * - * 只产出 arm64-v8a —— 两个 abi flavor 的 abiFilters 都是 arm64-v8a;若将来新增 ABI, + * 只产出 arm64-v8a —— abi 维度只有 arm64 一个 flavor;若将来新增 ABI, * 这里与 [engineAbi] 一起改。 */ val engineAbi = "arm64-v8a" @@ -45,7 +45,7 @@ val buildFairyStockfish = tasks.register("buildFairyStockfish") { inputs.property("minSdk", minSdk) inputs.property("engineBuildFlags", "largeboards=yes nnue=no static-libstdc++") outputs.dir(outputDir) - // 产物是纯编译结果, 允许 build cache 复用:CI 的 tag 构建是 8 渠道 × 2 ABI 的矩阵, + // 产物是纯编译结果, 允许 build cache 复用:CI 的 tag 构建是 8 渠道 × 1 ABI 的矩阵, // 每个 job 都重编一次引擎太浪费(setup-gradle 已开远端 build cache) outputs.cacheIf { true } From 8197e251e3159f536c88ad085f44b25e34d60060 Mon Sep 17 00:00:00 2001 From: wangzhishou Date: Wed, 7 Oct 2026 08:35:04 +0800 Subject: [PATCH 3/3] build(abi): drop leftover universalApi in sudoku module --- feature/sudoku/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/sudoku/build.gradle.kts b/feature/sudoku/build.gradle.kts index ee83a3e57..4a777b38c 100644 --- a/feature/sudoku/build.gradle.kts +++ b/feature/sudoku/build.gradle.kts @@ -19,5 +19,4 @@ dependencies { // MMKV (按 ABI) "arm64Api"(libs.com.tencent.mmkv) - "universalApi"(libs.com.tencent.mmkv) }