0
0
0

鸿蒙造物者之路 11 · 出师

文章摘要
|

续写章节|沿用「造物者」系列的武侠讲解体,面向电子信息 / 嵌入式方向的新手

=================前情提要===============

从 SHT30 的 I2C 时序,穿过 HDF 驱动、NAPI 桥梁,一路跑到 ArkTS 界面上——26.5°C 这个数字,我等了整整十章。

"下一章,"老陈说,“把你的东西,变成别人能装、能用的产品。”

HAP 包、签名、元服务、上架。最后这一公里。

========================================


这一章你会得到什么

🎯 学完这一章,你应该能:

  • ☐ 分清 HAP / HAR / HSP 三种包,知道什么时候用哪个
  • ☐ 搞懂签名四件套(.p12 / .csr / .cer / .p7b)都是什么、谁生成
  • ☐ 走通上架流程,知道被拒的八大原因
  • ☐ 理解元服务是什么,什么样的功能适合做成元服务
  • ☐ 对生态现状和就业方向有自己的判断(书里给你判断方法,不给你画饼)

**🧰 需要准备:**一个能跑的项目 + 华为开发者帐号。

**⏱ 预计用时:**约 3 小时

📊 难度:★★☆☆☆ 流程性的东西,照做就行


一、先搞清楚:你编译出来的到底是什么

"你每次点运行,DevEco 生成的那个文件是什么?"老陈问。

“……一个 HAP?”

"对,但只对了一半。"老陈打开构建产物目录:

entry/build/default/outputs/
├── default/
│   ├── entry-default-unsigned.hap     ← 未签名
│   └── entry-default-signed.hap       ← 已签名(调试签名)
└── ...

“HAP,Harmony Ability Package,鸿蒙应用的基本安装单元。”

他在白板上写了三个词:

HAP  —— 能装的(应用包)
HAR  —— 编译时用的(静态库)
HSP  —— 运行时用的(动态共享包)

1.1 HAP:能装进设备的那个

“**HAP 是可以被安装、被运行的模块包。**一个应用可以有一个或多个 HAP。”

MyApp.app(上架用的总包,App Pack)
  ├── entry.hap        ← 【必装】主模块,应用的入口
  ├── camera.hap       ← 【可选】相机功能模块
  ├── settings.hap     ← 【可选】设置模块
  └── wearable.hap     ← 【可选】手表模块
HAP 类型 说明 数量
entry 主模块,必须有一个,应用入口 1 个
feature 功能模块,可以按需下载 0~N 个

“为什么要拆成多个 HAP?”

"为了按需下载。"老陈说,“你的应用有 200 MB,但用户只用其中三个功能——没必要让他全下。feature HAP 可以在用户用到的时候再下载。”

1.2 HAR:静态共享包

“HAR(Harmony Archive)是编译期的共享包,类似于 Android 的 AAR。”

┌─────────────────────────────────────────┐
│  HAR(静态共享包)                         │
├─────────────────────────────────────────┤
│  · 包含 ArkTS 代码、C++ 代码、资源、配置    │
│  · 编译时【复制】进每个引用它的 HAP          │
│  · 多个 HAP 都引用 → 每个 HAP 里都有一份     │
│  · 结果:包体变大,但运行时无依赖             │
└─────────────────────────────────────────┘
// entry/oh-package.json5
{
  "name": "entry",
  "version": "1.0.0",
  "dependencies": {
    "@ohos/my-utils": "file:../libs/myutils",     // ← 引用本地 HAR
    "@ohos/network":  "^1.2.0"                     // ← 引用三方库
  }
}

“什么时候用 HAR?”

“**当你想把代码分享给别人、或者做成公共库的时候。**比如你写了一个通用的网络请求封装,打包成 HAR,其他项目直接引用。”

1.3 HSP:动态共享包

“HSP(Harmony Shared Package)是运行时的共享包。”

┌─────────────────────────────────────────┐
│  HSP(动态共享包)                         │
├─────────────────────────────────────────┤
│  · 编译时【不复制】,运行时共享              │
│  · 多个 HAP 引用同一份 → 只有一份            │
│  · 结果:包体更小,但依赖运行时环境           │
│  · 支持动态加载                            │
└─────────────────────────────────────────┘

1.4 一张表决定用哪个

维度 HAR HSP
打包方式 编译期复制进 HAP 运行时共享
包体大小 多处引用 → 变大 多处引用 → 变小
独立性 独立,不依赖别的包 依赖宿主
动态加载 ❌ 不支持 ✅ 支持
适用场景 发布到仓库给外部用 同一个应用内部多模块共享
上手难度 简单 稍复杂

“口诀:对外分享用 HAR,内部复用用 HSP。”

二、元服务:不用安装的"轻应用"

“鸿蒙有个很特别的东西——元服务(以前叫原子化服务)。”

2.1 它是什么

┌──────────────────────────────────────────┐
│  传统应用 vs 元服务                         │
├──────────────────────────────────────────┤
│  传统应用:  要下载、要安装、有图标、占空间   │
│  元服务:   【免安装】、无桌面图标、即点即用  │
│             通过卡片/扫码/负一屏/智慧搜索进入 │
└──────────────────────────────────────────┘

“**用户体验是这样的:**他在负一屏看到一张’快递到了’的卡片,点开就能看物流详情——全程没有安装任何东西。”

2.2 硬限制

“元服务有严格的大小限制,这是为了保证’秒开’:”

项目 限制
单个 HAP 大小 一般 ≤ 2 MB(部分场景放宽到 10 MB)
总包大小 受严格管控
权限 可用权限范围更窄
后台能力 受限更多
入口 卡片、扫码、分享、负一屏、智慧搜索、小艺建议

"2 MB 意味着什么?"老陈说,“意味着你不能塞大图、不能塞大库、不能做复杂功能。元服务的定位是’高频刚需、用完即走’。”

2.3 什么时候做元服务

场景 建议
点外卖、查快递、看天气、扫码骑车 ✅ 非常适合
完整的大型 App(社交、游戏、编辑器) ❌ 不适合,做传统应用
给硬件设备做配套控制面板 ✅ 很适合(你的场景)

"你的温湿度监控,做成元服务就很合适。"老陈说,“用户扫一下设备上的二维码,直接弹出控制卡片,不用装 App。”

2.4 卡片:元服务的主要形态

“**服务卡片是元服务最重要的载体。**第 07 章提过 FormExtensionAbility,现在看它怎么工作:”

┌──────────────────────────────────────┐
│  桌面上的卡片(2x2)                    │
│  ┌────────────────┐                   │
│  │  客厅   26.5°C │  ← 卡片 UI        │
│  │  湿度   61%    │                   │
│  └────────────────┘                   │
└──────────────────────────────────────┘
         ↕ 数据更新
┌──────────────────────────────────────┐
│  FormExtensionAbility                 │
│  · onAddForm()      卡片被添加         │
│  · onUpdateForm()   定时更新           │
│  · onRemoveForm()   卡片被删除         │
└──────────────────────────────────────┘
         ↕ 主动刷新
┌──────────────────────────────────────┐
│  应用侧:formProvider.updateForm()     │
└──────────────────────────────────────┘
// 卡片提供方
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import formBindingData from '@ohos.app.form.formBindingData';
import formProvider from '@ohos.app.form.formProvider';

export default class SensorFormAbility extends FormExtensionAbility {
  // 卡片被添加到桌面
  onAddForm(want: Want): formBindingData.FormBindingData {
    let data = {
      'temp': '--',
      'humi': '--',
      'device': '客厅'
    };
    return formBindingData.createFormBindingData(data);
  }

  // 定时更新(周期由配置决定,最短 30 分钟)
  onUpdateForm(formId: string): void {
    let data = { 'temp': '26.5', 'humi': '61' };
    formProvider.updateForm(formId, formBindingData.createFormBindingData(data));
  }

  onRemoveForm(formId: string): void {
    // 清理
  }
}
// module.json5 里声明
{
  "extensionAbilities": [
    {
      "name": "SensorFormAbility",
      "srcEntry": "./ets/form/SensorFormAbility.ets",
      "type": "form",                 // ← 卡片类型
      "metadata": [
        {
          "name": "ohos.extension.form",
          "resource": "$profile:form_config"
        }
      ]
    }
  ]
}

三、签名:最烦但必须过的一关

“现在讲最让人头疼的:签名。”

3.1 为什么必须签名

“签名做两件事:”

1. 【身份证明】证明这个应用确实是"你"开发的,不是别人冒充的
2. 【完整性】证明应用从你打包之后,没有被任何人篡改过

"没签名的 HAP 装不进真机。"老陈说,“模拟器可以跑未签名的,但真机一律拒绝。”

3.2 四样东西

“鸿蒙的签名涉及四个文件,我给你列清楚:”

文件 后缀 是什么 谁生成
密钥库 .p12 存着你的私钥 DevEco Studio 生成
证书请求 .csr 用私钥生成的申请文件 DevEco Studio 生成
数字证书 .cer 华为(AGC)颁发,证明你是你 AGC 下载
Profile 文件 .p7b 华为颁发,描述你的应用能干什么(包名、权限、设备) AGC 下载
完整流程:

 DevEco Studio                AGC(AppGallery Connect)
 ────────────────             ────────────────────────
 1. 生成 .p12 密钥库
        │
 2. 生成 .csr 证书请求
        │
        └──────── 上传 .csr ──────►  3. 颁发 .cer 证书
                                            │
        ◄──────── 下载 .cer ───────────────┘
        │
 4. 在 AGC 创建项目/应用
        │
        └────── 申请 Profile ──────►  5. 生成 .p7b
                                            │
        ◄──────── 下载 .p7b ───────────────┘
        │
 6. 在 DevEco 里配置签名信息
        │
 7. 编译 → 签名 → 得到 signed.hap

3.3 自动签名(新手走这条)

“DevEco Studio 有自动签名,能帮你省掉 90% 的麻烦。”

File → Project Structure → Signing Configs
     → 勾选 "Automatically generate signature"
     → 登录华为帐号
     → 等待自动生成 .p12 / .cer / .p7b
     → Apply → OK

"自动签名适合调试。"老陈说,“但有几件事它做不了——”

限制 说明
设备数量 调试 profile 只能绑定有限台设备(一般 100 台)
有效期 调试证书有期限,过期要重新签
上架 发布必须用正式的发布证书,不能用调试证书

3.4 手动配置

// build-profile.json5
{
  "app": {
    "signingConfigs": [
      {
        "name": "default",
        "type": "HarmonyOS",
        "material": {
          "storePassword": "************************",
          "certpath":      "C:/Users/xxx/.ohos/config/default_xxx.cer",
          "keyAlias":      "debugKey",
          "keyPassword":   "************************",
          "profile":       "C:/Users/xxx/.ohos/config/default_xxx.p7b",
          "signAlg":       "SHA256withECDSA",
          "storeFile":     "C:/Users/xxx/.ohos/config/default_xxx.p12"
        }
      }
    ],
    "products": [
      {
        "name": "default",
        "signingConfig": "default",      // ← 引用上面的配置
        "compatibleSdkVersion": "5.0.x",
        "runtimeOS": "HarmonyOS"
      }
    ]
  }
}

"注意:真实项目里不要把密码写进配置文件提交到仓库。"老陈提醒。

3.5 签名的常见坑

现象 原因 解法
真机装不上 用的未签名包 用 signed.hap
装上了闪退 签名与 profile 不匹配 重新生成全套签名
“设备不在 profile 白名单” 调试 profile 没包含这台设备 在 AGC 添加设备 UDID
证书过期 调试证书有期限 重新申请
跨设备分布式调试失败 两端应用签名不一致 确保两台设备装的包用同一套签名 ← 第09章提过
上架被拒 用了调试证书 换发布证书

四、上架:最后一步

“签名搞定,就可以上架了。”

4.1 流程

1. 【AGC 创建应用】
   AppGallery Connect → 我的应用 → 新建
   填:应用名称、包名、分类、语言、适用设备

2. 【准备素材】
   · 应用图标(多个尺寸)
   · 应用截图(至少 3 张,不同尺寸)
   · 应用描述(中文 + 英文)
   · 隐私政策链接(必须有!)
   · 版权证明 / 软著(部分分类需要)

3. 【上传包】
   Build → Generate HAP/APP → 生成 .app(App Pack)
   在 AGC 上传

4. 【填信息】
   · 应用分级(年龄分级)
   · 定价(免费 / 付费)
   · 上架区域
   · 内容分级问卷

5. 【提交审核】
   一般 1~3 个工作日

6. 【上架】
   审核通过后,用户就能搜到了

4.2 被拒的常见原因

“这些坑,提前避开能省一周:”

原因 说明
没有隐私政策 涉及用户信息的应用必须提供
权限滥用 申请了用不到的权限,或者申请了高敏感权限没说明理由
崩溃 / ANR 审核会跑自动化测试
功能不完整 明显的 bug、死链、占位内容
侵犯知识产权 用了别人的图标、名字、内容
后台行为不当 滥用后台任务、常驻通知
元服务不合规 元服务塞了太多功能,或者包体超限
描述与实际不符 描述的功能 App 里没有

“最常踩的是’权限滥用’。“老陈说,”**你申请了位置权限,但审核找不到你在哪儿用了——直接拒。**所以申请权限之前,先问自己:真的需要吗?”

五、HarmonyOS NEXT:现在的生态到底怎么样

"老师,我有个问题一直想问。"我举手。

“说。”

“现在学鸿蒙,到底值不值?”

老陈沉默了两秒,然后笑了。

“这是所有新手都会问的问题。我给你讲清楚。”

5.1 NEXT 意味着什么

“HarmonyOS NEXT(现在的 HarmonyOS 5)把 AOSP 全删了,不兼容 APK。”

“这件事有两面:”

【风险面】
  · 所有应用要重写 → 生态初期应用少
  · 用户可能因为"缺少某个 App"而不换机
  · 开发者的旧代码资产要迁移

【机会面】
  · 应用缺口 = 开发岗位缺口
  · 早期开发者享受红利(流量扶持、政策补贴)
  · 技术栈新鲜,大家起跑线接近
  · 国家层面推自主操作系统,长期有保障

5.2 真实数据(给你一个判断框架)

“我不给你画饼,我给你自己判断的方法:”

第一步:看主流应用有没有原生版
  → 微信、支付宝、抖音、淘宝、高德、京东...
  → 你自己手机上看一眼,这些有没有鸿蒙原生版

第二步:看招聘
  → 去招聘网站搜"鸿蒙"、"OpenHarmony"、"ArkTS"
  → 看岗位数量、薪资范围、城市分布

第三步:看你的目标行业
  → 消费电子 / 智能家居 / 车载 / 工业控制 → 强相关
  → 纯互联网 Web / 后端 → 弱相关

"别听别人说,自己去查。"老陈说,“这是我给所有学生的建议。”

5.3 我的判断

“作为干这行十几年的人,我的判断是——”

"三条:

1. 纯做北向应用(只会写 ArkTS 界面)→ 竞争激烈,红利期短
   原因:培训班三个月能批量产出,门槛低

2. 纯做南向驱动(只会 C + 驱动)→ 稳定,但岗位总量有限
   原因:这是传统嵌入式岗,本来就有,鸿蒙只是加成

3. 【南 + 北 都会】→ 稀缺,红利期长
   原因:需要两套知识体系,培训班教不了
        企业要的是"能一个人扛一个产品"的人

他看着我:“你走的是第三条。”

六、就业方向和学习路线

6.1 岗位方向

方向 干什么 要求 适合谁
鸿蒙应用开发 写 ArkTS 界面和业务逻辑 ArkTS + ArkUI + Stage 模型 有编程基础,偏软件
鸿蒙系统开发 改系统、移植、适配 C/C++ + Linux + 编译构建 有 Linux 基础
南向驱动开发 写 HDF 驱动、适配外设 C + 硬件 + 数据手册 电子/嵌入式背景(你的优势)
鸿蒙设备开发 整机开发、产品化 上面都要会一点 综合型
元服务 / 卡片开发 轻量化服务 ArkTS + 卡片框架 偏产品思维

6.2 给你的一条学习路线

老陈在白板上写:

【阶段一:打地基】(1~2 个月)
  · C 语言(指针、结构体、内存)—— 你已经有了
  · Linux 基础命令 + Shell
  · 至少点亮一块开发板的灯(OpenHarmony 轻量系统)
  目标:能让板子跑起来、能看串口日志

【阶段二:南向深入】(2~3 个月)
  · LiteOS-M 任务 /  IPC / 中断
  · GPIO / I2C / SPI / UART / PWM / ADC
  · HDF 驱动框架 + HCS 配置
  · 编译构建(GN / Ninja / hb)
  目标:能独立完成一个"采集 + 上传"的小项目

【阶段三:北向入门】(1~2 个月)
  · ArkTS 语法 + 静态类型思维
  · ArkUI 声明式 + 状态管理
  · Stage 模型 + 路由 + 生命周期
  · 数据持久化 + 网络 + 权限
  目标:能做一个完整的 App

【阶段四:打通】(1~2 个月)
  · NAPI(ArkTS ↔ C)
  · 分布式软总线 / 跨端迁移 / 分布式数据
  · 卡片 / 元服务
  目标:能做一个软硬结合的完整产品

【阶段五:出师】
  · 做一个能放进简历的项目
  · 走完签名 + 上架流程
  · 参与开源(OpenHarmony 是开源的,可以提 PR)

"最重要的建议——"老陈放下笔。

“什么?”

"每一阶段都要做出一个能演示的东西。"他说,“别只看书。看十本书不如做一个项目。”

“简历上写’熟悉鸿蒙开发’,没人信;写’我做了一个温湿度监控系统,从驱动到 App 全是我写的,已经上架了’——这就是另一回事了。”

=================小剧场模式=================

我:老师,最后一个问题。

老陈:说。

我:如果鸿蒙没做起来怎么办? 我花这么多时间,是不是赌错了?

老陈:(沉默两秒)这个问题问得好,而且你该问。

我:……我是不是说错话了?

老陈:没有。盲目下注才蠢。 我给你算一笔账——

我:怎么算?

老陈:你学这些的过程中,你真正学到的东西是什么?

我:(想)C 语言、嵌入式、驱动、RTOS、Linux、编译构建、UI 框架、网络、数据库、分布式……

老陈:这些里面,有哪一样是只有鸿蒙才用得上的?

我:……几乎没有。

老陈:对。 嵌入式、C、驱动、RTOS、Linux——这些在任何 IoT 公司、任何芯片公司、任何硬件公司都用得上。ArkTS 和声明式 UI 也是——学会了它,再学 SwiftUI、Jetpack Compose、Flutter 都很快。

我:所以就算鸿蒙没起来……

老陈:你学到的东西一件都没浪费。 只是少了一个"平台红利"。

我:那我还是赚的。

老陈:你一直都是赚的。 学东西这件事,最坏的结果也只是"多了一种思维方式"。

========================================

七、出师清单

老陈在白板上留了最后一张表:

【包结构】
HAP  能装的(entry 主模块 + feature 功能模块)
HAR  编译期复制(对外分享)
HSP  运行时共享(内部复用)
.app 上架用的总包

【元服务】
免安装、卡片入口、包体 ≤ 2MB(一般)
适合:高频刚需、用完即走、硬件配套面板

【签名四件套】
.p12  密钥库(本地生成)
.csr  证书请求(本地生成)
.cer  数字证书(AGC 颁发)
.p7b  Profile(AGC 颁发,描述权限和设备)

调试用自动签名;上架必须用发布证书

【上架】
AGC 创建应用 → 准备素材(图标/截图/隐私政策)
→ 上传 .app → 填信息 → 提交审核(1~3 天)

被拒高发:无隐私政策、权限滥用、崩溃、功能不完整

【方向选择】
纯北向 → 门槛低,竞争大
纯南向 → 稳定,岗位有限
【南北双修】→ 稀缺,红利长    ← 你走这条

【铁律】
每个阶段都要做出一个能演示的东西
简历上写"做了什么",别写"学了什么"

"这张表,"老陈说,“是你从’学生’变成’开发者’的通行证。”

"明天,"他收拾东西,“我们做最后一件东西。”

“什么东西?”

老陈把那块 Hi3861、一颗 SHT30、一个继电器模块、还有那个小舵机,一股脑推到我面前。

“把你最开始跟我说的那个想法,做出来。”

我愣了一下,然后想起来了——第一次见面那天,他说过:

“三个设备,三个厂家,三种协议,三个 App。”

"一个系统,让它们说同一种语言。"老陈说。


本章自检

过一遍下面的问题。答不上来的,回去翻对应小节——那些就是你这个章的欠账。

  • ☐ HAP / HAR / HSP 的区别?对外分享用哪个,内部复用用哪个?
  • ☐ 签名的四个文件分别是什么?哪两个是华为颁发的?
  • ☐ 调试签名和发布签名的区别?上架能用调试签名吗?
  • ☐ 元服务的包体限制大概是多少?什么样的功能适合做元服务?
  • ☐ 上架被拒最高发的原因是什么?
  • ☐ 说出你的方向定位:纯北向 / 纯南向 / 南北双修?

**➡️ 下一站:**第 12 章 · 造物者(大结局)—— 把前面所有东西串起来,做出成品。


=================剧情片段=================

导演:卡。第十一章,出师。

助理:包结构、元服务、签名、上架、生态、就业路线——这一章是"从技术到产品"。

导演:对。 前面十章教他"怎么做东西",这一章教他"怎么把东西交付出去"。

助理:我还挺喜欢那段"如果鸿蒙没起来怎么办"的。

导演:那是真话。 学技术的最大风险不是"学错了",是"只学不用"。只要他真的做出东西来,学到的能力是可迁移的。

助理:最后一章了。

导演:大结局。 一个完整的收尾项目——

助理:宿舍智能改造?

导演:对。用鸿蒙重做他最开始的那个想法。 从驱动、到 NAPI、到 ArkTS 界面、到分布式、到卡片,全部串起来。

助理:师傅要走吗?

导演:要走。 但留点东西。

助理:留什么?

导演:一本手册。 还有一句话。

========================================

未完待续。。。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论

欢迎来到我的博客!