第十章只做一件事:把留痕从工程构建、签名打包、真机安装到功能验收完整跑通,形成可以直接交付的最后一环。

图10-1 章节封面:真机交付把构建、签名和安装连成一条线

维度

内容

本章主题

真机交付如何把构建、签名、安装和验收串成一条线

核心文件

build-profile.json5、entry/src/main/module.json5、AppScope/app.json5、hvigorw.bat

读者目标

看懂工具链对齐、签名安装和缓存清理的真实排查顺序

输出结果

一套可复用的真机交付检查表

先看结论真机交付不是最后点一次安装按钮,而是先把版本、签名、权限和缓存全部对齐,再让应用在真实设备上稳定启动。只要这条链路通了,前九章的功能才算真正落地。

一、先把交付链路看成一条流水线,而不是最后一个按钮

留痕是一个多模块 HarmonyOS 项目,entry 负责页面壳,staticlibrary 负责公共样式和模型,dynamiclibrary 负责持久化和统计。真机交付如果只盯着单独模块,很容易出现 HAP 能出、HSP 没带上、安装后首页能开但功能空掉的问题,所以这一章按完整流水线来写。

交付链路可以固定成四步:先构建,再签名,然后安装,最后验收。每一步都应该能看见输入和输出,而不是靠感觉判断。工程一旦进入真机阶段,任何“差不多能跑”的宽松判断都会放大成现场问题。

# 先构建完整交付物
.\hvigorw.bat assembleApp

# 查看打包产物
Get-ChildItem .\entry\build\default\outputs\default

# 安装到真机
hdc install -r .\path\to\app-release.app

步骤

命令或输入

输出或关注点

构建

.\hvigorw.bat assembleApp

生成完整交付包,而不是只看页面能否预览

安装前检查

hdc list targets

确认设备在线、可安装、状态正常

安装

hdc install -r .\path\to\app-release.app

完整包写入真机

验收

启动应用并查看首页、拍照、录音、统计

确认功能链路真的闭环

图10-2 真机交付链路:构建、签名、安装和验证是一条连续流程

二、工具链对齐要先于真机安装

当前项目的目标 SDK 是 6.1.0(23),兼容边界保留在 6.0.2(22)。这意味着交付时要优先确认 DevEco Studio、Hvigor 和工程配置版本是否一致,否则会在构建层先失败,而不是等到安装时才发现。

工程里还打开了 caseSensitiveCheck 和 useNormalizedOHMUrl,这类严格模式对路径和资源引用要求更高。它的意义很直接:把原本可能在真机上才显现的问题,尽量提前收敛在构建阶段。

{
  "app": {
    "products": [
      {
        "name": "default",
        "targetSdkVersion": "6.1.0(23)",
        "compatibleSdkVersion": "6.0.2(22)",
        "runtimeOS": "HarmonyOS",
        "buildOption": {
          "strictMode": {
            "caseSensitiveCheck": true,
            "useNormalizedOHMUrl": true
          }
        }
      }
    ]
  }
}

检查项

当前项目状态

说明

目标 SDK

6.1.0(23)

真机交付以这个目标为准

兼容 SDK

6.0.2(22)

保留旧设备兼容边界

严格模式

已开启

路径、资源和引用更容易提前暴露问题

三、module.json5、签名和权限要一次说清

module.json5 决定了应用怎么进、怎么装、装完后要拿什么权限。留痕的主入口是 EntryAbility,deliveryWithInstall 设为 true,说明它会跟着安装流程一起交付。installationFree 设为 false,表示它不是免安装应用,必须走正常包安装链路。

权限上,这个项目会用到相机、麦克风和定位相关能力。真机交付时最重要的不是把权限都堆上去,而是让权限声明、用户授权和实际功能入口保持一致。这样首页、拍照页、录音页和记录页才不会出现看得见入口却没有权限支撑的情况。

{
  "module": {
    "name": "entry",
    "type": "entry",
    "mainElement": "EntryAbility",
    "deviceTypes": ["phone"],
    "deliveryWithInstall": true,
    "installationFree": false,
    "requestPermissions": [
      "ohos.permission.CAMERA",
      "ohos.permission.MICROPHONE",
      "ohos.permission.APPROXIMATELY_LOCATION",
      "ohos.permission.LOCATION"
    ]
  }
}

{
  "signingConfigs": [
    {
      "name": "release",
      "type": "HarmonyOS",
      "material": {
        "storeFile": "<p12>",
        "storePassword": "<password>",
        "keyAlias": "<alias>",
        "keyPassword": "<password>",
        "profile": "<p7b>",
        "certpath": "<cer>"
      }
    }
  ]
}

配置项

当前值

对交付的作用

mainElement

EntryAbility

真机启动入口

deliveryWithInstall

true

安装时连同应用一起交付

installationFree

false

保持正常安装流程

权限集合

CAMERA / MICROPHONE / LOCATION

支撑拍照、录音和定位水印

四、失败类型要分层处理,而不是反复点安装

如果构建已经成功,但真机还是装不上,第一步不是怀疑页面代码,而是把失败类型分开。device is unauthorized 往往是设备授权问题;verify app signature failed 多半是签名或 profile 不匹配;install failed 还要看是不是旧包残留、路径异常或者缓存冲突。

还有一种常见情况是只装了 entry,没有把 HSP 一起打进去。这样的包看起来像是安装成功,但打开后会出现功能缺失、页面空白或者服务层找不到实现。对这类问题,直接重打完整的 assembleApp 比单独试几次安装更有效。

# 真机安装排查顺序
hdc list targets
hdc install -r .\path\to\app-release.app
hdc shell hilog | findstr /i "EntryAbility"

# 如果需要重装,先卸载旧包
hdc uninstall com.example.project027

症状

更可能的原因

先查什么

device is unauthorized

设备未授权或证书不匹配

设备连接状态和签名 profile

verify app signature failed

证书或 profile 与安装包不一致

build-profile 和真机授权

install failed

旧包残留或安装缓存异常

产物目录和 hdc 输出

功能能开但不完整

只打了 entry,HSP 没一起进包

是否执行完整 assembleApp

五、D:\HvigorUserHome 缓存清理是最常见的兜底动作

这个项目里,构建失败不一定是业务代码错误。D:\HvigorUserHome 下的旧缓存、项目缓存和临时文件,经常会把新包卡在奇怪的位置。尤其是出现 EPERM unlink 这类错误时,优先怀疑缓存和文件占用,而不是先改代码。

最稳妥的处理方式是先关闭 DevEco Studio,再清缓存,再重新构建。不要一边让 IDE 读缓存,一边强行删除目录,这样只会把问题从构建失败变成目录锁定。清完以后再重新 assembleApp,通常能把很多看似随机的失败收回来。

# 关闭 IDE 后再清理缓存
Remove-Item -LiteralPath 'D:\HvigorUserHome\project_caches' -Recurse -Force
Remove-Item -LiteralPath 'D:\HvigorUserHome\caches' -Recurse -Force

# 重新构建
.\hvigorw.bat assembleApp

缓存现象

处理方式

备注

EPERM unlink

清理 project_caches 后重试

多半是文件占用或旧缓存残留

产物不更新

删旧输出再重新构建

避免拿到旧包误判

构建反复失败

关闭 IDE 后再清缓存

先释放文件锁

六、验收要回到应用本身,而不是只看安装成功

真机能够安装,只说明交付链路打通了一半。最后的验收还是要回到应用本身:首页能否打开、拍照能否弹权限、录音能否开始和结束、记录是否写入、统计是否能刷新。只有这些实际行为全部正常,才算真正完成交付。

留痕的验收点很清楚:拍照要能生成记录,录音要能保存并回放,定位和时间要能出现在水印里,统计页要跟着真实数据变化。它不是一个演示壳,而是一个能拿去现场使用的记录工具。

验收项

通过标准

对应页面

首页启动

能正常进入主界面

首页

权限弹窗

相机、麦克风、定位按需弹出

拍照页、录音页

拍照保存

能生成记录并回到列表

拍照页、记录页

录音保存

能录、能停、能回放

录音页、记录页

统计刷新

周/月/年切换后结果变化

统计页

图10-3 系列收官图:第十章把整套实战链路落在真机交付上

本章收官第十章把留痕从工程、签名、安装一路走到真机验证。到这里,前面九章的页面、服务层、存储和统计才真正进入可以交付的状态。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐