Skip to content

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.json5

2.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.app

3.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 MB

4. AppGallery Connect 发布

4.1 创建应用

1. 登录 AppGallery Connect
2. 我的项目 → 创建项目
3. 填写应用信息:
   - 应用名称:我的应用
   - Bundle Name:com.example.myapp
   - 图标:1024x1024
   - 分类:工具
   - 年龄分级:3+
4. 上传 Release 证书指纹
5. 生成应用 ID

4.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 对比

概念AndroidHarmonyOS
应用市场Google PlayAppGallery
上架流程Play Console 提交审核AGC 提交审核
证书格式JKS/BKS.p12/.cer
包格式APK/AAB.app
版本管理versionCode 递增versionCode 递增
审核时间1-3 天3-5 天
灰度发布Play ConsoleAGC 分批发布