HarmonyOS 应用进入 AppGallery Connect 后,最危险的状态不是页面上出现一个明显报错,而是每个页面看起来都填了内容,实际却引用了不同版本的证据。源码里已经是 1.0.5,版本页面仍选着旧包;主模块声明了平板与 2in1,应用信息里只保留手机;包内没有网络权限,隐私材料却沿用了另一个项目;开发者上传了新 APP,却没有在版本页面重新选中它。这些问题往往到预审或人工审核阶段才暴露。
本文复查的不是一个虚构示例,而是"化学实验室"现有工程。源码位于 D:\huawei\one12,应用清单给出的身份是 com.jiaweikan.one12 / 1.0.5 / 1000005,当前签名 APP 为 one12-default-signed.app。复查中还发现一份旧自查文档仍写着"物理原理模拟实验 / com.jiaweikan.one9 / 1.0.0"。这个细节说明:发布材料即使曾经正确,只要项目、版本或时间不一致,就不能继续充当当前版本的证据。
发布复查的结论必须同时来自源码清单、签名包解析结果和 AGC 已保存页面,任何单一证据都不能替代另外两层。
CHEM-LAB-ONE12-APPGALLERY-EVIDENCE-GATE-20260730

本文将完成以下工作:
- 从
AppScope/app.json5提取包名、版本名和版本号,建立不可混用的发布身份。 - 从签名 APP 的
pack.info反查版本、设备、API、主模块和服务卡片。 - 对比
module.json5、包解析结果和 AGC 设备选项,识别多设备材料缺口。 - 用源码扫描、权限清单和隐私页面共同验证"离线应用"声明。
- 检查分层图标的透明像素、启动图标和应用市场图标的一致性。
- 设计版本选包、截图分组、隐私托管、内容分级和发布冒烟的阻断清单。
- 记录产物时间、大小和 SHA-256,使每次提交都能追溯到唯一文件。
一、先固定本次发布对象
复查开始前,先写一张只允许有一个答案的身份表。不要一边浏览 AGC 一边凭印象回忆版本。
| 字段 | 本项目证据 | 本次值 | 复查动作 |
|---|---|---|---|
| 应用名 | string.json |
化学实验室 | 对比安装后桌面与 AGC 名称 |
| bundleName | AppScope/app.json5 |
com.jiaweikan.one12 |
对比 APP 解析和 AGC 包名 |
| versionName | AppScope/app.json5 |
1.0.5 |
对比版本页与最终确认框 |
| versionCode | AppScope/app.json5 |
1000005 |
必须高于线上已发布版本 |
| 主模块 | module.json5 |
entry |
对比 pack.info |
| 目标设备 | module.json5 |
phone、tablet、2in1 | 对比素材分组和真机范围 |
| 发布模式 | 源码、系统 Kit 与隐私页面 | 待核验语音运行模式 | 对比权限、SDK、断网行为与隐私标签 |
versionName 是用户看到的版本,versionCode 才是平台判断升级关系的整数。即使 AGC 里已经出现"新版本",也不能因此推断 1000005 一定可用,仍要读取线上版本号再比较。
ts
interface ReleaseIdentity {
bundleName: string
versionName: string
versionCode: number
}
function assertUpgrade(current: ReleaseIdentity, online: ReleaseIdentity): void {
if (current.bundleName !== online.bundleName) {
throw new Error('bundleName 不一致,不能作为同一应用升级')
}
if (current.versionCode <= online.versionCode) {
throw new Error(`versionCode 必须大于线上值 ${online.versionCode}`)
}
}
这个函数不负责访问 AGC,它只负责固定升级规则。平台读取和业务判断分开后,错误不会被 UI 文案掩盖。
二、源码清单是第一层证据
本项目的 AppScope/app.json5 内容很短,却决定了应用在系统与市场中的核心身份:
json5
{
"app": {
"bundleName": "com.jiaweikan.one12",
"vendor": "jiaweikan",
"versionCode": 1000005,
"versionName": "1.0.5",
"icon": "$media:layered_image",
"label": "$string:app_name"
}
}
复查时不要只看这个文件。应用名最终来自资源,入口图标还会在 module.json5 中再次声明。如果 AppScope、入口 Ability 和 AGC 应用信息使用了不同图标,安装后的桌面效果与应用市场列表就会割裂。
源码层的检查结果应该保存为结构化对象,而不是散落在聊天记录里:
ts
const sourceRelease: ReleaseIdentity = {
bundleName: 'com.jiaweikan.one12',
versionName: '1.0.5',
versionCode: 1000005
}
后续所有包解析和平台回读都与这个对象比较。
三、签名 APP 是第二层证据
本地工程已有签名产物:
text
D:\huawei\one12\build\outputs\default\one12-default-signed.app
size: 2,192,150 bytes
modified: 2026-06-29 15:49:22
sha256: 721817B6E38B9833A4DDFFF3586D1E24D4FBC6A936619ECF7CE7E9FA5691B1DE
同一目录还可能存在旧 APP、未签名 APP 和 HAP。上传时不能按文件名"看起来像最新版"来选,应该同时比较完整路径、修改时间、大小和哈希。
powershell
$app = 'build\outputs\default\one12-default-signed.app'
$file = Get-Item -LiteralPath $app
$hash = Get-FileHash -Algorithm SHA256 -LiteralPath $app
[pscustomobject]@{
Name = $file.Name
Bytes = $file.Length
Modified = $file.LastWriteTime
Sha256 = $hash.Hash
}
哈希的作用不是代替签名校验,而是确保"本地确认的文件"和"准备上传的文件"是同一个二进制产物。
四、确认产物没有落后于源码
一个签名 APP 即使包名和版本正确,也可能没有包含最后一次代码修改。此次复查对比了 entry/src/main 下全部文件的修改时间:最新源码 ExamPracticePage.ets 修改于 2026-06-29 15:44:19,签名 APP 生成于 15:49:22,没有源码文件晚于该 APP。
可以把这个判断写成发布前脚本:
powershell
$app = Get-Item 'build\outputs\default\one12-default-signed.app'
$newer = Get-ChildItem 'entry\src\main' -Recurse -File |
Where-Object { $_.LastWriteTime -gt $app.LastWriteTime }
if ($newer.Count -gt 0) {
$newer | Select-Object FullName, LastWriteTime
throw '签名 APP 早于源码,请重新构建'
}
这只能证明时间顺序合理,不能证明构建成功或功能正确。更稳的发布记录还应保存构建命令退出码、安装结果和核心流程证据。
五、从 pack.info 反查真正进入包内的配置
源码清单是输入,pack.info 才是打包后的汇总。当前签名 APP 中解析出的关键内容包括:
json
{
"bundleName": "com.jiaweikan.one12",
"version": {
"code": 1000005,
"name": "1.0.5"
},
"mainAbility": "EntryAbility",
"deviceType": ["phone", "tablet", "2in1"],
"apiVersion": {
"compatible": 22,
"target": 22,
"releaseType": "Release"
}
}
这组值与 AppScope 和主模块一致,说明当前产物没有在版本和主设备范围上偏离源码。解析结果还显示 DailyStudyFormAbility,支持 2*2 与 2*4 卡片。只要商店文案或截图宣传了服务卡片,就必须保证上传的正是包含该扩展能力的包。
六、设备范围要比较四个表面
多设备发布至少有四个表面:
module.json5中的deviceTypes。- 签名 APP 的
pack.info。 - AGC 软件包解析结果和应用信息设备选项。
- 每个设备材料页的截图与图标。

主模块声明如下:
json5
"deviceTypes": [
"phone",
"tablet",
"2in1"
]
因此 AGC 不能只保留手机后就直接提交。如果平台把手机和平板素材合并、把 PC/2in1 单独分组,就要逐个打开可见材料页确认,而不是假设上传一组截图能覆盖全部终端。
七、共享模块的设备差异不能忽略
pack.info 里还有一个容易被主模块汇总掩盖的细节:entry 支持 phone、tablet、2in1,而 libraryb 的 deviceType 只有 phone。
| 模块 | 类型 | 设备 |
|---|---|---|
| entry | entry | phone、tablet、2in1 |
| libraryb | shared | phone |
这不等价于"平板一定不能运行",但它是必须验证的风险。需要确认平板和 2in1 核心流程是否依赖 libraryb,并在相应设备上执行启动、首页、实验和学习流程。如果依赖关系导致包解析或运行差异,应先调整模块设备声明或产品设备范围,不能只改 AGC 勾选项。
八、AGC 上传成功后还要重新选包
AGC 中"软件包上传成功"只说明文件进入包管理,不代表当前版本已经绑定该文件。更新版本时应执行:
text
上传签名 APP
-> 等待平台解析完成
-> 返回版本信息
-> 打开软件包选择
-> 按版本号、上传时间、大小选择目标包
-> 保存版本页面
-> 重新打开确认仍为该包
本次目标文件大小为 2,192,150 字节,版本为 1.0.5 / 1000005。平台可能显示换算后的 MB,但上传时间与版本号仍可联合定位。没有完成"保存后回读",就不能写入发布记录。
九、签名配置只确认存在,不公开秘密
工程包含 HarmonyOS release 签名配置和正式 Profile。复查需要确认配置类型、Profile 与目标应用绑定、产物是 signed APP,但不应该把证书密码、私钥口令或本机敏感路径复制到文章、工单和截图。
json5
{
"name": "release",
"type": "HarmonyOS",
"material": {
"storeFile": "<本机受保护路径>",
"storePassword": "<不输出>",
"keyAlias": "<发布别名>",
"keyPassword": "<不输出>",
"profile": "<与应用绑定的 Release Profile>",
"certpath": "<发布证书>"
}
}
复查结论只写"签名产物存在、文件身份、解析结果和安装验证",不抄录秘密字段。
十、离线声明要从权限、依赖和运行模式四面证明
"化学实验室"在 oh-package.json5 中没有业务依赖,主模块也没有 requestPermissions。对 ArkTS 运行代码的扫描没有发现 HTTP 请求、Web 组件、登录、支付、广告或自建云端接口;资源文件里的 http://www.w3.org/2000/svg 只是 SVG 命名空间,不是网络请求。
json5
{
"dependencies": {},
"devDependencies": {
"@ohos/hypium": "1.0.25",
"@ohos/hamock": "1.0.0"
}
}
不过,进一步检查 ReadingSpeechService.ets 后不能直接得出"所有功能完全离线"的结论。该服务调用系统 CoreSpeechKit,创建语音引擎时明确传入 online: 1:
ts
ReadingSpeechService.engine = await textToSpeech.createEngine({
language: 'zh-CN',
person: 0,
online: 1
})
这条源码事实与异常提示中的"当前设备不支持离线朗读"、隐私政策中的"完全离线运行"并不一致。它不等于应用已经上传个人信息,也不能仅凭这一行推断底层一定由应用直接发起网络请求;但在查清 online 参数的实际语义、系统服务行为和断网表现之前,发布材料不能把语音朗读写成已验证的纯离线能力。
发布前有两条可选路径:
- 若产品坚持完全离线,改为平台支持的本地语音模式,并在断网、无语音资源和不支持设备上验证降级。
- 若朗读依赖在线语音能力,按真实行为修订应用类型、功能说明、隐私材料和审核备注,并核对是否需要额外权限或用户告知。
因此,"没声明 INTERNET"只是证据之一。复查还要看系统 Kit 的运行模式、依赖、原生库、动态加载、第三方 SDK 和真实设备网络行为。
十一、隐私页面必须与真实本地数据一致
PrivacyPolicyPage.ets 说明本地保存实验次数、学习时长、收藏 ID、笔记和偏好,数据位于应用沙箱的 Preferences 中,卸载后由系统清除;页面还提供"我的 -> 设置 -> 清除实验数据"的删除路径。这些本地数据说明能从源码中找到对应实现,但同一页面声称应用"完全离线运行",需要先与语音引擎的 online: 1 对齐。
将这段说明抽象成发布清单,可以得到:
ts
interface PrivacyFacts {
accountRequired: boolean
networkRequired: boolean | 'unknown'
personalDataUploaded: boolean
thirdPartySdk: string[]
localData: string[]
deletionPath: string
}
const privacyFacts: PrivacyFacts = {
accountRequired: false,
networkRequired: 'unknown',
personalDataUploaded: false,
thirdPartySdk: [],
localData: ['实验记录', '学习统计', '收藏', '笔记', '偏好'],
deletionPath: '我的 -> 设置 -> 清除实验数据'
}
AGC 隐私标签、隐私政策、应用类型和审核备注都应从这份事实对象派生,避免同一问题出现互相冲突的答案。
十二、离线应用不等于可以跳过隐私材料
不联网、不注册账号、不上传数据,只能降低处理个人信息的范围,不能替代隐私说明。至少要写清:
- 是否收集个人信息。
- 本地保存哪些数据以及用途。
- 数据保存位置和删除方式。
- 是否集成第三方 SDK。
- 是否申请系统权限。
- 政策更新方式和联系渠道。
本项目已有隐私政策和用户协议页面,但 AGC 还要选择或填写对外可访问的材料。若使用平台托管隐私政策,应保存后重新选择并确认链接可打开,不能只看到编辑页面就认为已经绑定。
十三、应用介绍要与实际功能数量一致
资源文件把应用描述为"13 个经典化学实验的可视化模拟、参数调节与方程式查询,全程离线、无需联网"。用户协议也列出了化学实验、图表、结果保存、收藏、笔记、方程式、常数和单位换算。功能数量与入口可以从源码复核,但"全程离线"目前属于待修正或待验证声明,不能原样复制到商店介绍。
商店介绍应该围绕现有入口写,不要加入源码中没有的在线课程、AI 分析、账号同步或云端实验报告。可使用下列对照表:
| 商店文案 | 源码入口 | 是否可直接体验 |
|---|---|---|
| 13 个化学实验 | 实验室、ExperimentSimPage | 是 |
| 参数调节与图表 | 实验模拟页 | 是 |
| 每日一题、错题本 | 学习页 | 是 |
| 方程式、常数、单位换算 | 学习工具入口 | 是 |
| 实验记录、收藏、笔记 | 我的页面 | 是 |
| 桌面学习卡片 | DailyStudyFormAbility | 需在桌面添加卡片验证 |
文案中的每个名词都应能映射到页面或 Ability。
十四、旧项目自查文档必须退出当前证据链
工程目录中的 应用审核政策50000自检报告.md 写着"物理原理模拟实验""com.jiaweikan.one9""1.0.0",而当前项目是化学实验室 com.jiaweikan.one12 / 1.0.5。即使文档里的权限结论与当前项目恰好相似,它仍不能证明本版本状态。
发布文档应带上可机器校验的头部:
yaml
appName: 化学实验室
bundleName: com.jiaweikan.one12
versionName: 1.0.5
versionCode: 1000005
artifactSha256: 721817B6E38B9833A4DDFFF3586D1E24D4FBC6A936619ECF7CE7E9FA5691B1DE
checkedAt: 2026-07-17
只要其中一项与当前发布对象不同,文档就自动标为历史资料,不进入提交依据。
十五、分层图标需要同时看组合结果和启动窗口
应用图标使用 layered_image.json:背景为 background.png,前景为 foreground.png。逐像素读取显示:背景 1024×1024 且完全不透明;前景存在透明像素,这是分层图标用于组合的正常现象。启动窗口使用独立的 startIcon.png,尺寸 256×256,也存在少量透明像素。
透明本身不能单独决定通过或失败,关键是最终组合后是否有明确、完整、不依赖未知背景的视觉。至少检查:
- 浅色桌面和深色桌面。
- 安装界面与启动窗口。
- 应用市场列表和详情页。
- 手机、平板和 PC/2in1 的缩放效果。
- AGC 应用信息图标是否与包内图标一致。
powershell
Add-Type -AssemblyName System.Drawing
$bitmap = [System.Drawing.Bitmap]::new('startIcon.png')
try {
$transparent = 0
for ($y = 0; $y -lt $bitmap.Height; $y++) {
for ($x = 0; $x -lt $bitmap.Width; $x++) {
if ($bitmap.GetPixel($x, $y).A -lt 255) { $transparent++ }
}
}
"transparentPixels=$transparent"
} finally {
$bitmap.Dispose()
}
像素扫描只负责发现风险,最终仍要看真实渲染。
十六、截图必须覆盖已选择的材料分组
当前源码支持 phone、tablet 和 2in1,因此截图策略不能只准备手机竖屏。更稳的目录是按版本冻结:
text
release-materials/
1.0.5/
icon/
app-icon.png
phone-tablet/
01-home.png
02-lab.png
03-experiment.png
04-learning.png
05-records.png
2in1/
01-home-1920x1080.png
02-lab-1920x1080.png
03-experiment-1920x1080.png
copy/
intro.md
release-notes.md
privacy-facts.json
此次本地扫描没有发现稳定的 design、screenshots 或 materials 发布目录,因此素材是否已在 AGC 保存必须从平台页面回读,不能从仓库推断。后续应把最终上传文件归档到版本目录,避免下一版再次依赖浏览器历史。
十七、截图内容要让审核人员快速走通核心流程
推荐的五张手机/平板截图不是随意挑五个页面,而是一条可理解的使用路径:
| 顺序 | 页面 | 证明的能力 |
|---|---|---|
| 1 | 首页 | 应用定位、核心入口、四主导航 |
| 2 | 实验室 | 实验分类与 13 个实验内容 |
| 3 | 实验模拟 | 参数调节、运行状态和图表 |
| 4 | 学习页 | 每日一题、阅读、方程式和工具 |
| 5 | 我的 | 记录、收藏、笔记、隐私与设置 |
PC/2in1 截图应展示真实宽屏布局,不能把手机截图横向拉伸。图片中不要出现调试浮层、个人联系方式、证书路径或未完成占位文案。
十八、应用类型与地区选择不能靠默认值
只有在包和功能确实不依赖服务器时,才选择单机/本地应用。当前工程没有网络权限和自建服务端依赖,但语音引擎配置为 online: 1,所以现阶段只能确认"主要实验、题库与本地数据流程不依赖业务服务器",不能确认整个应用满足纯单机定位。应先完成断网朗读测试并确认官方 API 语义,再决定 AGC 应用类型。
发布地区也要按真实计划选择。中国大陆单区发布应选择指定国家/地区并只保留目标区域;切换地区后要重新检查隐私输入方式,因为平台可能改变托管政策或 URL 字段。
| 事实 | 当前工程 | AGC 选择 |
|---|---|---|
| 是否依赖服务器 | 待核验语音能力 | 暂不据此确认单机/本地应用 |
| 是否需要账号 | 否 | 审核不需要测试账号 |
| 是否上传个人信息 | 否 | 隐私标签按不收集填写 |
| 是否有付费能力 | 否 | 不勾选付费、订阅或虚拟商品 |
| 发布地区 | 由发布计划决定 | 保存地区后重新回读隐私字段 |
这个表不是永久结论,而是 1.0.5 的版本快照。下一版只要新增一个网络 SDK,就应重新生成,而不是复制本次选择。
十九、内容分级按真实内容填写
化学实验室是本地教育工具,没有社交、UGC、支付、赌博、金融、医疗诊断或受控商品。内容分级问卷应根据实际内容逐项回答,不能为了得到某个年龄结果而反向选择。
应用面向中学生,隐私页面说明不收集未成年人信息,并建议未成年人在监护人指导下使用。商店年龄分级、应用介绍和隐私政策需要保持同一口径。
ts
interface RatingFacts {
userInteraction: boolean
personalDataCollection: boolean
payment: boolean
gambling: boolean
medicalDiagnosis: boolean
educationalSimulation: boolean
}
const ratingFacts: RatingFacts = {
userInteraction: false,
personalDataCollection: false,
payment: false,
gambling: false,
medicalDiagnosis: false,
educationalSimulation: true
}
填表时从事实对象逐项映射;如果平台问题的语义与本地字段不完全相同,应重新阅读题目,而不是机械套用布尔值。
二十、版本更新说明只写本包包含的变化
更新说明应能被当前签名 APP 验证。例如:
text
1. 完善化学实验模拟与参数交互体验。
2. 增加每日一题、错题复习和中考专项练习入口。
3. 优化手机、平板和 PC/2in1 的页面布局。
4. 完善本地记录、收藏、笔记与学习统计。
5. 修复已知稳定性与显示问题。
不要写"新增云同步""接入 AI"或"支持在线课程",因为当前包没有这些能力。更新说明也不能代替测试,写了"优化多设备"就要有三设备证据。
二十一、保存后回读 AGC 字段
AGC 的页面可能保留隐藏表单、旧提示或未保存状态,所以每个阶段都采用"写入 -> 保存 -> 离开 -> 返回 -> 回读"的闭环。

回读时记录:
ts
interface AgcSnapshot {
packageName: string
versionName: string
versionCode: number
packageUploadTime: string
packageBytes: number
devices: string[]
materialGroups: string[]
privacyMode: 'hosted' | 'url'
releaseRegion: string[]
saved: boolean
}
只有 saved 为真、页面重新打开后字段仍一致,才进入最终提交确认。
二十二、安装、启动、核心流和卸载是运行层证据
源码与包解析一致,并不代表运行稳定。发布候选包至少执行一次:
text
安装 signed APP
-> 首次冷启动
-> 首页进入实验室
-> 打开实验并修改参数
-> 开始、暂停、重置实验
-> 保存一次实验结果
-> 完成每日一题
-> 新建并删除一条笔记
-> 打开隐私政策与用户协议
-> 退到后台再恢复
-> 卸载应用
多设备声明要求在相应设备上覆盖核心路径。至少记录设备型号、系统版本、包哈希、开始时间、结果和失败日志。
二十三、服务卡片也要进入发布冒烟
包内包含 DailyStudyFormAbility,默认卡片规格为 2*2,还支持 2*4。主应用能启动不代表卡片可用,额外检查:
- 能否从桌面添加卡片。
- 两种尺寸是否都能正确渲染。
- 点击卡片能否进入正确页面。
- 每日更新时间是否符合预期。
- 主应用数据为空或被清除后,卡片是否有可理解的默认状态。
如果商店素材展示了卡片,这组检查就是发布阻断项。
| 场景 | 操作 | 预期 |
|---|---|---|
| 首次添加 | 添加 2*2 卡片 |
标题、内容和点击入口完整 |
| 尺寸切换 | 更换为 2*4 |
文本不截断,布局不拉伸 |
| 数据为空 | 清除学习记录后刷新 | 显示默认学习提示,不白屏 |
| 点击跳转 | 点击每日一题或阅读入口 | 打开正确页面且返回路径正常 |
| 主应用升级 | 覆盖安装 1.0.5 |
旧卡片仍能加载或自动恢复 |
卡片结果应与主应用使用同一个签名 APP 验证,避免拿开发预览效果代替发布包行为。
二十四、把复查结果分成通过、待平台确认和阻断
此次基于本地工程可得到以下结论:
| 项目 | 状态 | 证据或下一步 |
|---|---|---|
| 包名 | 本地一致 | AppScope 与 pack.info 均为 com.jiaweikan.one12 |
| 版本 | 本地一致 | 均为 1.0.5 / 1000005,仍需比较线上版本 |
| 签名 APP | 已存在 | 记录时间、大小和 SHA-256 |
| 源码时间 | 未晚于 APP | 当前快照无源码晚于产物 |
| 主设备范围 | 本地一致 | entry 为 phone/tablet/2in1 |
| 共享模块设备 | 待验证 | libraryb 只声明 phone |
| 权限与网络 | 存在阻断差异 | 无 requestPermissions 和业务接口,但语音引擎配置 online: 1,需对齐实现与离线声明 |
| 隐私页面 | 已有 | 仍需 AGC 托管/URL 回读 |
| 图标 | 有分层资源 | 启动图标透明像素需真实界面复查 |
| 截图素材 | 待平台确认 | 本地没有稳定版本化素材目录 |
| 旧自查文档 | 阻断引用 | 项目名、包名、版本均属于旧项目 |
"待平台确认"不能写成"已完成","阻断引用"也不能因为内容相似就继续沿用。
二十五、常见故障与处理顺序
| 现象 | 先看哪里 | 处理方式 |
|---|---|---|
| 上传后版本仍显示旧包 | 版本页软件包选择 | 重新选择最新时间与大小的包并保存 |
| AGC 提示设备不一致 | pack.info、应用信息、素材页 | 更新设备信息和对应素材,或缩小真实发布范围 |
| 平板能选但页面异常 | entry 与 shared 模块设备声明 | 查依赖关系并做平板核心流测试 |
| 商店图标与安装图标不同 | AppScope、module、AGC 图标 | 统一源图并在两处保存验证 |
| 离线声明被质疑 | 权限、依赖、网络行为、隐私页 | 提供同版本证据,不能只给文字说明 |
| 更新版本无法识别 | bundleName、versionCode、签名 | 保持包名与签名一致并递增内部版本号 |
| 审核人员找不到核心功能 | 首页入口、样例数据、审核备注 | 让主流程可直接进入并提供清晰步骤 |
| 材料说明与应用不符 | 版本化素材目录 | 删除夸大文案并重新截图 |
排查时先确认发布对象,再修字段。没有固定包身份时,任何页面修改都可能落到错误版本。
二十六、提交前阻断清单
- APP ID、应用名、bundleName 指向同一个 AGC 应用。
-
versionCode=1000005高于线上已发布版本。 - 当前版本绑定的是目标 signed APP,不是旧上传记录。
- 包上传时间、大小和本地 SHA-256 已归档。
- entry、pack.info、AGC 和素材页设备范围一致。
- libraryb 的 phone 限制已在 tablet 与 2in1 核心流中验证。
- phone/tablet 与 PC/2in1 所需图标、截图均已保存并回读。
- 包内图标、启动图标和 AGC 图标视觉一致。
- 应用介绍、13 个实验、学习功能和服务卡片均与包一致。
- 语音引擎
online模式、断网表现、应用类型和"完全离线"文案已经对齐。 - 隐私政策、用户协议、权限、SDK 和离线应用类型一致。
- 内容分级、发布地区、联系方式和发布时间已复查。
- 安装、冷启动、核心流、后台恢复和卸载有运行记录。
- 最终确认框中的版本名、版本号和默认语言正确。
- 遇到短信、验证码、扫码或安全验证时由用户本人完成。
二十七、源码事实与建议实现的边界
为了让发布结论可复核,本次检查把"本地已经观察到的事实"和"仍需平台或设备验证的动作"分开记录:
| 复查项 | 当前源码或产物事实 | 建议实现与验证 |
|---|---|---|
| 应用身份 | bundleName=com.jiaweikan.one12,版本为 1.0.5 / 1000005 |
回读 AGC 当前应用、线上版本号和最终确认框 |
| 签名产物 | 本地存在 one12-default-signed.app,大小、时间和 SHA-256 可复算 |
不代表本轮重新构建成功;提交前用同一文件完成签名校验与安装冒烟 |
| 包内信息 | pack.info 的主模块设备为 phone、tablet、2in1,API compatible/target 为 22 |
回读平台解析结果,并补三类设备的核心流程证据 |
| 共享模块 | 包内第二个模块只列出 phone | 查清依赖关系,在 tablet 与 2in1 上验证;不能仅修改 AGC 勾选项 |
| 权限 | 主模块没有 requestPermissions,没有 INTERNET 声明 |
继续核对系统 Kit、动态能力和真实运行行为 |
| 语音朗读 | ReadingSpeechService 创建引擎时配置 online: 1 |
确认官方语义与断网行为;选择本地模式或修订披露材料 |
| 隐私文本 | 页面声明完全离线、不上传,并说明本地数据与删除路径 | "完全离线"与语音配置存在冲突,修复前不能作为已验证结论 |
| 图标与截图 | 包内有分层图标和启动图标;仓库存在零散截图 | 建立版本化发布素材目录,并在 AGC 保存后逐项回读 |
| AGC 状态 | 本地文件无法证明已选包、素材已保存、隐私链接已绑定或已提交 | 必须在对应平台页面回读;本文不把建议步骤写成已完成结果 |
| 运行结果 | 本轮只做源码、配置和既有产物检查 | 构建、安装、启动、核心流、卡片、后台恢复和卸载仍需真实执行记录 |
这里尤其要避免两个误区:旧签名包存在不等于当前源码刚刚构建通过;本地声明字段一致也不等于 AGC 页面已经保存。发布复查的价值正是保留这些"尚未验证"的边界。
二十八、结语
AppGallery 发布复查不是在提交按钮前再浏览一次表单,而是建立一条跨越源码、签名产物、平台字段和真实运行的证据链。化学实验室这次复查证明了包名、版本和主设备范围在本地清单与既有签名产物中一致,也发现了语音在线模式与完全离线声明冲突、旧项目自查文档串用、共享模块设备范围不同、素材缺少本地版本归档等实际风险。
更稳的发布方法是:先固定唯一发布身份,再解析目标 APP;包内信息一致后,逐项回填并回读 AGC;最后用同一哈希的包完成安装、启动、核心流和卸载。这样即使几周后重新打开项目,也能回答"当时提交的究竟是哪一个包、为什么选择这些设备、隐私声明依据是什么"。
参考资料
- Huawei Developer,提交 HarmonyOS 应用:
https://developer.huawei.com/consumer/cn/app/submit - Huawei Developer,应用审核指南 3.1 兼容性与运行稳定性:
https://developer.huawei.com/consumer/cn/doc/app/50104-03 - Huawei Developer,应用审核指南 2.19 恶意行为:
https://developer.huawei.com/consumer/cn/doc/app/50104-02 - Huawei Developer,通用应用 UX 体验标准:
https://developer.huawei.com/consumer/cn/doc/design-guides/ux-guidelines-general-0000001760708152 - Huawei Developer,AppGallery 上架 FAQ 专题:
https://developer.huawei.com/consumer/cn/forum/subject/2114199480637425001 - 项目清单:
AppScope/app.json5 - 模块清单:
entry/src/main/module.json5 - 打包解析:
build/outputs/default/one12-default-signed.app!/pack.info - 隐私页面:
entry/src/main/ets/views/mine/PrivacyPolicyPage.ets - 用户协议:
entry/src/main/ets/views/mine/UserAgreementPage.ets - 语音服务:
entry/src/main/ets/utils/ReadingSpeechService.ets
AI 辅助声明:本文由 AI 辅助完成源码梳理、结构校对与配图设计,技术结论均以文中列出的本地 ArkTS 源码、配置文件和既有签名产物为依据,并由作者复核后发布。