【万能转换器|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明
本轮证据边界:包名、版本、设备类型、权限列表和离线实现来自本轮复核的本地源码;原文中的构建、安装或历史检查记录只作为历史证据,本轮没有重新执行构建、安装、AGC 上传、软件包绑定或审核提交。发布流程与候选包检查属于建议实现,不能据此推断平台审核状态。
当前阻断项:
BRAND_FEEDBACK_EMAIL与BRAND_COPYRIGHT_OWNER仍为占位值。账号所有者必须在候选包产生前替换为真实且合规的信息;本文不会展示、收集或保存对应私密身份数据。
HarmonyOS 应用进入 AppGallery Connect 之前,最危险的错误往往不是 ArkTS 编译错误,而是多个“看起来都正确”的信息没有指向同一个版本:源码里叫“万能转换器”,说明文档写成“万能转换器 Pro”;工程版本是1.0.0,后台却绑定了另一份同版本软件包;模块只声明phone,素材却按平板一起提交;页面宣称完全离线,备份配置却允许系统备份恢复;图标尺寸正确,但背景层仍带透明像素。任何一项单独看都不复杂,组合起来却会让审核人员无法判断“这是不是同一个应用”。
本文基于“万能转换器”的真实 HarmonyOS 工程做一次发布前复查。源码可确认:bundleName为com.hmapp.universalconverter,versionCode为1000000,versionName为1.0.0;入口模块仅声明phone;requestPermissions为空;生产依赖为空;应用、Ability 和品牌常量使用“万能转换器”;单位换算、汇率、历史、收藏和设置都在本地完成。与此同时,源码也暴露出四个必须在候选包产生前处理的风险:README 名称仍为“万能转换器 Pro”,反馈邮箱与版权主体仍是占位值,备份配置与“数据只保存在当前设备”的强声明存在语义差异,分层图标背景包含透明像素。
本文面向 HarmonyOS 5.0 及以上版本,讨论的是“源码快照如何形成可复核的上架证据链”,不会把队列中的“1.0.0 已上架”元数据当成当前源码包已经上传、绑定、提交或审核通过的证据。本次也没有登录 AGC、没有修改后台、没有构建或安装候选包,因此不会虚构发布结果、审核状态或真机稳定性结论。
唯一标记:
AGC18-HMOS-18-20-APPGALLERY-RELEASE-REVIEW-PACKAGE-MATERIALS
一、先划清六个发布状态
“源码里是 1.0.0”只能证明源码配置,不代表平台上的 1.0.0 就是它。一次可靠发布至少要区分六个对象:
| 对象 | 能证明什么 | 不能证明什么 |
|---|---|---|
| 源码快照 | 配置、功能和资源的当前状态 | 已构建、已测试 |
| 构建产物 | 某次构建生成了 APP/HAP | 已安装、可启动 |
| 候选包 | 被选定用于发布的签名产物 | 已上传 AGC |
| 已上传包 | AGC 接收到一个软件包 | 版本页已绑定该包 |
| 已绑定版本 | 版本页选择并保存了目标包 | 已提交审核 |
| 审核/上架状态 | 平台真实流程结果 | 当前仓库与线上包一致 |
因此,发布复查不能只看app.json5,也不能只看 AGC 页面。正确做法是给源码、候选包和后台版本建立同一条身份链,并把每一步的证据保留下来。队列中的appId=6917604619777068417和“1.0.0 已上架”可以作为待核对目标,但在没有回读公开页和后台绑定记录之前,不应写成本文的实测结论。
二、身份矩阵从 AppScope 开始
AppScope/app.json5是当前源码的产品级身份入口,真实配置如下:
{ "app": { "bundleName": "com.hmapp.universalconverter", "vendor": "hmapp", "versionCode": 1000000, "versionName": "1.0.0", "icon": "$media:layered_image", "label": "$string:app_name" } }复查时应把bundleName、versionCode、versionName、图标资源和名称资源抄入身份矩阵,而不是靠记忆在 AGC 中填写。尤其要注意versionName是展示版本,versionCode是递增标识;只改展示名称而沿用已经分发过的版本代码,通常不能形成一个新的升级版本。
建议在发布单中固定以下字段:
bundleName = com.hmapp.universalconverter versionName = 1.0.0 versionCode = 1000000 module = entry ability = EntryAbility deviceTypes = phone这些值随后还要与候选包解析结果、AGC 应用条目、版本页和公开页逐项比对。
三、应用名称出现了真实漂移
工程资源EntryAbility_label的值是“万能转换器”,BrandConfig.ets中的BRAND_APP_NAME也是“万能转换器”,队列标题同样使用这个名称。但 README 开头仍写“万能转换器 Pro”。这不是文案偏好问题,而是发布身份漂移。
审核人员会从桌面名称、启动页、应用内“关于”、隐私政策、软件介绍、截图和版权材料识别应用。若“Pro”只存在于文档或后台,而包内没有该名称,用户会怀疑下载了错误版本;若“Pro”暗示收费、高级功能或差异化权益,风险更高。
发布前应确定唯一正式名称,然后同步:
AppScope的app_name资源;EntryAbility_label与桌面展示;BrandConfig.ets和“关于”页面;- README、隐私政策、用户协议;
- AGC 中文名称、简介、截图和版权材料。
本文以源码多数证据支持的“万能转换器”为准,并把 README 的“Pro”列为待修复项,不替开发者猜测品牌决策。
四、模块能力决定设备范围
entry/src/main/module.json5中的关键字段为:
{ "module": { "name": "entry", "type": "entry", "mainElement": "EntryAbility", "deviceTypes": ["phone"], "deliveryWithInstall": true, "installationFree": false, "requestPermissions": [] } }这里给出三个明确结论。第一,当前包只声明手机,不应仅凭页面看起来能拉伸,就在 AGC 中勾选平板或 2in1。第二,它是随安装交付的普通应用模块,不是免安装元服务。第三,没有申请权限,和离线工具定位基本一致。
设备类型不是营销范围,而是实现、软件包声明、截图素材和测试证据的交集。如果未来希望支持折叠屏、平板或电脑,需要先修改工程能力与自适应布局,再完成对应设备的窗口变化、横竖屏、系统栏、键鼠输入和素材验证,最后才扩大平台设备范围。
五、包名不能只在后台“看起来一样”
包名com.hmapp.universalconverter是应用升级关系、签名与平台条目的关键标识。复查应包含三次读取:
- 从当前源码的
AppScope/app.json5读取; - 从最终候选 APP 包的解析信息读取;
- 从 AGC 目标应用和版本页回读。
任何一次不一致都应停止发布。不能因为应用名称相同,就把候选包绑定到另一个应用条目;也不能通过复制工程后只改名称、不改包名来建立新应用。本文只完成了第一层源码读取,没有读取最终签名包和 AGC 页面,因此结论是“源码目标包名明确”,而不是“后台绑定已经正确”。
六、版本号还要和应用内展示对齐
当前AppScope的版本为1.0.0 / 1000000,BrandConfig.ets的BRAND_VERSION_NAME也是1.0.0,应用内“关于”页面会显示这个常量。两处暂时一致,但这套设计仍有维护风险:版本号被复制到了两个文件,下一次升级可能只改其中一处。
更稳妥的工程方案是让应用内版本显示读取包信息,或在构建阶段由单一版本源生成品牌常量。若暂时不改架构,发布检查单至少要把以下断言自动化:
AppScope.versionName == BrandConfig.BRAND_VERSION_NAME candidate.versionName == AppScope.versionName candidate.versionCode == AppScope.versionCode AGC.boundPackageHash == candidatePackageHash最后一条最重要。同一个版本名可能被多次上传,后台列表中往往同时存在旧包和新包。必须按上传时间、文件大小、版本代码及可用的哈希证据选中最新目标包,并保存版本页后再回读。
七、图标尺寸正确不等于图标合规
当前分层图标由layered_image.json组合:
{ "layered-image": { "background": "$media:background", "foreground": "$media:foreground" } }四个相关 PNG 都是1024×1024,尺寸符合当前 HarmonyOS 分层应用图标的基本要求。但像素复查发现:
| 文件 | Alpha 范围 | 非完全不透明像素 | 判断 |
|---|---|---|---|
background.png | 64~255 | 2047 | 背景层不合规风险 |
foreground.png | 0~255 | 926642 | 前景透明属于正常设计能力 |
app_icon.png | 64~255 | 2047 | 单层导出仍有透明边缘 |
startIcon.png | 64~255 | 2047 | 启动图标需复查 |
华为最新图标文档明确要求分层图标的背景层为纯色且不能包含透明像素;前景层则通常需要透明 PNG。这里的问题不在前景,而在background.png的 2047 个半透明像素。很可能是设计导出时保留了边缘抗锯齿或圆角透明边,这与“无需自行裁圆角,由系统生成遮罩”的规则冲突。
发布前应重新导出完全不透明的正方形背景层,并重新生成单层展示素材。不要只在图片查看器里肉眼认为“看不出透明”,应直接检查 Alpha 极值是否为255~255。
八、包内图标和 AGC 图标必须一致
图标有两个表面:软件包内资源,以及 AGC 应用信息中上传的展示素材。即使包内图标修复了透明背景,如果后台仍沿用旧图,也会形成不一致;反过来,只换后台图标而不更新包内桌面图标,同样可能被审核或用户识别为两个产品。
复查方法不是比较文件名,而是比较视觉内容和源文件版本:
- 用修复后的
background.png + foreground.png生成候选图标; - 从最终软件包导出平台实际使用的图标;
- 生成 AGC 要求尺寸的上传素材;
- 在浅色、深色、桌面、设置列表、安装页和启动页检查;
- 截图保存包内展示与 AGC 预览;
- 确认无自行圆角、透明底、模糊拉伸和系统图标仿冒。
当前源码只能证明资源存在,不能证明 AGC 已上传同一图标,也不能证明设备实际展示正常。
九、启动页也属于品牌一致性
EntryAbility配置使用startIcon和start_window_background。启动页发生在 ArkUI 首帧之前,审核人员和用户会先看到它。若启动页图标与桌面图标不同、背景对比不足或存在透明边缘,应用内部再精致也无法弥补第一印象。
当前startIcon.png与app_icon.png都是 1024×1024,且检测到相同数量的半透明像素。这提示它们很可能来自同一导出源。修复时应从统一设计母版重新生成,而不是分别手工填边,否则会出现轮廓、缩放或色彩偏差。
还要在真机冷启动、后台无快照返回和进程销毁后的退出动效中验证启动页,而不是只看资源文件。
十、素材范围必须服从 phone 声明
因为当前deviceTypes只有phone,发布素材应围绕手机真实界面准备。至少覆盖:
- 首页或工具入口;
- 单位转换核心流程;
- 实用计算器;
- 历史记录或收藏;
- 设置、隐私政策或关于页面。
截图应来自候选包或与候选包完全一致的真实界面,不应使用无法在应用中到达的概念图。汇率换算必须避免“实时汇率”“在线更新”等字样,因为源码使用内置静态参考汇率。历史最多 200 条、税费采用特定年度表、生肖按公历年计算等边界,也不应在宣传文案中被包装成无限、实时或权威结果。
如果 AGC 只选择手机,就不要提交平板拉伸图来暗示多设备支持;如果以后扩设备,应为每个素材组补齐真实截图。
十一、离线声明有四层证据
“完全离线”不能只靠一句宣传语。当前工程提供了较完整的四层证据:
| 层级 | 当前证据 | 结论 |
|---|---|---|
| 权限 | requestPermissions: [] | 未申请网络或敏感权限 |
| 依赖 | oh-package.json5无生产依赖 | 未发现运行时第三方 SDK |
| 代码 | 搜索未发现网络请求 API | 当前业务没有主动联网路径 |
| 文案 | 隐私政策说明静态汇率、本地处理 | 用户可理解离线边界 |
这四层彼此吻合,说明“离线单位换算与实用计算工具”是有源码支撑的定位。发布信息可以写“不申请网络权限,核心换算与计算在本地完成”,但不应扩大为“绝不产生任何系统级数据流动”,因为系统备份配置仍需单独说明。
十二、静态汇率要避免实时暗示
ExchangeForm.ets明确使用CalcEngine.CURRENCIES内置静态汇率表,不发起网络请求。README 还说明这是约 2024 年参考汇率。因此,正确的商店表述应是“支持离线汇率参考换算”或“使用内置参考汇率”,并在页面中给出非实时、仅供参考的提示。
以下表述不应出现:
实时汇率 每日自动更新 连接全球金融市场 提供交易级准确结果这既是功能真实性问题,也是离线声明的一致性问题。若未来接入在线汇率,需要重新检查网络权限、域名、隐私政策、数据处理、错误态、缓存策略和 AGC 隐私标签,不能只换一个接口。
十三、系统备份让“仅本机”需要更准确
backup_config.json的真实配置是:
{ "allowToBackupRestore": true }模块还注册了EntryBackupAbility,虽然当前回调只记录日志,没有自定义上传逻辑,但“允许系统备份恢复”与“数据只保存在当前设备、绝不会迁移”的绝对表述并不完全等价。Preferences 中的历史、收藏和设置是否进入系统备份范围,需要结合系统默认行为、备份配置和目标版本实测确认。
发布前有两条可选路径:
- 产品确实允许系统备份恢复:在隐私说明中准确披露系统能力及数据范围;
- 产品坚持严格本机不迁移:关闭不需要的备份能力,并验证升级和恢复行为。
不能一边保留allowToBackupRestore: true,一边在平台和应用内作无法兑现的绝对承诺。
十四、占位联系方式是明确阻断项
BrandConfig.ets目前仍包含:
export const BRAND_FEEDBACK_EMAIL = 'your-real-email@example.com'; export const BRAND_COPYRIGHT_OWNER = '开发者名称';应用内“反馈与建议”、用户协议、隐私政策和“关于”页面都会使用这些值。EntryAbility虽然能检测占位符并输出警告,但不会阻止构建,因此一个可编译的包仍可能把示例邮箱和“开发者名称”带进商店。
这两项必须在候选包构建前替换为真实、可联系且与开发者主体一致的信息,并进入自动门禁:
if (email.includes('example.com') || owner === '开发者名称') { throw new Error('Release identity placeholders remain'); }这不是为了追求代码洁癖,而是为了让隐私主体、版权材料、AGC 开发者信息和应用内文本能够互相验证。
十五、生产依赖为空仍要检查最终包
oh-package.json5只有@ohos/hypium与@ohos/hamock两个开发依赖,没有生产依赖。这支持“无第三方运行时 SDK”的判断,但发布复查不能到此为止。
最终包还可能包含本地 HAR、系统能力引用、资源或构建脚本注入内容。因此应对候选包做成分和权限解析,并与源码清单比较。若 AGC 隐私标签填写“未集成第三方 SDK”,证据应来自最终包扫描,而不只是根目录配置。
本文没有解析最终候选包,所以只表述为“当前包管理配置未声明生产依赖”,不把它写成已通过平台 SDK 检测。
十六、审核指南 3.1 需要真实生命周期证据
源码配置正确不能替代运行稳定性。发布候选包至少应完成一次标准闭环:
- 安装候选 APP;
- 冷启动并进入首页;
- 完成单位转换;
- 完成一个计算器流程;
- 添加历史与收藏;
- 切换设置并重启验证恢复;
- 打开隐私政策和关于页面;
- 切后台、恢复、返回和退出;
- 卸载应用。
还要观察崩溃、闪退、白屏、冻结、无响应、路由失效、按钮重复触发和系统栏可读性。README 当前把单元测试和真机验证标为未完成,因此本文不能声称 Guideline 3.1 已通过,只能把它列为发布门禁。
十七、审核指南 2.19 也要做负向确认
当前工程无网络权限、无广告、无推送、无账号、无支付,代码形态较简单,未发现需要后台常驻、悬浮窗、自动启动或干预其他应用的业务理由。这降低了恶意行为审查风险,但仍应在最终包中确认:
- 没有隐藏入口或动态加载绕过;
- 没有未经用户触发的后台任务;
- 没有干预其他应用或系统功能;
- 没有使用未公开接口或漏洞式方案;
- 没有与功能无关的权限和 SDK。
“功能简单”不是免检理由。发布复查需要保存最终包扫描结果,并让所有系统能力都能对应到可见、可逆、用户主动触发的场景。
十八、建立可执行的发布清单
把本文发现转成门禁后,建议使用如下清单:
| 门禁 | 当前状态 | 发布要求 |
|---|---|---|
| 包名 | 源码为com.hmapp.universalconverter | 与候选包、AGC 一致 |
| 版本 | 源码为1.0.0/1000000 | 与包内、版本页一致 |
| 名称 | 源码“万能转换器”,README 含 Pro | 统一后再构建 |
| 设备 | 仅phone | AGC 与素材仅选手机 |
| 权限 | 空数组 | 最终包复核仍为空 |
| 依赖 | 无生产依赖 | 最终包扫描确认 |
| 图标 | 1024 方图,背景有透明像素 | 背景 Alpha 全 255 |
| 联系方式 | 示例邮箱 | 替换真实值 |
| 版权主体 | 占位值 | 与开发者资质一致 |
| 离线声明 | 基本一致 | 补充静态汇率与备份边界 |
| 测试 | 源码有用例,未见本次报告 | 执行并保存报告 |
| 真机冒烟 | README 未勾选 | 完成安装到卸载闭环 |
清单中的“当前状态”只描述本文实际读取的证据。每项完成后还要附文件、截图、报告或包哈希,避免口头勾选。
十九、AGC 操作必须保存后回读
进入 AGC 后,应先核对目标 App ID、包名和开发者主体,再编辑应用信息。上传新包后不能停在“上传成功”,必须回到版本页打开包选择器,按版本代码、上传时间和大小选择目标包,保存,再重新进入页面确认绑定结果。
同样,图标、截图、隐私、国家地区、内容分级、版权信息和设备类型每次修改后都要看可见预览或保存状态。遇到短信、验证码、扫码、安全验证、法律确认或最终不可逆提交,应停止自动化并由账号持有人处理。
本文没有进行这些后台操作,因此没有 AGC 截图、版本绑定或公开 URL,也没有把任何字段写成“已验证”。
二十、结论:先让每一份证据指向同一个包
“万能转换器”的发布基础相当清晰:包名与版本明确,当前只支持手机,权限数组为空,运行时依赖为空,核心换算与计算具备离线实现,应用内也提供了隐私与关于入口。真正需要优先处理的不是再写一段宣传文案,而是修复四个可复核风险:
- 统一“万能转换器”和“万能转换器 Pro”的名称;
- 把分层图标背景改为完全不透明,并同步包内与 AGC 素材;
- 替换反馈邮箱和版权主体占位符;
- 明确系统备份恢复与“本地保存”声明的边界。
随后再生成唯一候选包,执行测试和安装启动核心流程卸载闭环,解析包内身份,上传并绑定到正确 AGC 版本,最后回读公开页面。只要任一步缺少证据,就停留在对应状态,不把“已构建”写成“已上架”,也不把历史队列元数据写成当前源码的审核结果。
官方资料可参考华为开发者的 提交 HarmonyOS 应用、应用图标配置与开发、应用图标设计规范、AppGallery Connect 概览、应用市场审核政策、审核指南 3.1 兼容性与运行稳定性 与 审核指南 2.19 恶意行为。平台规范会更新,具体字段、素材和流程应以提交当日官方文档与 AGC 页面为准。
AI 辅助声明:本文在人工核对真实 HarmonyOS 工程配置、页面文案与本地实现后,使用 AI 辅助整理结构、润色表达并生成配图;工程能力、发布阻断项与验证边界均以文中列出的源码证据为准。
CSDN-SERIES:ALL-163250315