[Bug] 安卓 CN/Global 渠道热更后整包版本显示回退为 0.1.0
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
## 问题描述
安卓 CN 和 Global 渠道出现整包版本回退问题。
用户几天前从 Cindy 官网下载安装安卓整包。昨天热更/更新后,设置页显示整包版本为 `0.1.2`。今天重新启动应用后,整包版本变为 `0.1.0`,但热更版本仍显示为 `2d7ae59d`,说明当前仍有热更 bundle 在运行。
## 环境
- 平台:Android
- 区域:CN、Global
- 安装方式:Cindy 官网安卓整包
- 昨日显示:整包版本 `0.1.2`,热更版本“随整包(热更未生效)”
- 今日显示:整包版本 `0.1.0`,热更版本 `2d7ae59d`
- 今日配套桌面版本:`0.1.29`
- Android 设备型号与系统版本:未提供
- 具体 APK versionCode:未提供
## 复现步骤
1. 从 Cindy 官网安装安卓整包。
2. 使用 CN 或 Global 渠道接收并应用热更。
3. 关闭并重新启动 Cindy。
4. 进入“设置 > 版本”。
5. 观察整包版本、热更版本和配套桌面版本。
## 实际行为
整包版本从之前显示的 `0.1.2` 回退为 `0.1.0`。
同时热更版本仍然存在,当前版本页面显示热更版本 `2d7ae59d`,并提示已是最新版本。
## 期望行为
- OTA 热更不应修改或降低已安装 APK 的原生整包版本。
- 如果设备实际安装的是 `0.1.2`,热更或重启后仍应显示整包版本 `0.1.2`。
- 如果实际安装包确实是 `0.1.0`,应用不应静默显示“已是最新版本”,应正确识别可用的整包更新。
- CN 和 Global 渠道的整包发布记录不应指向低于当前已发布版本的 APK。
- 整包版本与热更版本应继续独立展示,不能用 OTA bundle 的版本字段覆盖原生 APK 版本。
## 源码定位
- `apps/mobile/app/settings.tsx` 的版本展示使用 `Constants.expoConfig?.version`。
- `apps/mobile/src/config/env.ts` 已定义 `APP_BINARY_VERSION`,优先读取 `Constants.nativeAppVersion`,并明确说明 Android 原生 `versionName` 在 OTA 后不应漂移。
- `apps/mobile/src/update/useBundleUpdatePrompt.ts`、`useResumeUpdateCheck.ts` 和 `useForcedUpdateRecheck.ts` 也使用 `Constants.expoConfig?.version` 参与整包更新或强更判断。
- `apps/mobile/app.config.js` 的 Android 自建构建只注入单调递增的 `versionCode`;当前仓内 `app.json` 的基础 `version` 为 `0.1.0`。
目前无法仅通过客户端源码确认是以下哪一环导致现象:
1. OTA manifest 的 `expoConfig.version` 覆盖了设置页显示;
2. CN/Global 整包发布记录或 APK 下载地址回指了旧包;
3. Android 实际发生了旧 APK 覆盖安装或降级。
请结合实际安装 APK 的 `versionName`、`versionCode`、APK SHA-256,以及 CN/Global `/latest` 发布记录进一步确认。
## 日志与截图
昨日版本页面:

今日版本页面:

Contributor guide
Research direction
Start with apps/mobile/app/settings.tsx and apps/mobile/src/config/env.ts, then inspect useBundleUpdatePrompt.ts, useResumeUpdateCheck.ts, and useForcedUpdateRecheck.ts for native-versus-OTA version handling. Compare the installed APK versionName, versionCode, and SHA-256 with the CN/Global /latest release records and download URLs. Done means identifying the responsible layer and ensuring the displayed native version and full-package update checks do not regress after an OTA update.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, react-native, typescript
- Domain
- mobile, release
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100