
HarmonyOS 应用准备提交 AppGallery Connect 时最危险的往往不是某一个字段不会填而是工程、安装包、平台资料和用户可见文案分别正确组合起来却互相矛盾。例如应用介绍写“完全离线”module.json5却声明了网络权限平台勾选平板和 2in1应用虽然能安装但页面仍永远走手机底部导航AppGallery 上传了新版图标软件包中的分层图标还是旧素材版本名称看起来相同真正参与升级判断的versionCode却没有递增。本文以真实的“中国方言题库”HarmonyOS 工程为复查对象。当前源码位于D:\huawei\one11应用身份为com.example.one11versionName为1.0.2versionCode为10000003目标设备包含phone、tablet、2in1。项目采用 ArkTS、ArkUI 和 Stage 模型题库主体数据保存在应用内本地学习记录由数据服务管理听音题优先创建离线 TTS 引擎失败后会尝试在线 TTS因此工程声明了ohos.permission.INTERNET。这组事实决定了复查结论它可以描述为“题库与学习记录以本地能力为主核心答题流程不依赖账号和业务服务器”但不能在未补充限定语时写成“完全离线、绝不联网”。发布资料必须忠于代码而不是忠于最省事的宣传口径。本文只记录可由当前源码、资源和本地配置复核的事实。没有登录 AppGallery Connect 回读在线字段也没有把“本地复查通过”写成“平台审核通过”。发布状态、审核结论、下载量和平台数据均不在本文虚构。一、先把发布复查定义成一致性验证AppGallery 发布并不是单一动作而是四份事实的汇合源码事实应用真正实现了什么调用了哪些 Kit访问了哪些数据包内事实包名、版本、设备类型、权限、图标、入口 Ability 和签名后的安装行为平台事实AGC 中的应用信息、分发设备、版本包绑定、隐私标签、截图和分类用户事实详情页文案、隐私政策、首次启动体验和应用内“关于”页面向用户表达了什么。复查不是把四份表格分别打勾而是逐项寻找跨层冲突。最有用的问题不是“这里填了吗”而是同一个结论能否同时被源码、包、AGC 页面和用户界面证明本文采用的唯一核验标记是发布复查不是寻找一个正确字段而是消除四份事实之间的冲突它也可以作为发布记录、草稿回读或流水线审计时的正文定位标记。二、第一道门包名、应用 ID 和版本必须指向同一对象2.1 源码中的应用身份当前AppScope/app.json5的关键字段如下{ app: { bundleName: com.example.one11, vendor: JiaWeiKang, versionCode: 10000003, versionName: 1.0.2, icon: $media:layered_image, label: $string:app_name } }其中bundleName是识别应用身份的核心字段versionName是用户可见版本versionCode是整数版本序号。发布复查时不能只盯着1.0.2因为平台判断升级关系时还要依赖递增的版本序号。本次队列资料中记录的应用 ID 为6917605760559571316包名为com.example.one11。由于本文没有登录 AGC 在线页面能得出的结论仅是“本地队列和源码包名一致”仍需在真正提交前进入目标应用重新核对 APP ID、包名和租户账号避免在相似名称的应用下上传错误软件包。2.2 为什么版本复查要同时看两个数字推荐为每次候选包留下这样一条记录appName 中国方言题库 bundleName com.example.one11 versionName 1.0.2 versionCode 10000003 sourceCommit 当前候选源码提交 packageHash 构建产物哈希如果只保存文件名例如entry-default-signed.app几天后很难证明它对应哪次修复。最稳妥的方式是在构建完成后再从实际产物或 AGC 包解析结果回读版本而不是仅根据源码文件推断上传成功。2.3 上传新包不等于版本已切换发布后台常见的状态至少包括软件包已经上传软件包解析成功当前版本已选择该软件包当前版本信息已保存已提交审核预审核中审核中已上架或被驳回。这些状态不能互相替代。上传新包之后要回到版本页面确认当前版本真正绑定的是最新候选包并通过版本号、上传时间、文件大小或包解析信息完成回读。本文没有执行该在线步骤因此不会宣称已经替换或提交任何版本。三、第二道门设备类型不是三个勾选框当前entry/src/main/module.json5声明deviceTypes: [ phone, tablet, 2in1 ]这意味着发布资料、截图组和运行验证都应覆盖这三类设备范围。平台勾选设备类型时必须与包能力一致反过来包声明支持某设备也不能只凭“能安装”就认定适配完成。3.1 当前源码已经做了哪些多设备准备EntryAbility.ets注册了断点系统并读取顶部系统避让区和底部导航指示区UserDataManager.init(this.context) BreakpointSystem.register()窗口创建后代码监听avoidAreaChange把避让高度写入AppStorage。Index.ets再通过private bottomSafePadding(): number { return Math.max( Sizes.BOTTOM_NAV_MIN_PADDING, this.getUIContext().px2vp(this.navigationIndicatorHeightPx) ) }保证底部导航至少保留既定安全距离。这个实现对手机手势区和不同系统导航模式是有价值的真实适配点。HomePage.ets还通过页面宽度决定题库区域是否采用三列网格private useGridLayout(): boolean { return this.currentBp lg this.pageWidth 700 }因此首页内部已经具备大宽度布局分支。3.2 真实源码里仍有一个必须列入复查的分支问题Index.ets的主结构当前写成if (this.currentBp sm || this.currentBp md || this.currentBp lg) { // 手机模式底部导航 } else { // 平板/折叠模式侧边导航 内容区 }如果断点系统只会产生sm、md、lg那么else侧边导航分支实际上不可达。也就是说模块声明支持平板和 2in1并不自动证明平板一定显示侧边导航。发布复查必须把“设备声明”和“运行时分支”连起来验证设备场景期望核验当前源码证据手机竖屏底部导航、手势区避让已有底部安全区计算手机横屏/小窗文本不溢出、操作可达需运行复核平板横竖屏内容区利用宽度首页有大宽度网格2in1 调整窗口导航结构随断点变化侧边导航条件需重点复核系统深色模式锁定浅色后局部不反色EntryAbility 有固定色彩模式逻辑所以发布资料中可以如实写“支持 phone、tablet、2in1”但提交前应完成真机或模拟器的窗口缩放验证不能只依据deviceTypes数组。四、第三道门离线声明必须和权限、Kit 以及降级路径一致4.1 工程为什么存在网络权限当前模块声明了requestPermissions: [ { name: ohos.permission.INTERNET } ]进一步检查PracticePage.ets可以找到真实原因this.ttsEngine await textToSpeech.createEngine({ language: zh-CN, person: 0, online: 0 })离线 TTS 创建失败时代码会尝试this.ttsEngine await textToSpeech.createEngine({ language: zh-CN, person: 0, online: 1 })因此“完全不使用网络”与当前代码不一致。更准确的发布描述应该是题库内容、答题、错题、收藏、笔记和学习记录以本地数据为主听音题优先使用离线语音能力在设备离线语音不可用时可能尝试在线语音能力。语音不可用不会阻断题目文字内容与答题流程。这个表述同时对应了权限声明、TTS 创建策略和页面降级行为。4.2 “本地主流程”与“完全离线”不是同义词可以用三层模型审查网络声明层级判断条件本项目结论核心业务数据题库是否必须从服务器下载否题目在本地源码数据中用户学习数据是否依赖账号或云端同步当前源码以本地管理为主辅助能力是否存在联网 Kit 或在线降级有TTS 在线兜底所以“无需登录即可完成核心练习”是可核验的“永不联网”则不是。4.3 隐私声明不应只复制权限名称隐私资料应解释为什么需要网络能力什么用户动作会触发核心功能在失败时是否可用是否收集、上传或保存个人信息本地学习记录如何清除第三方 Kit 或 SDK 是否处理个人数据。华为隐私保护文档强调公开透明、数据最小化、用户控制、安全和本地优先。对本项目而言最关键的是不要因为题库主体在本地就忽略在线 TTS 这一真实网络路径也不要在没有源码证据时声称上传了用户答案或设备信息。五、第四道门图标必须同时核对包内资源与 AGC 素材当前app.json5和module.json5都指向$media:layered_image分层定义为{ layered-image: { background: $media:background, foreground: $media:foreground } }工程在AppScope/resources/base/media和entry/src/main/resources/base/media中都保存了背景、前景和分层定义。复查不能只看到文件存在还要检查AppScope 图标与 entry 图标是否来自同一设计背景是否为明确、不依赖透明像素的设计前景是否清晰是否被重复裁圆角Launcher、安装页、启动窗口和 AppGallery 展示是否一致浅色、深色背景下是否仍能辨认AGC 上传图标是否与软件包中的图标一致。华为当前的应用图标配置文档明确要求包内正确预置图标且 AGC 上传图标应与软件包图标一致图标不应模糊、拉伸或压缩。项目还单独配置了startWindowIcon因此启动窗口也应纳入一致性截图而不能只查看桌面图标。六、第五道门截图不是装饰图而是当前版本的可验证证据该项目历史复盘已经记录过截图问题旧截图出现标题裁切、模拟器外框、虚拟题量和横竖屏混用。这个经验直接转化为发布门槛6.1 同一设备组的基本规则使用当前最新候选包同一组尺寸一致、方向一致不混入旧版本虚拟题量不保留模拟器外框、调试悬浮窗或敏感信息至少展示三个不同核心功能标题、状态栏、底部导航和主要按钮完整可见。6.2 中国方言题库适合展示的真实页面推荐截图组合首页真实题量、地区覆盖、继续练习题库页六类题库和真实章节答题页题干、选项、解析或听音入口报考页按真实题量生成模拟卷学习统计或收藏页本地进度、错题和收藏。截图文字必须和实际数据源一致。当前工程曾因题量显示与实际内容不一致返工因此不能为了“看起来丰富”在详情页素材中写入源码无法支撑的数字。七、把复查做成可执行流水线7.1 步骤一冻结候选源码先确认这次发布对应的源码状态记录提交、分支和变更范围。工作区有无关改动时不要把它们误打入候选包也不要为了清理环境而覆盖他人的修改。7.2 步骤二读取身份和能力清单建立机器可读清单{ bundleName: com.example.one11, versionName: 1.0.2, versionCode: 10000003, deviceTypes: [phone, tablet, 2in1], permissions: [ohos.permission.INTERNET], networkReason: 在线 TTS 兜底, coreDataMode: 本地题库与本地学习记录 }这个清单不是平台填写值的替代品而是所有平台字段的对照基线。7.3 步骤三构建并验证实际产物推荐使用项目已有构建链路生成候选 APP并记录构建命令 实际执行的 assembleApp/assembleHap 命令 构建结果 passed / failed 产物路径 实际候选包 文件大小 构建后读取 哈希 SHA-256 签名状态 仅记录是否有效不记录密码和证书私密信息本文没有在本次写作过程中重新执行完整构建、安装和卸载所以这些结果不能被写成“已通过”。发布人员应在正式提交前补齐实际证据。7.4 步骤四运行安装—启动—核心流程—卸载冒烟至少覆盖安装候选包 首次启动进入 SplashPage 跳转 Index 进入题库 完成一道普通题 触发一题听音题 网络不可用时验证降级 收藏或记录学习进度 退出并重新进入 卸载应用HarmonyOS 审核关注兼容性和运行稳定性。仅有编译成功不能证明没有启动崩溃、白屏、路由失败、卡死或权限循环。7.5 步骤五回读 AGC 当前版本在平台中逐项回读当前应用名称、APP ID、包名当前版本绑定的软件包版本名和版本号设备类型语言、分类、标签和更新说明图标与每个设备组截图隐私声明、权限用途、SDK 列表付费、登录、广告、账号、联网等实际情况分发国家和地区内容分级与资质。遇到短信、验证码、扫码、安全验证、法律确认或最终不可逆提交应停止自动化由账号持有人完成确认。八、用“差异表”替代凭感觉复查下面这张表适合直接放进版本发布记录复查项源码/包事实AGC 应填写用户文案结论包名com.example.one11同包名目标应用通常不展示本地一致版本1.0.2 / 10000003绑定同版本包关于页需一致待平台回读设备phone/tablet/2in1勾选同范围描述不夸大需运行适配网络INTERNET如实声明本地主流程TTS 可能联网不能写完全离线图标layered_image与包内一致启动/关于一致待平台目视截图当前真实 UI各设备组上传不出现虚拟数据待候选包重拍数据题库与记录本地为主隐私标签如实填可说明无需账号需覆盖清除路径差异表的价值在于它会主动暴露“某一列没有证据”的位置。例如源码声明三类设备但没有平板截图有网络权限但应用介绍写完全离线平台上传了新图标但包内仍是旧资源。只看单列时这些问题都不明显。九、当前工程复查得到的真实结论9.1 已能从源码确认包名为com.example.one11用户可见版本为1.0.2整数版本号为10000003设备类型声明为 phone、tablet、2in1应用入口为 Stage 模型EntryAbility首屏加载pages/SplashPage应用使用本地题库和本地学习数据服务底部安全区已接入窗口避让区首页存在大宽度网格布局模块声明了网络权限听音题离线 TTS 失败后会尝试在线 TTSTTS 失败不会阻断文字答题弹窗AppScope 与 entry 均使用分层图标配置。9.2 当前仍需要发布前确认实际 APP 候选包是否由当前源码构建候选包签名和安装是否有效versionCode是否高于平台现有线上包AGC 当前版本是否真正绑定最新候选包三类设备在运行时是否都达到可用布局侧边导航分支是否符合断点系统实际输出包内图标与 AGC 图标是否视觉一致截图是否来自当前版本并覆盖真实功能隐私声明是否解释在线 TTS 兜底断网、无离线 TTS、重复点击和窗口缩放是否稳定安装、启动、核心流程和卸载冒烟是否通过。9.3 不能据此宣称不能宣称本次已登录 AGC 并完成在线复查不能宣称已经提交审核或通过审核不能宣称完全离线不能宣称所有平板和 2in1 布局已经实机通过不能宣称任何下载量、PV、点赞、收藏或平台推荐结果。十、一个适合团队落地的发布门禁可以把发布门禁拆成五个明确结果Gate A Identity 包名、APP ID、版本名、版本号一致 Gate B Capability 设备、权限、Kit、数据路径与资料一致 Gate C Experience 安装、启动、核心流程、返回、异常、卸载通过 Gate D Material 图标、截图、文案、隐私、分类、分级一致 Gate E Platform 最新候选包已选中并保存提交状态已回读每个 Gate 只能记录passed、failed或not run。不要使用“应该没问题”“以前通过过”“大概是最新版”这类不可复核表达。十一、常见误区与修正误区一版本名没变也能覆盖上传修正同时核对versionName和递增的versionCode再从平台解析信息回读。误区二声明设备类型就等于完成适配修正把每种设备映射到布局分支、截图组和冒烟用例。当前工程尤其要复核侧边导航分支的可达性。误区三本地题库就可以写完全离线修正继续搜索权限、Kit、在线降级、统计 SDK、广告、推送和账号能力。当前工程存在在线 TTS 兜底因此必须限定描述。误区四AGC 图标好看就够了修正平台图标、AppScope、entry、Launcher 和启动窗口一起核对避免包内外不一致。误区五旧截图只是 UI 相同继续用也没关系修正截图中的数据、版本、状态栏、安全区和内容都可能过期。应从当前候选包重新采集。误区六上传成功就是发布成功修正上传、解析、选包、保存、提交、预审、审核和上架是不同状态每一步都应回读。十二、结语中国方言题库的发布复查揭示了一个很典型的工程事实应用主体确实是本地题库学习记录也以本地为主但听音能力存在在线 TTS 兜底模块确实声明支持三类设备首页也有宽屏网格但主导航的侧边分支仍要结合断点输出验证。把这些差异写清楚比给应用贴一个“离线、多端、已适配”的标签更有价值。真正可靠的 AppGallery 发布流程不是把后台表单填满而是让源码、候选包、平台字段和用户承诺形成闭环。只有当每个结论都能回到真实文件、真实包、真实页面和真实运行证据时发布复查才算完成。参考资料https://developer.huawei.com/consumer/cn/appgallery/https://developer.huawei.com/consumer/cn/app/submit/https://developer.huawei.com/consumer/cn/doc/doccenter-architecture/bpta-app-privacy-protectionhttps://developer.huawei.com/consumer/cn/doc/doccenter-feature-dev/bpta-app-icon-configurationhttps://developer.huawei.com/consumer/cn/doc/app/50104-03https://developer.huawei.com/consumer/cn/doc/app/50104-02华为开发者联盟应用市场接入与应用上架华为开发者联盟提交 HarmonyOS 应用HarmonyOS 开发者应用隐私保护HarmonyOS 开发者应用图标配置与开发华为应用市场审核指南兼容性与运行稳定性相关条款华为应用市场审核指南恶意软件及行为相关条款创作声明本文基于真实 HarmonyOS 工程进行源码复查内容由作者整理并使用 AI 辅助完成结构梳理与文字校对所有源码能力、配置字段和未执行项均按可复核证据描述。