Appearance
10_Engineering/12 - 上架与发布
1. AppGallery 上架流程概览
开发完成 → 签名打包 → 提交审核 → 审核通过 → 上架发布 → 用户下载
│ │ │ │ │ │
代码审查 .app 包 AGC 提交 人工审核 AppGallery 安装运行2. 上架前准备
2.1 签名证书
| 证书类型 | 用途 | 有效期 | 获取方式 |
|---|---|---|---|
| Debug 证书 | 本地调试 | 自动过期 | DevEco Studio 自动创建 |
| Release 证书 | 上架发布 | 3-5 年 | AppGallery Connect 创建 |
| 测试证书 | 内部测试 | 3 年 | AppGallery Connect 创建 |
2.2 证书创建步骤
1. 登录 AppGallery Connect (https://appgallery.huawei.com)
2. 进入我的项目 → 凭证 → 证书管理
3. 生成 CSR (Certificate Signing Request)
- DevEco Studio → Project Structure → Signing Configs
4. 上传 CSR → 下载 .cer 证书
5. 导出 .p12 密钥文件
6. 配置到 build-profile.json52.3 签名配置
json5
// build-profile.json5
{
"app": {
"signingConfigs": [
{
"name": "release",
"type": "HarmonyOS",
"material": {
"certpath": "/path/to/release.cer",
"storeFile": "/path/to/release.p12",
"signAlg": "SHA256withECDSA",
"storePwd": "${STORE_PASSWORD}", // 从环境变量读取
"keyPwd": "${KEY_PASSWORD}",
"keyAlias": "release_key"
}
}
]
}
}3. 打包配置
3.1 release 构建配置
json5
// entry/build-profile.json5
{
"buildOptionSet": [
{
"name": "release",
"arkOptions": {
"sourceMap": false,
"obfuscation": {
"ruleOptions": {
"enable": true,
"includes": ["**/*.ets"]
},
"minifyOptions": {
"enable": true,
"byteCodeHAR": true,
"removeUnused": true,
"collapse": true,
"stringOptimization": true,
"stringEncryption": true
}
}
}
}
]
}3.2 构建 Release 包
bash
# 构建 Release 包
hvigorw assembleApp --product=release --mode=RELEASE
# 构建 APK(用于真机测试)
hvigorw assembleApk --product=release --mode=RELEASE
# 产物位置
# entry/build/outputs/app-release/app-release.app3.3 包信息检查
bash
# 查看包信息
hvigorw appInfo
# 输出示例:
# Bundle Name: com.example.myapp
# Bundle Version: 1.0.0 (1000000)
# Min API Version: 11
# Max API Version: 12
# Supported Devices: phone, tablet
# Signature: release
# Package Size: 15.2 MB4. AppGallery Connect 发布
4.1 创建应用
1. 登录 AppGallery Connect
2. 我的项目 → 创建项目
3. 填写应用信息:
- 应用名称:我的应用
- Bundle Name:com.example.myapp
- 图标:1024x1024
- 分类:工具
- 年龄分级:3+
4. 上传 Release 证书指纹
5. 生成应用 ID4.2 应用元数据配置
json5
// app.json5
{
"app": {
"bundleName": "com.example.myapp",
"vendor": "example",
"versionCode": 1000001,
"versionName": "1.0.1",
"icon": "$media:app_icon",
"label": "$string:app_name",
"minAPIVersion": 11,
"compatibleSdkVersion": "11",
"targetAPIVersion": 12,
"signingCertificateFingerprints": [
{
"type": "SHA256",
"value": "AB:CD:EF:12:34:56:..."
}
]
}
}4.3 应用截图与描述
| 物料 | 要求 | 说明 |
|---|---|---|
| 应用图标 | 1024x1024 PNG | 无圆角要求 |
| 截图 | 至少 2 张 | 640x960 ~ 2000x3000 |
| 应用描述 | 详细功能说明 | 中英文各一份 |
| 隐私政策 | 链接或文档 | 必须提供 |
| 年龄分级 | 填写问卷 | 3+/7+/12+/16+/18+ |
4.4 发布版本管理
版本类型 说明 审核时间
─────────────────────────────────────────────
Alpha 内部测试版 快速(~1天)
Beta 公开测试版 快速(~2天)
Production 正式发布版 标准(~3-5天)
Draft 草稿版本 不审核5. 版本管理
5.1 版本号规范
| 版本类型 | 格式 | 示例 |
|---|---|---|
| versionName | 语义化版本 | 1.0.0 |
| versionCode | 递增整数 | 1000001 |
json5
// app.json5
{
"app": {
"versionCode": 1000001,
"versionName": "1.0.1",
// versionName → versionCode 映射
// 1.0.0 → 1000000
// 1.0.1 → 1000001
// 1.1.0 → 1001000
// 2.0.0 → 2000000
}
}5.2 发布策略
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 全量发布 | 一次性发布给所有用户 | 小版本更新 |
| 灰度发布 | 按百分比逐步放量 | 大版本/新功能 |
| 分批发布 | 按地区/运营商分批 | 多地区应用 |
| A/B 测试 | 不同用户不同版本 | A/B 实验 |
6. 审核规范
6.1 AppGallery 审核要点
| 审核项 | 要求 | 常见问题 |
|---|---|---|
| 功能完整性 | 应用需能正常使用 | 功能缺失、崩溃 |
| 隐私合规 | 需明确隐私政策 | 隐私政策缺失 |
| 权限申请 | 权限需有正当理由 | 过度权限 |
| 内容安全 | 无违规内容 | 违规信息 |
| 性能 | 启动时间、内存占用 | 性能问题 |
| UI/UX | 界面美观、交互合理 | UI 粗糙 |
6.2 隐私政策要求
json5
// module.json5 - 权限声明
{
"module": {
"permissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "用于获取网络数据"
},
{
"name": "ohos.permission.INTERNET",
"reason": "用于展示广告",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "always"
}
}
]
}
}json5
// app.json5 - 隐私政策链接
{
"app": {
"privacyPolicy": "https://example.com/privacy",
"thirdPartyServices": [
{
"name": "Analytics",
"url": "https://analytics.example.com",
"description": "数据分析"
}
]
}
}7. 上架检查清单
7.1 技术检查清单
□ 签名证书配置正确
□ versionCode 递增
□ 无 Debug 日志
□ 无测试数据/后门
□ 包体积符合要求(< 200MB)
□ 无崩溃/ANR
□ 内存泄漏检测通过
□ 启动时间 < 3s
□ 多设备适配完成
□ 国际化资源完整
□ 权限声明合理
□ 隐私政策到位7.2 审核前自查
| 项目 | 状态 | 备注 |
|---|---|---|
| 应用功能完整 | □ | |
| 无崩溃 | □ | |
| 权限最小化 | □ | |
| 隐私政策 | □ | |
| 敏感信息清除 | □ | 删除测试数据 |
| 广告合规 | □ | |
| 内容审核 | □ | |
| 截图素材 | □ | |
| 版本更新日志 | □ |
8. 发布后管理
8.1 AppGallery Connect 后台
| 功能 | 说明 |
|---|---|
| 版本管理 | 管理 Alpha/Beta/Production 版本 |
| 数据分析 | 下载量、活跃度、崩溃率 |
| 用户反馈 | 用户评论和处理 |
| 崩溃分析 | Crash 分析和修复 |
| A/B 测试 | 功能对比测试 |
8.2 更新策略
typescript
// 检查应用更新
import { updateManager } from '@kit.AbilityKit';
async function checkForUpdate(): Promise<boolean> {
const updateInfo = await updateManager.getUpdateInfo();
if (updateInfo.updateAvailable) {
// 有新版本
updateManager.requestUpdate({
updateType: updateInfo.updateType,
forceUpdate: false,
minimumPackageSize: '10MB',
});
return true;
}
return false;
}9. 面试高频考点
Q1: AppGallery 上架流程?
回答要点:
- 创建 AppGallery Connect 项目
- 配置签名证书
- 构建 Release 包
- 提交审核(Alpha → Beta → Production)
- 审核通过后上架
Q2: 版本号和 versionName 的区别?
回答要点:
- versionName 是语义化版本(1.0.0)
- versionCode 是递增整数(1000000+)
- versionCode 必须递增,否则无法发布
- versionName 用户可见,versionCode 系统内部使用
Q3: AppGallery 审核重点关注什么?
回答要点:
- 功能完整性(无崩溃、无缺失功能)
- 隐私合规(隐私政策、权限说明)
- 权限合理性(最小化原则)
- 内容安全(无违规内容)
- 性能(启动时间、内存)
10. Android 对比
| 概念 | Android | HarmonyOS |
|---|---|---|
| 应用市场 | Google Play | AppGallery |
| 上架流程 | Play Console 提交审核 | AGC 提交审核 |
| 证书格式 | JKS/BKS | .p12/.cer |
| 包格式 | APK/AAB | .app |
| 版本管理 | versionCode 递增 | versionCode 递增 |
| 审核时间 | 1-3 天 | 3-5 天 |
| 灰度发布 | Play Console | AGC 分批发布 |