maq
maq
  • 发布:2025-09-08 13:07
  • 更新:2025-09-08 15:23
  • 阅读:3829

鸿蒙企业应用内部分发打包教程

分类:鸿蒙Next

使用 HBuilderX 开发 uni-app (x) 应用,可以很容易地构建出一款鸿蒙应用。

多数开发者都是要通过华为的应用商店来发布自己的应用,但是也有开发者是为企业开发的内部应用,在这个场景下,只需要把应用的安装包分发给特定的少数用户就可以了。

华为的应用商店也支持这个场景,即非公开发布:开发者可以将不适合公开分发的应用以非公开方式在华为应用市场上发布,使其仅可通过链接被用户发现。

不过,对于开发者而言,要发布这样的应用有一定的资质要求,每次发版的时候也是要走流程,要接受审核,好处就是可以享受华为应用商店的分发服务。

所以,有些开发者希望能绕过这个发布流程,通过自有的下载服务直接向使用者提供安装包,即:内部分发

HBuilderX 的开发流程是可以支持内部分发模式的,只不过有些环节需要手动操作来配合。

本文假设读者已经熟悉了 HBuilderX 开发鸿蒙应用的基本操作,下面我们就一步一步来看怎么实现应用的内部分发。

先说一下内部分发的局限性:

  • 要有自己的下载服务,可以是自建的 Web Server,也可以是购买的云服务。

  • 内部分发的目标用户是事先确定的(要先采集到他们的设备唯一标识),每个安装包可以分发给最多 100 个设备。

要实现内部分发,需要以下几个步骤:

一. 准备数字签名相关资料。

二. 用 HBuilderX 以【运行到鸿蒙】的方式得到 .hap 安装包。

三. 编写内部分发所需要的相关文件,并上传到服务器供用户下载。

下面详细说明每个步骤。我将使用 DCloud 官方提供的开源项目 hello-uni-app-x 来演示操作。

一. 准备数字签名相关资料

在 HBuilderX 里面打开项目的 manifest.json 文件,进入【鸿蒙App配置】,点击调试证书那个【配置】按钮。

弹出了【配置调试证书】的对话框:

能看到这里有个【自动申请调试证书】的按钮,但是,不要点击它!
因为用调试证书签名的安装包只能使用 hdc 命令安装到开启了开发者选项的手机上,这不是我们想要的。

我们需要自己到 AppGallery Connect 网站上手动申请用于内部测试的证书文件,然后再填写到这个对话框里。

注意上面的对话框里面有个【运行设备-检测】按钮,只要把开启了开发者选项的手机连接到电脑上,点击这个按钮就可以采集到设备标识。

完整的手动申请证书的操作可以看鸿蒙的官方文档,我这里只简要介绍一下步骤:

这一步需要留意的是你使用的应用包名。

所有需要参与内部分发的手机都要先采集到设备标识,并 提交到 AppGallery Connect,后续申请 profile 文件时需要它们。

这一步你将得到一个私钥库文件(.p12)和一个证书申请文件(.csr)。
请记住你使用的密码,有两个(一个是访问私钥库的密码,另一个是访问私钥的密码,但一般都使用相同的密码)。
也请记住你使用的私钥别名,这些在最后填写【配置调试证书】的时候都会用到。

这一步需要上传 .csr 文件,你将得到一个发布证书文件(.cer),下载到本地备用。

这一步你将得到一个 profile 文件(.p7b),下载到本地备用。
【类型】请选择【内部测试】,【证书】就选择上一步得到的发布证书,【设备】请选上所有需要参与内部分发的手机,你应该已经把它们都提交过了。

做完上面这几步,你就可以回到 HBuilderX 中,打开【配置调试证书】对话框,把所有的内容都填好并保存。
【运行设备】那里只要有当前连接的设备就好了,对于最后生成的 .hap 没有影响。

二. 用 HBuilderX 以【运行到鸿蒙】的方式得到 .hap 安装包

在 HBuilderX 里面点击菜单项【运行>运行到手机或模拟器>运行到鸿蒙】,弹出运行对话框,选择好运行设备,点击【运行】按钮。

正常来说,应用就可以在手机上运行起来了,而你在 HBuilderX 控制台里面可以看到下面这些内容:

红框里的目录就是用于构建鸿蒙运行包的鸿蒙工程目录,在里面能够找到已签名的运行包:

对于内部分发而言,这个运行包就是所需要的安装包了,你可以把它改成一个更合适的名字(比如 my-internal-app.hap)备用。

请记住这个 app-harmony 目录,下一步有些需要的东西得在这个目录里找。

三. 编写内部分发所需要的相关文件,并上传到服务器供用户下载

这里假定你的服务器域名为 www.my-server.com

1. 先上传两个文件,并得到下载链接。

把前面得到的安装包(.hap)上传到你的服务器,得到对应的下载链接,比如 https://www.my-server.com/my-internal-app.hap

再准备两个图片文件,作为下载安装过程中显示的图标。按照鸿蒙官方文档的说法,需要准备一大一小两个图标,但我没有找到关于具体规格的说明,索性就直接用 app-harmony/AppScope/resources/base/media/foreground.png 这个文件把两者都代替了。
上传后也是得到了下载链接,比如 https://www.my-server.com/foreground.png

2. 编写一个内部分发描述文件 manifest.json5

须按照 鸿蒙官方文档 的指导编写这个文件。

由于这个文件编写好之后还需要进行签名,所以我们暂且保存为文件名 manifest-unsigned.json5,签名后将得到 manifest.json5

其中有几个属性值可以从 app-harmony/AppScope/app.json5 文件里找到:

  • bundleName
  • versionCode
  • versionName

还有几个属性需要特别说明一下:

  • minAPIVersiontargetAPIVersion

app-harmony/build-profile.json5 文件中找到 app.products 数组,在里面找到 compatibleSdkVersion 值(可能有多个,但应该是相同的值),把 minAPIVersiontargetAPIVersion 都填成这个值就行了。

  • deployDomain

这个是将来用于提供下载服务的域名,填写你自己实际的服务域名即可,比如前面说的 www.my-server.com

  • icons 里面的 normallarge

这里填写的是将来下载时显示的图标的网址,就填写前面上传图标文件得到的链接地址。

  • modules

此项看上去比较复杂,需要参照 app-harmony/build-profile.json5 文件中的 modules 来改写,每个打包出来的独立模块都要在这里填写。

但实际上,多数情况下构建产物里只会有一个模块,就是主模块(该模块的 nametype 都是 entry),也就是前面提到的 .hap 文件。

  • modules 里面的 packageUrlpackageHash

这里的 package 指的就是前面得到的安装包 .hap 文件,packageUrl 填写的是将来下载安装包时使用的网址,packageHash 填写的是这个安装包文件的 SHA256 哈希值。

  • sign

这一项是对这个描述文件本身的签名,无需手动填写,下一步将使用签名工具来生成它。

写好的 manifest-unsigned.json5 文件大体上会是下面这个样子:

{  
  "app": {  
    "bundleName": "io.dcloud.uniappx",  
    "bundleType": "app",  
    "versionCode": 10907,  
    "versionName": "1.9.7",  
    "label": "Hello uni-app x",  
    "deployDomain": "www.my-server.com",  
    "icons": {  
      "normal": "https://www.my-server.com/foreground.png",  
      "large": "https://www.my-server.com/foreground.png"  
    },  
    "minAPIVersion": "5.0.1(13)",  
    "targetAPIVersion": "5.0.1(13)",  
    "modules": [  
      {  
        "name": "entry",  
        "type": "entry",  
        "deviceTypes": ["phone", "tablet", "2in1"],  
        "packageUrl": "https://www.my-server.com/my-internal-app.hap",  
        "packageHash": "27005caa60761b863fbf0fbcd0f96159386de038f59102f0ec676532cd49b084"  
      }  
    ]  
  }  
}

3. 对描述文件 manifest.json5 做签名并上传。

先下载 签名工具,注意其中的 manifest-sign-tool-1.0.0.jar,用 java 执行它:

java -jar "<manifest-sign-tool-1.0.0.jar的绝对路径>" \  
-operation sign \  
-mode localjks \  
-inputFile "<前面编写的manifest-unsigned.json5文件的绝对路径>" \  
-outputFile "<将要生成的manifest.json5文件的绝对路径>" \  
-keystore "<私钥库.p12文件的绝对路径>" \  
-keystorepasswd <私钥库密码> \  
-keyaliaspasswd <私钥密码> \  
-privatekey <私钥别名>

这样就会得到包含签名的 manifest.json 文件,上传到服务器,得到对应的下载链接,比如 https://www.my-server.com/manifest.json5

4. 编写一个网页文件并上传。

编写一个 index.html 文件,内容如下:

<!DOCTYPE html>  
<html lang="zh-CN">  
  <head>  
    <meta charset="UTF-8"/>  
    <meta name="viewport" content="width=device-width, initial-scale=1"/>  
    <title>企业内部分发</title>  
    <script>  
      function openDeepLink() {  
        let url ='store://enterprise/manifest?url=https://www.my-server.com/manifest.json5'  
        window.open(url, '_parent')  
      }  
    </script>  
  </head>  
  <body>  
    <button onclick="openDeepLink()">下载安装</button>  
  </body>  
</html>

注意里面的下载链接,要替换成你自己实际的链接地址。

index.html 文件上传到服务器,得到对应的下载链接,比如 https://www.my-server.com/index.html

好了,大功告成!

下面只要告诉参与内部分发的用户,用手机里面的鸿蒙官方浏览器打开这个网址,就可以点击其中的按钮下载安装了。

你也可以把这个网址做成二维码,让用户使用手机的浏览器扫码访问,这样会更方便。

1 关注 分享
DCloud_CHB

要回复文章请先登录注册

maq

maq (作者)

回复 用户2866989 :
估计是不行。这种绕过官方应用商店的分发模式,肯定是要受到特别限制的。
2025-09-08 15:23
用户2866989

用户2866989

提前采集UDID,客户量比较大(不方便单独去采集设备id),还想实现内部分发,有方法吗?
2025-09-08 15:11