makecindy / makecindy/cindy

[Bug] 安卓 CN/Global 渠道热更后整包版本显示回退为 0.1.0

Open
#1,771 2 comments 0 reactions 0 assignees View on GitHub
bug
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` 发布记录进一步确认。

## 日志与截图

昨日版本页面:

![昨日整包版本 0.1.2](https://github.com/user-attachments/assets/36e69d83-a7b4-4d27-9826-af0b2273d7d9)

今日版本页面:

![今日整包版本回退到 0.1.0](https://github.com/user-attachments/assets/64e76a42-142f-4af0-b88c-e77ae0ec16a6)

Contributor guide

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.