【化学实验室|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明

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 卡片。只要商店文案或截图宣传了服务卡片,就必须保证上传的正是包含该扩展能力的包。

六、设备范围要比较四个表面

多设备发布至少有四个表面:

  1. module.json5 中的 deviceTypes。
  2. 签名 APP 的 pack.info。
  3. AGC 软件包解析结果和应用信息设备选项。
  4. 每个设备材料页的截图与图标。

主模块声明如下:

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 参数的实际语义、系统服务行为和断网表现之前,发布材料不能把语音朗读写成已验证的纯离线能力。

发布前有两条可选路径:

  1. 若产品坚持完全离线,改为平台支持的本地语音模式,并在断网、无语音资源和不支持设备上验证降级。
  2. 若朗读依赖在线语音能力,按真实行为修订应用类型、功能说明、隐私材料和审核备注,并核对是否需要额外权限或用户告知。

因此,"没声明 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,也存在少量透明像素。

透明本身不能单独决定通过或失败,关键是最终组合后是否有明确、完整、不依赖未知背景的视觉。至少检查:

  1. 浅色桌面和深色桌面。
  2. 安装界面与启动窗口。
  3. 应用市场列表和详情页。
  4. 手机、平板和 PC/2in1 的缩放效果。
  5. 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;最后用同一哈希的包完成安装、启动、核心流和卸载。这样即使几周后重新打开项目,也能回答"当时提交的究竟是哪一个包、为什么选择这些设备、隐私声明依据是什么"。

参考资料

  1. Huawei Developer,提交 HarmonyOS 应用:https://developer.huawei.com/consumer/cn/app/submit
  2. Huawei Developer,应用审核指南 3.1 兼容性与运行稳定性:https://developer.huawei.com/consumer/cn/doc/app/50104-03
  3. Huawei Developer,应用审核指南 2.19 恶意行为:https://developer.huawei.com/consumer/cn/doc/app/50104-02
  4. Huawei Developer,通用应用 UX 体验标准:https://developer.huawei.com/consumer/cn/doc/design-guides/ux-guidelines-general-0000001760708152
  5. Huawei Developer,AppGallery 上架 FAQ 专题:https://developer.huawei.com/consumer/cn/forum/subject/2114199480637425001
  6. 项目清单:AppScope/app.json5
  7. 模块清单:entry/src/main/module.json5
  8. 打包解析:build/outputs/default/one12-default-signed.app!/pack.info
  9. 隐私页面:entry/src/main/ets/views/mine/PrivacyPolicyPage.ets
  10. 用户协议:entry/src/main/ets/views/mine/UserAgreementPage.ets
  11. 语音服务:entry/src/main/ets/utils/ReadingSpeechService.ets

AI 辅助声明:本文由 AI 辅助完成源码梳理、结构校对与配图设计,技术结论均以文中列出的本地 ArkTS 源码、配置文件和既有签名产物为依据,并由作者复核后发布。

相关推荐
传奇开心果编程3 小时前
【Compose Multiplatform跨端声明式UI实用技术】第20课:CMP跨平台经典示例深度解析
kotlin·移动开发·跨平台·编程语言理论·开发范式·编程框架·声明式ui
特立独行的猫A4 小时前
仓颉语言cj-tauri 框架开发鸿蒙应用指南:从建工程到鸿蒙PC实战
harmonyos
贾伟康4 小时前
【化学实验室|19】HarmonyOS ArkTS 回归测试实战:覆盖启动、空数据、异常输入和重复点击
软件测试·移动开发·harmonyos·arkts·arkui
熊猫钓鱼>_>5 小时前
精准碰一碰近场分享与拖拽投送实战:把文件“碰“进另一台设备【鸿蒙心迹】
开发语言·华为·harmonyos·鸿蒙·openharmony
成渝丶5 小时前
自动发布如何避免重复提交:三个检查点
软件测试·自动化
三掌柜6666 小时前
06|鸿蒙7·端侧AI实战:提示注入,守住指令边界
人工智能·华为·harmonyos
HarmonyOS_SDK9 小时前
【HarmonyOS SDK Skills】快速适配鸿蒙窗口智感旋转能力
harmonyos
马剑威(威哥爱编程)10 小时前
【HarmonyOS 7 小艺智能体实战】02:动工前的清单——账号、资质、工具链一次备齐
人工智能·华为·harmonyos