鸿蒙 In-house应用发布流程

华为应用分发的另一种特殊方式——In-house发布。它面向企业内部网络环境,不经过华为应用市场,直接把应用分发给内部员工。文档涵盖了适用场景、账号申请、打包配置和Deeplink分发全流程。
一、适用场景
In-house 发布仅适用于在企业内部网络环境中分发专属应用给内部员工的场景,In-house 应用不适合在任何公开渠道发布。
核心特点:
-
使用 In-house 发布,无需提交应用至华为应用市场
-
直接将应用发布上传至自己的服务器或者第三方云上
-
内部用户直接下载安装即可,便于更灵活控制版本发布节奏
-
In-house 须具备完善的机制,确保仅限员工下载内部应用,并以私密、安全的方式向组织内员工分发
限制
-
当前 In-house 应用发布仅支持 Stage 模型开发的 HarmonyOS 应用,暂不支持元服务
-
当前 In-house 应用暂不支持使用实况窗服务
二、准备工作
使用 In-house 发布前,需要分别完成账号和应用权限申请。
账号准备步骤
| 步骤 | 说明 |
|---|---|
| 1. 准备一个未实名认证过的华为开发者账号 | 如没有,请注册一个 |
| 2. 完成 In-house 应用分发资格申请 | 用新注册的账号申请 |
| 3. 完成实名认证 | 资格申请审核通过后,可参考《企业开发者(In-house应用分发)实名认证申请指导文档》为账号完成实名认证 |
说明
为什么不能用已实名认证的账号?
为避免权限冲突,需要与原企业账号之间进行权限隔离,故不可使用已实名认证的账号。
账号数量规则:
一个企业主体可以分别实名认证一个普通开发者账号和一个企业开发者(In-house应用分发)账号。一个手机号码或邮箱地址仅支持创建一个账号。
In-house 账号仅可用于以下场景
-
用于调试或发布 In-house 应用,不可用于调试或发布需上架华为应用市场的应用
-
用于指定设备发布。分别申请 In-house 发布证书和指定设备发布 Profile 即可,指定设备发布 Profile 有效期当前为 180 天
其他说明
-
In-house 应用不支持应用转移
-
当 In-house 账号资格审核通过后,后续新增的每款 In-house 应用都需要先申请分发权限,才可以在 AGC 进行打包配置
-
In-house 应用未在应用市场面向所有用户公开发布,账号资格目前仅面向特定主体开放获取
三、发布流程
可以将应用上传至自己的服务器或者第三方云上,内部用户直接下载安装即可。具体发布流程如下:
| 步骤 | 说明 |
|---|---|
| 第一步:准备打包所需配置文件 | 在打包前,需要为应用进行签名,从而保证应用的完整性和来源的真实性。签名时,需要配置相关信息,需要提前做好准备 |
| 第二步:编译打包应用 | 把应用编译打包成待测试版本,后续将包推送给团队成员进行测试 |
| 第三步:构建Deeplink实现下载应用 | 将编译的应用包上传至您的服务器或第三方云上,通过 Deeplink 的方式,使内部用户通过分发页面的下载按钮下载安装应用 |
四、准备打包所需配置文件
为保证应用的完整性和来源的真实性,在打包时,需要为应用进行签名。签名时,需要配置如下相关信息:
| 配置文件 | 格式 | 说明 |
|---|---|---|
| 密钥和证书请求文件 | .p12 + .csr | 密钥格式为 .p12,包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,公钥和私钥用于数字签名和验证;证书请求文件格式为 .csr(全称 Certificate Signing Request),包含密钥对中的公钥和公共名称、组织名称、组织单位等信息,用于申请发布证书。详细生成过程请参见《生成密钥和证书请求文件》 |
| In-house 发布证书 | .cert | 证书是由 AGC 颁发的数字证书,用于验证应用的身份和签名。申请 In-house 发布证书后,请下载到本地保存 |
| In-house 发布 Profile | .p7b | 包含了包名、数字证书信息、申请的权限列表等信息。申请 In-house 发布 Profile 后,请下载到本地保存 |
提醒
请务必保存好密钥文件,以及生成过程中设置的别名、密钥库和密钥的密码。
五、编译打包应用
准备好打包所需配置文件后,即可准备编译打包应用。
步骤一:配置工程签名信息
-
打开 DevEco Studio,顶部菜单栏选择 File > Project Structure,进入工程结构界面
-
导航选择 Project,点击 Signing Configs 页签
-
取消 “Automatically generate signature” 勾选项
-
配置以下签名信息,完成后点击 OK:
| 配置项 | 说明 |
|---|---|
| Store file | 密钥文件,选择之前准备好的密钥 .p12 文件 |
| Store password | 密钥库密码,需与之前生成密钥设置的密钥库密码保持一致 |
| Key alias | 密钥的别名信息,需与之前生成密钥设置的别名保持一致 |
| Key password | 密钥的密码,需与之前生成密钥设置的密码保持一致 |
| Sign alg | 固定设置为 SHA256withECDSA |
| Profile file | 选择准备好的 In-house 发布 Profile |
| Certpath file | 选择准备好的 In-house 发布证书 .cert 文件 |
步骤二:分别编译各 Module
In-house 应用仅支持编译 HAP 和应用内 HSP 包。
编译 HAP 包
-
菜单栏选择 Build > Build Hap(s)/APP(s) > Build Hap(s)
-
等待编译构建完成
-
构建完成后,在各模块的
build > default > outputs > default目录下,获取到XXX-signed.hap文件
编译 HSP 包(仅支持应用内 HSP 包)
-
选中待编译共享包模块
-
菜单栏选择 Build > Make Module ${libraryName}
-
等待编译构建完成
-
构建完成后,在共享包模块的
build > default > outputs > default目录下,获取到*.hsp文件
六、构建Deeplink下载应用
1. 上传应用包
将编译得到的各个 HAP/HSP 包上传至自己的服务器或第三方云上,获取 HAP/HSP 包下载 URL,下载 URL 建议以 https 开头。
2. 生成应用描述文件
基于应用信息生成应用描述文件(例如 manifest.json5,文件名可自定义)。
3. 应用描述文件字段说明
| 属性 | 数据类型 | 必选(M)/可选(O) | 说明 |
|---|---|---|---|
bundleName | 字符串 | M | 应用的 Bundle 名称 |
bundleType | 字符串 | M | 应用的 Bundle 类型,用于区分 HarmonyOS 应用或元服务。当前仅支持配置为 "app",表示 HarmonyOS 应用 |
versionCode | 数值 | M | 应用的版本号 |
versionName | 字符串 | M | 应用版本号的文字描述 |
label | 字符串 | M | 应用的名称,建议与实际应用名称一致,否则会出现下载与安装过程中应用名不一致的问题 |
deployDomain | 字符串 | M | 应用、图标及描述文件的部署域名,需要与 icons、packageUrl 以及描述文件自身下载 URL 中的域名一致,且不可包含协议头或端口号,否则会导致下载失败 |
icons | 字符串 | M | 应用的图标,提供企业内部部署的图片下载地址,建议以 https 开头 |
minAPIVersion | 字符串 | M | 应用运行所需 SDK 的 API 最小版本,用于判断是否与当前设备兼容 |
targetAPIVersion | 字符串 | M | 应用运行所需的 API 目标版本,用于判断是否与当前设备兼容 |
4. Deeplink 构建
将生成的应用程序描述文件上传至您的服务器或第三方云上,并获取该文件的下载 URL。将应用程序描述文件 URL 构建成 Deeplink 用于下载应用。
Deeplink 需满足的条件 :
-
仅支持页面点击行为触发拉起
-
不支持地址栏输入 DeepLink 拉起
-
不支持 HTML 头文件自动拉起
-
仅支持华为浏览器拉起,且从华为浏览器拉起的所有行为,均需判断是否有用户点击行为确认用户点击才允许拉起
DeepLink 格式:
store://enterprise/manifest?url=https://xxx.xxx/xxx.json5
格式 :
| 部分 | 值 |
|---|---|
| Scheme | store:// |
| Host | enterprise |
| Path | manifest |
| 参数 | 应用描述文件上传至服务器后生成的下载 URL,建议以 https 开头。示例:url=https://xxx.xxx/xxx.json5 |
特殊字符处理:
如下载 URL 内含特殊字符,还需进行特殊字符编码:
declare function encodeURIComponent(uriComponent: string | number | boolean): string;
5. 服务器配置要求
| 要求 | 说明 |
|---|---|
| HTTPS 下载链接 | 服务器提供应用描述文件和安装包的 HTTPS 下载链接,并且下载链接中的域名不支持 IP 地址 |
| HEAD 请求支持 | 应用描述文件和安装包的下载链接,均需要支持通过 HEAD 方式请求返回文件大小 |
| 自签证书要求(如使用) | • 用户设备需要安装服务器自签证书对应的 CA 证书 • 自签证书有效期不超过 13 个月,超期请及时更换 |
| 分片下载能力 | 配置服务器支持分片下载能力。验证方式:构造下载请求头包含 range 字段,返回码为 206 表示支持分片下载;反之则不支持 |
| 响应头配置 | 配置服务器返回的响应头,使得应用描述文件和应用包可正确传输下载 |
6. 分发页面实现下载功能
在分发页面实现下载功能,使华为浏览器解析 Deeplink,触发应用的下载安装流程。
HTML 示例代码:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Button Open DeepLink Example</title>
<script>
function openDeepLink() {
let url = 'store://enterprise/manifest?url=https://xxx.xxx/xxx.json5';
window.open(url, '_parent');
}
</script>
</head>
<body>
<button onclick="openDeepLink()">下载</button>
</body>
</html>
7. 应用更新场景(openlink 方式)
对于应用更新场景,可以使用 openlink 方式直接拉起下载安装。
private openDeepLink(deeplink: string): void {
// deeplink 格式具体见开发文档
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
context.openLink(deeplink).then(() => {
console.info('openlink success.');
}).catch((error: BusinessError) => {
console.error('openlink failed.');
});
}
七、应用被阻止运行的处理
如果应用已安装成功,但被阻止运行,请在 “设置 > 系统 > 企业设备和应用管理 > 企业应用管理” 中找到您的 In-house 应用,点击 “允许”。
不同设备的差异
| 设备类型 | 说明 |
|---|---|
| 普通设备 | 若应用尚未进行联网验证,点击“允许”时检测到无网络或内网环境,会提示需要先联网验证才可运行。请检查网络设置后重试 |
| 纳管设备 | 若应用尚未进行联网验证,点击“允许”时检测到无网络或内网环境,应用可豁免联网验证,直接完成信任授权即 |
八、In-house 发布 vs 指定设备发布
| 对比项 | In-house 发布 | 指定设备发布 |
|---|---|---|
| 面向对象 | 企业内部员工 | 开发团队内部成员 |
| 规模 | 文档未明确上限 | 安装设备上限 100台 |
| 分发方式 | 服务器/第三方云 + Deeplink | 服务器/第三方云 + Deeplink |
| 证书类型 | In-house 发布证书(.cert) | 发布证书(.cer)或 In-house 发布证书 |
| Profile | In-house 发布 Profile | 指定设备发布 Profile |
| 账号要求 | 未实名认证过的华为开发者账号 + In-house 应用分发资格 | 企业开发者 |
| 支持应用类型 | 仅 Stage 模型 HarmonyOS 应用,不支持元服务 | HarmonyOS NEXT 应用,不支持元服务 |
| 实况窗服务 | 暂不支持 | 文档未提及 |
| 应用转移 | 不支持 | 文档未提及 |
整体来看,In-house 发布适合企业内部专属应用的分发场景,比如企业内部办公工具、定制业务系统等。流程是:申请账号和资格 → 准备签名配置 → 编译打包 → 生成描述文件 → 上传服务器 → 构建 Deeplink → 分发页面触发下载。需要注意的是账号门槛较高、每款应用都要单独申请权限、技术限制较多,建议提前规划好账号和应用清单。
更多推荐




所有评论(0)