开发环境迁移到 WSL:代码迁入 /home/yongquan/code,验证 WSL 内可编译鸿蒙应用,证书规范化存放 #30

Closed
opened 2026-10-29 03:26:58 +00:00 by laoyang · 6 comments
Owner

背景

用户 2026-10-29 提出:开发环境整体搬到 WSL,以后的编译等操作都在 WSL 内进行,
产物再单独 scp 回 Windows 使用。代码全部放 WSL,远程提交到远端仓库管理。

诉求(逐条)

  1. 代码迁入 WSL:把相关仓库 clone 到 /home/yongquan/code/ 下,远端沿用 code.yangyq.net。
  2. 环境可用性验证:在 WSL 内验证能否真正编译出鸿蒙 HAP。
  3. 证书规范化:把签名所需证书放进 cert/ 目录,按规范命名存放。
  4. 编译产物回流:编译完成后把产物单独 scp 回 Windows。
  5. 以后所有开发/编译操作在 WSL 内进行。

现状(2026-10-29 探测结果)

  • WSL2 / Ubuntu 26.04.1 LTS,内核 6.18.54.1,12 核 / 11G 内存 / 952G 可用。
  • 可 SSH 进入:yongquan@127.0.0.1:22(Windows 侧由 wslrelay.exe 转发),密钥 ~/.ssh/wsl_local。
  • WSL 内 git 可用,.gitconfig 已配(laoyang / i@yangyq.net),~/.git-credentials 已存 code.yangyq.net 凭据。
  • 缺口:node / npm / java / ohpm / hvigorw / hdc / HarmonyOS SDK 全部没有,鸿蒙工具链为零。
  • 网络:code.yangyq.net、repo.huaweicloud.com、repo.harmonyos.com 可达;github.com 超时。

待验证的关键点

  • HarmonyOS 官方 Command Line Tools 有 Linux 版(要求 glibc ≥ 2.28、JDK 21、磁盘 100G+),
    但下载中心是 SPA + 可能需登录,需确认能否在 WSL 内直接取得安装包。
  • 工程 runtimeOS 为 HarmonyOS、targetSdkVersion 26.0.0、compatibleSdkVersion 6.1.1(24),
    必须用与 DevEco Studio 26.0.0 匹配的 HarmonyOS SDK;纯 OpenHarmony SDK 可能不可替代。

验收标准

  1. /home/yongquan/code/ 下两个仓库 clone 完成,git remote -v 指向 code.yangyq.net,git log 与 Windows 侧一致。
  2. WSL 内 hvigorw assembleHap 能跑通并产出 .hap(或明确给出不可行的根因证据)。
  3. cert/ 下证书齐全、命名规范、权限受控,签名配置在 WSL 内生效。
  4. 一份 scp 回 Windows 的产物落地脚本 + 实际执行记录。
  5. 文档说明 WSL 内的标准构建流程。

为什么单独建单

开发环境迁移到WSL,独立可验收,与#29资源模块交互无关

## 背景 用户 2026-10-29 提出:开发环境整体搬到 WSL,以后的编译等操作都在 WSL 内进行, 产物再单独 scp 回 Windows 使用。代码全部放 WSL,远程提交到远端仓库管理。 ## 诉求(逐条) 1. **代码迁入 WSL**:把相关仓库 clone 到 `/home/yongquan/code/` 下,远端沿用 `code.yangyq.net`。 2. **环境可用性验证**:在 WSL 内验证能否真正编译出鸿蒙 HAP。 3. **证书规范化**:把签名所需证书放进 `cert/` 目录,按规范命名存放。 4. **编译产物回流**:编译完成后把产物单独 scp 回 Windows。 5. 以后所有开发/编译操作在 WSL 内进行。 ## 现状(2026-10-29 探测结果) - WSL2 / Ubuntu 26.04.1 LTS,内核 6.18.54.1,12 核 / 11G 内存 / 952G 可用。 - 可 SSH 进入:`yongquan@127.0.0.1:22`(Windows 侧由 `wslrelay.exe` 转发),密钥 `~/.ssh/wsl_local`。 - WSL 内 `git` 可用,`.gitconfig` 已配(laoyang / i@yangyq.net),`~/.git-credentials` 已存 code.yangyq.net 凭据。 - **缺口**:`node` / `npm` / `java` / `ohpm` / `hvigorw` / `hdc` / HarmonyOS SDK **全部没有**,鸿蒙工具链为零。 - 网络:code.yangyq.net、repo.huaweicloud.com、repo.harmonyos.com 可达;github.com 超时。 ## 待验证的关键点 - HarmonyOS 官方 Command Line Tools 有 Linux 版(要求 glibc ≥ 2.28、JDK 21、磁盘 100G+), 但下载中心是 SPA + 可能需登录,需确认能否在 WSL 内直接取得安装包。 - 工程 `runtimeOS` 为 `HarmonyOS`、`targetSdkVersion 26.0.0`、`compatibleSdkVersion 6.1.1(24)`, 必须用与 DevEco Studio 26.0.0 匹配的 HarmonyOS SDK;纯 OpenHarmony SDK 可能不可替代。 ## 验收标准 1. `/home/yongquan/code/` 下两个仓库 clone 完成,`git remote -v` 指向 code.yangyq.net,`git log` 与 Windows 侧一致。 2. WSL 内 `hvigorw assembleHap` 能跑通并产出 `.hap`(或明确给出不可行的根因证据)。 3. `cert/` 下证书齐全、命名规范、权限受控,签名配置在 WSL 内生效。 4. 一份 scp 回 Windows 的产物落地脚本 + 实际执行记录。 5. 文档说明 WSL 内的标准构建流程。 --- ### 为什么单独建单 开发环境迁移到WSL,独立可验收,与#29资源模块交互无关
Author
Owner

进展 1(2026-10-29 11:45):环境探测结论

已完成

  • WSL 入口确认:yongquan@127.0.0.1:22(Windows 侧 wslrelay.exe 转发),密钥 ~/.ssh/wsl_local。
    WSL2 / Ubuntu 26.04.1 LTS,内核 6.18.54.1,12 核 / 11G 内存 / 952G 可用。
  • 代码已迁入:/home/yongquan/code/FamilyBook(42aff02)、
    /home/yongquan/code/FamilyBook_harmonyos(fd3ea53),与 Windows 侧 commit 完全一致,
    git remote -v 指向 code.yangyq.net,WSL 内 .git-credentials 已可推送。
  • WSL → Windows 的 scp 通道已实测可用(产物回流可行)。
  • JDK 21.0.12 已装(/usr/lib/jvm/java-21-openjdk-amd64),符合官方对 26.0.0 的要求。
  • Linux 命令行工具已装通并跑起来:commandline-tools-linux-x64-5.1.0.840.zip
    (华为云镜像 repo.huaweicloud.com/harmonyos/ohpm/5.1.0/,2.1G,SHA-256 已校验通过)。
    解压于 /home/yongquan/downloads/command-line-tools。
    实测版本:node 18.20.1 / hvigorw 5.18.5 / ohpm 5.1.3 —— hvigor、ohpm、node 在 WSL 内原生跑通。

🔴 卡点:SDK 版本不匹配,API 18 工具链编不了 API 26 工程

该镜像包自带的是 API 18 / 5.1.0.125 SDK,而工程是 API 26:

项 工程要求 镜像包提供
modelVersion(hvigor-config / oh-package) 26.0.0 只接受 5.1.0
targetSdkVersion 26.0.0 18
compatibleSdkVersion 6.1.1(24) 18
AppScope/app.json5 的 buildVersion 有 schema 不认该字段

三层实测证据(不是推断):

  1. modelVersion 26.0.0 → 00303028 Unsupported modelVersion of Hvigor 26.0.0. supported is 5.1.0
  2. 降到 5.1.0 → 00303027 modelVersion 不一致(hvigor-config 5.1.0 vs oh-package 26.0.0)
  3. 两处都降 → app.json5 schema 拒绝:propertyNames 不允许 buildVersion,
    且 AppScope.app 的枚举里没有工程用到的若干字段。

结论:必须拿到与 DevEco Studio 26.0.0 配套的 Linux 版 Command Line Tools(26.0.0.x),
或与 API 26 匹配的 Linux SDK。用 API 18 硬编只能把源码降级,属于功能倒退,不做。

待决策

华为云镜像只到 5.1.0;26.0.0 的 Linux 包只在华为开发者下载中心
(developer.huawei.com/consumer/cn/download/command-line-tools-for-hmos),
且下载链接是带 2 小时有效签名的动态地址、页面为 SPA + 需登录,无法在 WSL 内脚本化取得。
需要人工下载一次,或确认是否有其他可用镜像。

## 进展 1(2026-10-29 11:45):环境探测结论 ### 已完成 - **WSL 入口确认**:`yongquan@127.0.0.1:22`(Windows 侧 `wslrelay.exe` 转发),密钥 `~/.ssh/wsl_local`。 WSL2 / Ubuntu 26.04.1 LTS,内核 6.18.54.1,12 核 / 11G 内存 / 952G 可用。 - **代码已迁入**:`/home/yongquan/code/FamilyBook`(`42aff02`)、 `/home/yongquan/code/FamilyBook_harmonyos`(`fd3ea53`),与 Windows 侧 commit 完全一致, `git remote -v` 指向 `code.yangyq.net`,WSL 内 `.git-credentials` 已可推送。 - **WSL → Windows 的 scp 通道已实测可用**(产物回流可行)。 - **JDK 21.0.12** 已装(`/usr/lib/jvm/java-21-openjdk-amd64`),符合官方对 26.0.0 的要求。 - **Linux 命令行工具已装通并跑起来**:`commandline-tools-linux-x64-5.1.0.840.zip` (华为云镜像 `repo.huaweicloud.com/harmonyos/ohpm/5.1.0/`,2.1G,SHA-256 已校验通过)。 解压于 `/home/yongquan/downloads/command-line-tools`。 实测版本:node 18.20.1 / hvigorw 5.18.5 / ohpm 5.1.3 —— **hvigor、ohpm、node 在 WSL 内原生跑通**。 ### 🔴 卡点:SDK 版本不匹配,API 18 工具链编不了 API 26 工程 该镜像包自带的是 **API 18 / 5.1.0.125** SDK,而工程是 **API 26**: | 项 | 工程要求 | 镜像包提供 | |---|---|---| | `modelVersion`(hvigor-config / oh-package) | 26.0.0 | 只接受 5.1.0 | | `targetSdkVersion` | 26.0.0 | 18 | | `compatibleSdkVersion` | 6.1.1(24) | 18 | | `AppScope/app.json5` 的 `buildVersion` | 有 | schema 不认该字段 | **三层实测证据(不是推断):** 1. `modelVersion 26.0.0` → `00303028 Unsupported modelVersion of Hvigor 26.0.0. supported is 5.1.0` 2. 降到 `5.1.0` → `00303027 modelVersion 不一致(hvigor-config 5.1.0 vs oh-package 26.0.0)` 3. 两处都降 → `app.json5` schema 拒绝:`propertyNames` 不允许 `buildVersion`, 且 `AppScope.app` 的枚举里没有工程用到的若干字段。 结论:**必须拿到与 DevEco Studio 26.0.0 配套的 Linux 版 Command Line Tools(26.0.0.x)**, 或与 API 26 匹配的 Linux SDK。用 API 18 硬编只能把源码降级,属于功能倒退,不做。 ### 待决策 华为云镜像只到 5.1.0;26.0.0 的 Linux 包只在华为开发者下载中心 (`developer.huawei.com/consumer/cn/download/command-line-tools-for-hmos`), 且下载链接是带 2 小时有效签名的动态地址、页面为 SPA + 需登录,无法在 WSL 内脚本化取得。 需要人工下载一次,或确认是否有其他可用镜像。
Author
Owner

进展 2(2026-10-29):编译验证结论 —— WSL 内暂时不可行,卡在 API 26 Linux 闭源 hms 包

一、已经拿下的部分(真跑通,不是推断)

项 状态 证据
WSL SSH 入口 ✅ yongquan@127.0.0.1:22 + ~/.ssh/wsl_local
两个仓库 clone 到 /home/yongquan/code ✅ 42aff02 / fd3ea53,与 Windows 一致
双向往返 scp 通道 ✅ 实测通过
JDK 21 ✅ 21.0.12.1,/usr/lib/jvm/java-21-openjdk-amd64
Linux 版 CLT(API 18 包) ✅ commandline-tools-linux-x64-5.1.0.840.zip 2.1G,SHA-256 校验通过
node / ohpm / hvigorw 在 WSL 原生跑起来 ✅ node 18.20.1 / ohpm 5.1.3 / hvigorw 5.18.5
API 26 Linux 开源 SDK ✅ 从 os/7.0-Release 抽出,5 组件全 26.0.0.38 / api 26,hdc -v = Ver: 3.2.0f
hvigor 6.26.4(匹配 modelVersion 26.0.0) ✅ npm 装通,modelVersion 校验通过
证书规范落地 cert/familybook/ ✅ 见下文第三节

也就是说,工具链本身、SDK 元数据、hvigor 版本这三层全部打通了,00303028/00303027/00303312 都已清掉。

二、🔴 最终卡点:缺 API 26 的 Linux 版闭源 hms 组件

工程 runtimeOS: HarmonyOS(不是 OpenHarmony),hvigor 因此强制要求 hmscore 组件,--debug 明确打出:

Local scan or download hmscore sdk components toolchains,ets,native

而公开渠道能拿到的 API 26 Linux SDK 只有 OpenHarmony 开源那一套,不含闭源 HMS。缺的具名库是:

  • libimage_transcoder_shared.so (报 11201001 Failed to load library ... path invalid)

三、三条路径全部实测排除(不是没找,是找过且排掉了)

① 华为云镜像没有 26.0.0 的 Linux 包

200  .../harmonyos/ohpm/5.0.2/  5.0.3/  5.0.5/  5.1.0/
404  .../harmonyos/ohpm/6.0.0/
404  .../harmonyos/ohpm/26.0.0/
200  .../harmonyos/os/7.0-Release/      → 只有 OpenHarmony 开源 SDK(无 hms)
200  .../harmonyos/os/6.0-Release/      → 同上
404  .../harmonyos/commandline-tools/

ohpm 目录只到 5.1.0(API 18),没有 26.0.0 的落点。

② 借 API 18 的 hms 库 → ABI 不兼容(硬崩,不是警告)

undefined symbol: _Z13SkEncodeImageP9SkWStreamRK8SkBitmap20SkEncodedImageFormati

restool 是 API 26 的,libimage_transcoder 是 API 18 的,Skia 符号对不上。此外 API 18 那套 hms/toolchains 里根本没有 restool 二进制(API 18 的 restool 在 openharmony 侧)。

③ 复用 Windows DevEco 26.0.0 的 SDK → 不可能,宿主二进制平台不同

Windows 侧 sdk/default/hms 确实是 26.0.0.105、api 26,但:

hms/toolchains/  → hilogtool.exe, syscap_tool.exe, lib/*.dll  ← 全是 PE 格式
整个 SDK 内 717 个 .so → 路径全部形如
    hms/native/BiSheng/lib/aarch64-linux-ohos/...    ← 这是【目标平台】arm64 的库

717 个 .so 里没有一个是 x86_64-linux 宿主侧可执行文件。 Windows SDK 无法在 WSL 里跑,这不是配置问题。

④ 退到纯 runtimeOS: OpenHarmony → 同样被拦

00308018 Unknown Error / "The SDK management mode has changed"

hvigor 的 getInCompatibleComponents() 仍把组件判为不兼容。且工程大量使用 API 26 专有特性(@ComponentV2、AppScope.buildVersion、targetSdkVersion "26.0.0" 字符串格式),降级属功能倒退,已被否掉。

四、唯一出路(需要人工介入一次)

到华为开发者下载中心取 Linux 版 Command Line Tools 26.0.0.x:

https://developer.huawei.com/consumer/cn/download/command-line-tools-for-hmos
包名形如:commandline-tools-linux-x64-26.0.0.851.zip

该包自带完整 hms(含 Linux 版 libimage_transcoder_shared.so 与 restool),一次到位。
之所以必须人工:下载页是 Angular SPA + 需登录,直链带 2 小时有效签名,无法在 WSL 内脚本化取得。

拿到后放进 WSL(/home/yongquan/downloads/),我继续做完:签名配置接入 → hvigorw assembleHap → 产物 scp 回 Windows → 补构建文档 → 关单。

五、⚠️ 一条硬纪律(避免假通过)

在拿到 API 26 Linux hms 之前,不要再尝试伪造或跨版本拼接 SDK。
已经证明这条路会造成两种恶果:要么被 hvigor 拦下报错(好结果),
要么假通过后产物签不出/装不上(坏结果)。本次已把所有拼接尝试的副本删除干净,
/home/yongquan/downloads/sdk26/sdk/default/ 下只保留公开的 OpenHarmony 5 组件。

六、证书规范化已交付(本单第 3 条验收项)

/home/yongquan/code/cert/familybook/,命名规则 <bundle-name>.<用途>.<扩展名>:

drwx------  cert/  cert/familybook/
-rw-r--r--  familybook.yangyq.net.debug.cer   2914   PEM -----BEGIN CERTIFICATE-----
-rw-------  familybook.yangyq.net.debug.csr    510
-rw-------  familybook.yangyq.net.debug.p12   1128   magic 30 82
-rw-r--r--  familybook.yangyq.net.debug.p7b   4080   "type":"debug", bundle-name 匹配

权限 700/600/644 分层,.p12 与 .csr 仅属主可读。
p7b 内容已抽验:type=debug、bundle-name=familybook.yangyq.net、
有效期 1791727856 ~ 1823263856、device-ids 为单设备绑定
(D5AB2387…7998,即当前这台真机)。

注意:/build-profile.json5 在 .gitignore 里(含签名绝对路径与加密口令,机器相关),
clone 到 WSL 后本就不存在。签名配置等编译链路打通后再在 WSL 内重建,不提交。

七、结论

  • 工具链可迁移:node/ohpm/hvigor/JDK/OpenHarmony SDK 在 WSL 内全部正常工作,环境迁移这件事本身是成立的。
  • 本项目当前编不了:唯一缺口是闭源 HMS 的 Linux 版,属授权分发限制,不是技术方案问题。
  • 需要你决定:人工下包(推荐),或接受降级(不推荐,功能倒退)。
## 进展 2(2026-10-29):编译验证结论 —— WSL 内**暂时不可行**,卡在 API 26 Linux 闭源 hms 包 ### 一、已经拿下的部分(真跑通,不是推断) | 项 | 状态 | 证据 | |---|---|---| | WSL SSH 入口 | ✅ | `yongquan@127.0.0.1:22` + `~/.ssh/wsl_local` | | 两个仓库 clone 到 `/home/yongquan/code` | ✅ | `42aff02` / `fd3ea53`,与 Windows 一致 | | 双向往返 scp 通道 | ✅ | 实测通过 | | JDK 21 | ✅ | `21.0.12.1`,`/usr/lib/jvm/java-21-openjdk-amd64` | | Linux 版 CLT(API 18 包) | ✅ | `commandline-tools-linux-x64-5.1.0.840.zip` 2.1G,SHA-256 校验通过 | | node / ohpm / hvigorw 在 WSL 原生跑起来 | ✅ | node 18.20.1 / ohpm 5.1.3 / hvigorw 5.18.5 | | **API 26 Linux 开源 SDK** | ✅ | 从 `os/7.0-Release` 抽出,5 组件全 `26.0.0.38 / api 26`,`hdc -v` = `Ver: 3.2.0f` | | **hvigor 6.26.4(匹配 modelVersion 26.0.0)** | ✅ | npm 装通,`modelVersion` 校验通过 | | 证书规范落地 `cert/familybook/` | ✅ | 见下文第三节 | 也就是说,**工具链本身、SDK 元数据、hvigor 版本这三层全部打通了**,`00303028`/`00303027`/`00303312` 都已清掉。 ### 二、🔴 最终卡点:缺 API 26 的 **Linux 版闭源 hms 组件** 工程 `runtimeOS: HarmonyOS`(不是 OpenHarmony),hvigor 因此强制要求 hmscore 组件,`--debug` 明确打出: ``` Local scan or download hmscore sdk components toolchains,ets,native ``` 而公开渠道能拿到的 API 26 Linux SDK 只有 **OpenHarmony 开源**那一套,**不含闭源 HMS**。缺的具名库是: - `libimage_transcoder_shared.so` (报 `11201001 Failed to load library ... path invalid`) ### 三、三条路径全部实测排除(不是没找,是找过且排掉了) **① 华为云镜像没有 26.0.0 的 Linux 包** ``` 200 .../harmonyos/ohpm/5.0.2/ 5.0.3/ 5.0.5/ 5.1.0/ 404 .../harmonyos/ohpm/6.0.0/ 404 .../harmonyos/ohpm/26.0.0/ 200 .../harmonyos/os/7.0-Release/ → 只有 OpenHarmony 开源 SDK(无 hms) 200 .../harmonyos/os/6.0-Release/ → 同上 404 .../harmonyos/commandline-tools/ ``` `ohpm` 目录**只到 5.1.0(API 18)**,没有 26.0.0 的落点。 **② 借 API 18 的 hms 库 → ABI 不兼容(硬崩,不是警告)** ``` undefined symbol: _Z13SkEncodeImageP9SkWStreamRK8SkBitmap20SkEncodedImageFormati ``` `restool` 是 API 26 的,`libimage_transcoder` 是 API 18 的,Skia 符号对不上。此外 API 18 那套 `hms/toolchains` 里**根本没有 restool 二进制**(API 18 的 restool 在 openharmony 侧)。 **③ 复用 Windows DevEco 26.0.0 的 SDK → 不可能,宿主二进制平台不同** Windows 侧 `sdk/default/hms` 确实是 `26.0.0.105`、api 26,但: ``` hms/toolchains/ → hilogtool.exe, syscap_tool.exe, lib/*.dll ← 全是 PE 格式 整个 SDK 内 717 个 .so → 路径全部形如 hms/native/BiSheng/lib/aarch64-linux-ohos/... ← 这是【目标平台】arm64 的库 ``` **717 个 `.so` 里没有一个是 x86_64-linux 宿主侧可执行文件。** Windows SDK 无法在 WSL 里跑,这不是配置问题。 **④ 退到纯 `runtimeOS: OpenHarmony` → 同样被拦** ``` 00308018 Unknown Error / "The SDK management mode has changed" ``` hvigor 的 `getInCompatibleComponents()` 仍把组件判为不兼容。且工程大量使用 API 26 专有特性(`@ComponentV2`、`AppScope.buildVersion`、`targetSdkVersion "26.0.0"` 字符串格式),降级属功能倒退,已被否掉。 ### 四、唯一出路(需要人工介入一次) 到华为开发者下载中心取 **Linux 版 Command Line Tools 26.0.0.x**: ``` https://developer.huawei.com/consumer/cn/download/command-line-tools-for-hmos 包名形如:commandline-tools-linux-x64-26.0.0.851.zip ``` 该包自带完整 hms(含 Linux 版 `libimage_transcoder_shared.so` 与 `restool`),一次到位。 之所以必须人工:下载页是 Angular SPA + 需登录,直链带 2 小时有效签名,**无法在 WSL 内脚本化取得**。 拿到后放进 WSL(`/home/yongquan/downloads/`),我继续做完:签名配置接入 → `hvigorw assembleHap` → 产物 scp 回 Windows → 补构建文档 → 关单。 ### 五、⚠️ 一条硬纪律(避免假通过) **在拿到 API 26 Linux hms 之前,不要再尝试伪造或跨版本拼接 SDK。** 已经证明这条路会造成两种恶果:要么被 hvigor 拦下报错(好结果), 要么**假通过后产物签不出/装不上**(坏结果)。本次已把所有拼接尝试的副本删除干净, `/home/yongquan/downloads/sdk26/sdk/default/` 下只保留公开的 OpenHarmony 5 组件。 ### 六、证书规范化已交付(本单第 3 条验收项) `/home/yongquan/code/cert/familybook/`,命名规则 `<bundle-name>.<用途>.<扩展名>`: ``` drwx------ cert/ cert/familybook/ -rw-r--r-- familybook.yangyq.net.debug.cer 2914 PEM -----BEGIN CERTIFICATE----- -rw------- familybook.yangyq.net.debug.csr 510 -rw------- familybook.yangyq.net.debug.p12 1128 magic 30 82 -rw-r--r-- familybook.yangyq.net.debug.p7b 4080 "type":"debug", bundle-name 匹配 ``` 权限 `700/600/644` 分层,`.p12` 与 `.csr` 仅属主可读。 p7b 内容已抽验:`type=debug`、`bundle-name=familybook.yangyq.net`、 有效期 `1791727856 ~ 1823263856`、**`device-ids` 为单设备绑定** (`D5AB2387…7998`,即当前这台真机)。 > 注意:`/build-profile.json5` 在 `.gitignore` 里(含签名绝对路径与加密口令,机器相关), > clone 到 WSL 后本就不存在。签名配置等编译链路打通后再在 WSL 内重建,不提交。 ### 七、结论 - **工具链可迁移**:node/ohpm/hvigor/JDK/OpenHarmony SDK 在 WSL 内全部正常工作,环境迁移这件事本身是成立的。 - **本项目当前编不了**:唯一缺口是闭源 HMS 的 Linux 版,属**授权分发限制**,不是技术方案问题。 - 需要你决定:**人工下包**(推荐),或接受降级(不推荐,功能倒退)。
Author
Owner

进展 3(2026-10-29):产物回流通道已打通并实测(本单第 4 条验收项)

脚本

/home/yongquan/code/tools/hap_export.sh(156→169 行,bash -n 通过)

为什么默认不走 scp

实测 WSL 内:

Windows 主机 IP : 192.168.48.1(eth0 网关)
该主机 22 端口  : CLOSED          ← Windows 侧没开 sshd
/mnt/d 写权限   : OK 可写

所以默认走 /mnt/d 直写(零依赖,且能立刻 stat 到文件做逐字节校验),
--via scp 作为备用分支保留(需自行开 Windows sshd 并提供 FB_WIN_HOST/FB_WIN_USER/FB_WIN_DEST)。

落点

D:\Yongquan\code\_harmonyos-builds\familybook\<timestamp>\
    MANIFEST.txt
    SHA256SUMS.txt
    entry_build_default_outputs_default_xxx.hap

刻意放在仓库之外:不污染 git status,也不受 .gitignore 约束。

实测记录(4 组,含反证)

① 无产物 → 必须 exit 2,不能静默通过 ✅

未找到任何 .hap/.app 产物。
  查找范围:/home/yongquan/code/FamilyBook_harmonyos/entry/build
ERROR[2]: 没有产物,不做回流
>>> 实际退出码:2

这一条是为了防止「编译挂了但回流脚本报成功」这种最坏的假绿。

② --dry-run → 只列不搬 ✅ 退出码 0,未产生任何写入。

③ 真实搬运 + Windows 侧独立校验 ✅

两侧各自独立算 sha256,完全一致:

侧 sha256
WSL 源 4e427032aa039eba60436f6ab564c0c299cf92635188ff2c2c8a3ddd34288cf1
Windows 落点 4e427032aa039eba60436f6ab564c0c299cf92635188ff2c2c8a3ddd34288cf1

不是只信脚本的自我报告,是在 Windows 侧重新 sha256sum 出来的。

④ 反证:篡改落地文件后判据能检出 ✅

src: 4096 / 4e427032aa039eba
dst: 4096 / 730a0cdb2fe7d6e5     ← 已破坏
判据有效:能检出不一致

只测「通过」不算测过。这里把目标文件首 7 字节改成 CORRUPT,
确认 sha256 判据真的会红,而不是恒绿。

⑤ 同名产物不互相覆盖 ✅

造了两个不同内容、同名的 entry-default.hap(模拟 debug/release 撞名):

entry_build_default_outputs_default_entry-default.hap: AAAA-debug
entry_build_release_outputs_default_entry-default.hap: BBBB-release

两份都完整保留。文件名带相对路径前缀解决了这个坑。

退出码约定

码 含义
0 成功,且已逐字节校验
2 没找到产物 —— 「没跑判据」必须显式失败
3 拷贝后 sha256 或大小不一致
4 参数/环境错误

清理

所有测试产物、entry/build/、D:\...\_harmonyos-builds\ 下的假包、脚本 .bak 均已删除,
git status --porcelain 为空。不会给日后留下假产物混淆。

文档

已写 wsl-harmonyos-build.md:入口、环境变量、build 命令、证书路径映射、
回流用法、退出码、以及第七节的阻塞说明与「禁止拼接 SDK」纪律。

本单状态小结

验收项 状态
1. 两仓库 clone 到 WSL,与 Windows 一致 ✅ 完成
2. assembleHap 跑通 ❌ 阻塞:缺 API 26 Linux 闭源 hms(见进展 2)
3. cert/ 证书规范 + 权限受控 ✅ 完成(签名接入待编译打通后做)
4. 产物回流脚本 + 执行记录 ✅ 完成(本评论)
5. WSL 构建流程文档 ✅ 完成

🔴 唯一未完成项是第 2 条,且是外部授权分发限制,不是方案缺陷。
需要人工提供 commandline-tools-linux-x64-26.0.0.851.zip 后才能继续。

## 进展 3(2026-10-29):产物回流通道已打通并实测(本单第 4 条验收项) ### 脚本 `/home/yongquan/code/tools/hap_export.sh`(156→169 行,`bash -n` 通过) ### 为什么默认不走 scp 实测 WSL 内: ``` Windows 主机 IP : 192.168.48.1(eth0 网关) 该主机 22 端口 : CLOSED ← Windows 侧没开 sshd /mnt/d 写权限 : OK 可写 ``` 所以默认走 **`/mnt/d` 直写**(零依赖,且能立刻 stat 到文件做逐字节校验), `--via scp` 作为备用分支保留(需自行开 Windows sshd 并提供 `FB_WIN_HOST/FB_WIN_USER/FB_WIN_DEST`)。 ### 落点 ``` D:\Yongquan\code\_harmonyos-builds\familybook\<timestamp>\ MANIFEST.txt SHA256SUMS.txt entry_build_default_outputs_default_xxx.hap ``` 刻意放在**仓库之外**:不污染 `git status`,也不受 `.gitignore` 约束。 ### 实测记录(4 组,含反证) **① 无产物 → 必须 exit 2,不能静默通过** ✅ ``` 未找到任何 .hap/.app 产物。 查找范围:/home/yongquan/code/FamilyBook_harmonyos/entry/build ERROR[2]: 没有产物,不做回流 >>> 实际退出码:2 ``` > 这一条是为了防止「编译挂了但回流脚本报成功」这种最坏的假绿。 **② --dry-run → 只列不搬** ✅ 退出码 0,未产生任何写入。 **③ 真实搬运 + Windows 侧独立校验** ✅ 两侧各自独立算 sha256,完全一致: | 侧 | sha256 | |---|---| | WSL 源 | `4e427032aa039eba60436f6ab564c0c299cf92635188ff2c2c8a3ddd34288cf1` | | Windows 落点 | `4e427032aa039eba60436f6ab564c0c299cf92635188ff2c2c8a3ddd34288cf1` | **不是只信脚本的自我报告**,是在 Windows 侧重新 `sha256sum` 出来的。 **④ 反证:篡改落地文件后判据能检出** ✅ ``` src: 4096 / 4e427032aa039eba dst: 4096 / 730a0cdb2fe7d6e5 ← 已破坏 判据有效:能检出不一致 ``` > 只测「通过」不算测过。这里把目标文件首 7 字节改成 `CORRUPT`, > 确认 sha256 判据真的会红,而不是恒绿。 **⑤ 同名产物不互相覆盖** ✅ 造了两个不同内容、**同名**的 `entry-default.hap`(模拟 debug/release 撞名): ``` entry_build_default_outputs_default_entry-default.hap: AAAA-debug entry_build_release_outputs_default_entry-default.hap: BBBB-release ``` 两份都完整保留。文件名带相对路径前缀解决了这个坑。 ### 退出码约定 | 码 | 含义 | |---|---| | 0 | 成功,且已逐字节校验 | | 2 | 没找到产物 —— 「没跑判据」必须显式失败 | | 3 | 拷贝后 sha256 或大小不一致 | | 4 | 参数/环境错误 | ### 清理 所有测试产物、`entry/build/`、`D:\...\_harmonyos-builds\` 下的假包、脚本 `.bak` 均已删除, `git status --porcelain` 为空。**不会给日后留下假产物混淆。** ### 文档 已写 `wsl-harmonyos-build.md`:入口、环境变量、build 命令、证书路径映射、 回流用法、退出码、以及第七节的阻塞说明与「禁止拼接 SDK」纪律。 ### 本单状态小结 | 验收项 | 状态 | |---|---| | 1. 两仓库 clone 到 WSL,与 Windows 一致 | ✅ 完成 | | 2. `assembleHap` 跑通 | ❌ **阻塞**:缺 API 26 Linux 闭源 hms(见进展 2) | | 3. `cert/` 证书规范 + 权限受控 | ✅ 完成(签名接入待编译打通后做) | | 4. 产物回流脚本 + 执行记录 | ✅ **完成**(本评论) | | 5. WSL 构建流程文档 | ✅ 完成 | 🔴 **唯一未完成项是第 2 条,且是外部授权分发限制,不是方案缺陷。** 需要人工提供 `commandline-tools-linux-x64-26.0.0.851.zip` 后才能继续。
Author
Owner

🎉 进展 4(2026-10-29 16:16):WSL 内编译已打通,签名 HAP 产出并验签通过

用户 16:06 放入 commandline-tools-linux-x64-26.0.0.851.zip,从此前的「不可行」直接翻转为「完全可用」。

这是对本单进展 2 结论的推翻与替代,以本节为准。


一、工具链到位

Version: 26.0.0.851
hstack         : 6.1.0
codelinter     : 6.0.240
hvigor         : 6.26.8
ohpm           : 26.0.0.630
HarmonyOS SDK  : HarmonyOS 26.0.0 Release (Ohos_sdk_public 26.0.0.105, API 26)
apiVersion     : 26

unzip -t 全量校验 No errors detected;解压后 7.1G。
hms/toolchains/lib/libimage_transcoder_shared.so —— x86-64 ELF,82KB,确实存在。

先单独验证了这个库能否真被加载(上次就崩在这):

nm -D 检查 SkEncodeImage  : 无 undefined(上次的 ABI 冲突消失)
dlopen(RTLD_NOW)          : OK: dlopen succeeded

这一步是关键——证明它不再需要借 API 18 的库做 ABI 拼接。

二、编译结果

source ~/.workbuddy/env/harmonyos.sh
build_hap debug
> hvigor Finished :entry:default@CompileArkTS... after 21 s 222 ms
> hvigor Finished :entry:default@PackageHap... after 411 ms
> hvigor Finished :entry:default@SignHap... after 1 s 678 ms
> hvigor BUILD SUCCESSFUL in 26 s 593 ms
34 tasks in total: 34 executed, 0 up-to-date
>>> 退出码:0

34 个 task 全部执行、0 个 up-to-date —— 不是增量缓存蒙过去的。

之后又做了一次彻底干净重建(删掉 entry/build、build、.hvigor、oh_modules,
模拟全新 clone):同样 34 executed, 0 up-to-date,退出码 0。

三、签名验证(最关键的一步)

没有停在 BUILD SUCCESSFUL,因为构建日志通过 ≠ 产物有效。用官方工具验:

java -jar sdk/default/openharmony/toolchains/lib/hap-sign-tool.jar verify-app \
     -inFile entry-default-signed.hap -outCertChain /tmp/v.cer -outProfile /tmp/v.p7b
Find Hap Signing Block success, version: 3, block count: 3
trying verify codesign block
verify codesign success
Digest verify result: true, DigestAlgorithm: SHA-256
verify permission sign success.
Write certificate chain success!
verify: Verify success
verify-app success

证书链解析出来的主体就是本项目的开发者证书:

Subject : CN="杨永全(1845816276425949633)\,Development", OU=1845816276425949633, O=杨永全, C=CN
Issuer  : CN=Huawei CBG Developer Relations CA G2
Validity: 2026-10-11 22:10:56 ~ 2027-10-11 22:10:56

产物内 module.json 实测值:

bundleName : familybook.yangyq.net
versionName: 0.8.0    versionCode: 800
targetAPI  : 260000026   minAPI: 60101024
compileSdk : 26.0.0.105 HarmonyOS
buildMode  : debug

四、🔴 遇到并解决的一个隐藏坑:material/ 目录

首次编译通过了 31 个 task,卡在最后一个签名步骤:

> hvigor ERROR: Failed :entry:default@SignHap...
> hvigor ERROR: Error Code: 00308018 Unknown Error
ENOENT: no such file or directory, stat '/home/yongquan/code/cert/familybook/material'

查 hvigor-ohos-plugin/src/utils/decipher-util.js 找到根因:

static decryptPwd(t, r, e){
  ...
  const _ = DecipherUtil.getKey(t, e);      // t = path.resolve(storeFile, '..')
}
static getKey(t, r){
  const e = path.resolve(t, 'material');
  fs.statSync(e).isDirectory() || printErrorExit(...)
}

storePassword / keyPassword 不是明文,是用密钥材料加密的 hex。hvigor 解密时会在
storeFile 的上一级目录里找 material/,读 fd/ac/ce 三组密钥派生 AES-128-GCM key。

因为我把三个证书路径都指到了 cert/familybook/,hvigor 就去那里找 material,
而 material 原本在 Windows 的 C:\Users\Yongquan\.ohos\config\material(DevEco 建证书时生成)。

补上即可(material 是账号级材料,不随项目变,所有项目共用):

cert/familybook/material/
├── ac/8649f462784e47c3b1439a42e5ade9be    16 B
├── ce/d74c6dcc7cb04b51b8f16fe600a39a9c    48 B
└── fd/{0,1,2}/<32位hex>                   各 16 B

权限已 chmod -R go-rwx(属主之外全禁)。这个目录必须严格保密,
它 + 加密口令合起来等于证书私钥。

五、产物回流(沿用进展 3 的脚本,这次是真产物)

找到 2 个产物:
     7012263  .../entry-default-signed.hap
     6927741  .../entry-default-unsigned.hap

落点:/mnt/d/Yongquan/code/_harmonyos-builds/familybook/20261029-161635
  ✓ ...entry-default-signed.hap      7012263 bytes  4bad1a7870209f8c…
  ✓ ...entry-default-unsigned.hap    6927741 bytes  556103a48bc27120…
✅ 回流完成,已逐字节校验。

Windows 侧独立算 sha256 复核(不是只信 WSL 的自我报告):

文件 Windows 侧 sha256 WSL 源端 一致
signed 4bad1a7870209f8c189a0c4a43b27566f3a0679d2c7057e5aa963fd4a2d6c028 同左 ✅
unsigned 556103a48bc271209fb5ed3653f331e07b6b7b34d6f8d1a4edd7248522934fdd 同左 ✅

Windows 侧 unzip -l 能正常读出 45 个条目,文件未损坏。

六、环境收敛

  • /home/yongquan/downloads/command-line-tools → 软链到 clt26/command-line-tools(26.0.0.851)
  • 旧的 API 18 包移到 command-line-tools.api18.bak(保留但不再使用)
  • ~/.workbuddy/env/harmonyos.sh 重写:新增 DEVECO_NODE_HOME、LD_LIBRARY_PATH
    (hms 的 .so 依赖 openharmony previewer 的 libskia_canvaskit.so 等)、
    一键函数 build_hap [debug|release]
  • build-profile.json5 已指向 cert/familybook/,targetSdkVersion: "26.0.0"

七、工作区状态

git status --porcelain  →  空
git check-ignore build-profile.json5  →  .gitignore:32 命中(含口令,不入库,正确)
cert/ 在仓库之外,不受 git 管理(正确)
当前 commit: fd3ea53

八、本单验收项全部完成

验收项 状态
1. 两仓库 clone 到 WSL,与 Windows 一致 ✅
2. WSL 内 assembleHap 跑通并产出 .hap ✅ 完成
3. cert/ 证书规范、权限受控、签名在 WSL 生效 ✅ 完成(含 material/)
4. 产物 scp 回流脚本 + 实际执行记录 ✅ 完成
5. WSL 构建流程文档 ✅ wsl-harmonyos-build.md

文档已重写,含全部踩坑与新解法。


剩余待办(不阻塞本单验收)

  • 真机安装验证(hdc install)——需要设备在线,且 p7b 的 device-ids
    只绑定当前这台(D5AB2387…7998),换机要重签 profile。
  • 无新增的代码改动,因此本单不产生 commit;build-profile.json5 属机器相关配置,按 .gitignore 不入库。

请确认后我关单;若想先在真机上装一遍确认可运行,我可以接着做 hdc 那一步。

## 🎉 进展 4(2026-10-29 16:16):WSL 内编译**已打通**,签名 HAP 产出并验签通过 用户 16:06 放入 `commandline-tools-linux-x64-26.0.0.851.zip`,从此前的「不可行」直接翻转为「完全可用」。 这是对本单**进展 2 结论的推翻与替代**,以本节为准。 --- ### 一、工具链到位 ``` Version: 26.0.0.851 hstack : 6.1.0 codelinter : 6.0.240 hvigor : 6.26.8 ohpm : 26.0.0.630 HarmonyOS SDK : HarmonyOS 26.0.0 Release (Ohos_sdk_public 26.0.0.105, API 26) apiVersion : 26 ``` `unzip -t` 全量校验 `No errors detected`;解压后 7.1G。 `hms/toolchains/lib/libimage_transcoder_shared.so` —— **x86-64 ELF,82KB,确实存在**。 先单独验证了这个库能否真被加载(上次就崩在这): ``` nm -D 检查 SkEncodeImage : 无 undefined(上次的 ABI 冲突消失) dlopen(RTLD_NOW) : OK: dlopen succeeded ``` 这一步是关键——证明它不再需要借 API 18 的库做 ABI 拼接。 ### 二、编译结果 ```bash source ~/.workbuddy/env/harmonyos.sh build_hap debug ``` ``` > hvigor Finished :entry:default@CompileArkTS... after 21 s 222 ms > hvigor Finished :entry:default@PackageHap... after 411 ms > hvigor Finished :entry:default@SignHap... after 1 s 678 ms > hvigor BUILD SUCCESSFUL in 26 s 593 ms 34 tasks in total: 34 executed, 0 up-to-date >>> 退出码:0 ``` **34 个 task 全部执行、0 个 up-to-date** —— 不是增量缓存蒙过去的。 之后又做了一次**彻底干净重建**(删掉 `entry/build`、`build`、`.hvigor`、`oh_modules`, 模拟全新 clone):同样 `34 executed, 0 up-to-date`,退出码 0。 ### 三、签名验证(最关键的一步) 没有停在 `BUILD SUCCESSFUL`,因为构建日志通过 ≠ 产物有效。用官方工具验: ```bash java -jar sdk/default/openharmony/toolchains/lib/hap-sign-tool.jar verify-app \ -inFile entry-default-signed.hap -outCertChain /tmp/v.cer -outProfile /tmp/v.p7b ``` ``` Find Hap Signing Block success, version: 3, block count: 3 trying verify codesign block verify codesign success Digest verify result: true, DigestAlgorithm: SHA-256 verify permission sign success. Write certificate chain success! verify: Verify success verify-app success ``` 证书链解析出来的主体就是本项目的开发者证书: ``` Subject : CN="杨永全(1845816276425949633)\,Development", OU=1845816276425949633, O=杨永全, C=CN Issuer : CN=Huawei CBG Developer Relations CA G2 Validity: 2026-10-11 22:10:56 ~ 2027-10-11 22:10:56 ``` 产物内 `module.json` 实测值: ``` bundleName : familybook.yangyq.net versionName: 0.8.0 versionCode: 800 targetAPI : 260000026 minAPI: 60101024 compileSdk : 26.0.0.105 HarmonyOS buildMode : debug ``` ### 四、🔴 遇到并解决的一个隐藏坑:`material/` 目录 首次编译通过了 31 个 task,卡在最后一个签名步骤: ``` > hvigor ERROR: Failed :entry:default@SignHap... > hvigor ERROR: Error Code: 00308018 Unknown Error ENOENT: no such file or directory, stat '/home/yongquan/code/cert/familybook/material' ``` 查 `hvigor-ohos-plugin/src/utils/decipher-util.js` 找到根因: ```js static decryptPwd(t, r, e){ ... const _ = DecipherUtil.getKey(t, e); // t = path.resolve(storeFile, '..') } static getKey(t, r){ const e = path.resolve(t, 'material'); fs.statSync(e).isDirectory() || printErrorExit(...) } ``` **`storePassword` / `keyPassword` 不是明文**,是用密钥材料加密的 hex。hvigor 解密时会在 **`storeFile` 的上一级目录**里找 `material/`,读 `fd`/`ac`/`ce` 三组密钥派生 AES-128-GCM key。 因为我把三个证书路径都指到了 `cert/familybook/`,hvigor 就去那里找 `material`, 而 `material` 原本在 Windows 的 `C:\Users\Yongquan\.ohos\config\material`(DevEco 建证书时生成)。 补上即可(`material` 是**账号级**材料,不随项目变,所有项目共用): ``` cert/familybook/material/ ├── ac/8649f462784e47c3b1439a42e5ade9be 16 B ├── ce/d74c6dcc7cb04b51b8f16fe600a39a9c 48 B └── fd/{0,1,2}/<32位hex> 各 16 B ``` 权限已 `chmod -R go-rwx`(属主之外全禁)。**这个目录必须严格保密**, 它 + 加密口令合起来等于证书私钥。 ### 五、产物回流(沿用进展 3 的脚本,这次是真产物) ``` 找到 2 个产物: 7012263 .../entry-default-signed.hap 6927741 .../entry-default-unsigned.hap 落点:/mnt/d/Yongquan/code/_harmonyos-builds/familybook/20261029-161635 ✓ ...entry-default-signed.hap 7012263 bytes 4bad1a7870209f8c… ✓ ...entry-default-unsigned.hap 6927741 bytes 556103a48bc27120… ✅ 回流完成,已逐字节校验。 ``` **Windows 侧独立算 sha256 复核**(不是只信 WSL 的自我报告): | 文件 | Windows 侧 sha256 | WSL 源端 | 一致 | |---|---|---|---| | signed | `4bad1a7870209f8c189a0c4a43b27566f3a0679d2c7057e5aa963fd4a2d6c028` | 同左 | ✅ | | unsigned | `556103a48bc271209fb5ed3653f331e07b6b7b34d6f8d1a4edd7248522934fdd` | 同左 | ✅ | Windows 侧 `unzip -l` 能正常读出 45 个条目,文件未损坏。 ### 六、环境收敛 - `/home/yongquan/downloads/command-line-tools` → 软链到 `clt26/command-line-tools`(26.0.0.851) - 旧的 API 18 包移到 `command-line-tools.api18.bak`(保留但不再使用) - `~/.workbuddy/env/harmonyos.sh` 重写:新增 `DEVECO_NODE_HOME`、`LD_LIBRARY_PATH` (hms 的 `.so` 依赖 openharmony previewer 的 `libskia_canvaskit.so` 等)、 一键函数 `build_hap [debug|release]` - `build-profile.json5` 已指向 `cert/familybook/`,`targetSdkVersion: "26.0.0"` ### 七、工作区状态 ``` git status --porcelain → 空 git check-ignore build-profile.json5 → .gitignore:32 命中(含口令,不入库,正确) cert/ 在仓库之外,不受 git 管理(正确) 当前 commit: fd3ea53 ``` ### 八、本单验收项全部完成 | 验收项 | 状态 | |---|---| | 1. 两仓库 clone 到 WSL,与 Windows 一致 | ✅ | | 2. WSL 内 `assembleHap` 跑通并产出 `.hap` | ✅ **完成** | | 3. `cert/` 证书规范、权限受控、签名在 WSL 生效 | ✅ 完成(含 `material/`) | | 4. 产物 scp 回流脚本 + 实际执行记录 | ✅ 完成 | | 5. WSL 构建流程文档 | ✅ `wsl-harmonyos-build.md` | 文档已重写,含全部踩坑与新解法。 --- ### 剩余待办(不阻塞本单验收) - 真机安装验证(`hdc install`)——需要设备在线,且 p7b 的 `device-ids` 只绑定当前这台(`D5AB2387…7998`),换机要重签 profile。 - 无新增的代码改动,因此本单**不产生 commit**;`build-profile.json5` 属机器相关配置,按 `.gitignore` 不入库。 请确认后我关单;若想先在真机上装一遍确认可运行,我可以接着做 `hdc` 那一步。
Author
Owner

进展 5(2026-10-29 20:35):真机安装首次成功,实测发现 1 个真实缺陷

手机上线后开始端到端实测。先报结论:安装、启动、界面渲染、交互全部正常;
但发现一个真实功能缺陷 —— 只读日历的日程在首页仍显示「编辑日程」按钮,点了必然报错。

一、设备与环境

项 值
序列号 5NC0225B27004718
型号 DEL-AL20(HUAWEI)
系统 HarmonyOS 7.0.0.109(SP6C00E105R3P5) / API 26
UDID D5AB2387EA48A57D60BB2F139C36443367B41FEFB0DCCC6071C6FC95C1E77998

🔴 UDID 与 p7b profile 里的 device-ids 完全一致 ⇒ 签名绑定正确,可以安装。

二、安装

hdc -t 5NC0225B27004718 install -r <signed.hap>
[Info]App install path:D:\...\entry_build_default_outputs_default_entry-default-signed.hap
      msg:install bundle successfully.
AppMod finish

bm dump -n familybook.yangyq.net 能读到完整 applicationInfo,appIdentifier 6918744692675798335
与 profile 的 app-identifier 一致。

⚠️ 踩坑:hdc.exe 是 Windows 程序,不接受 Git Bash 的 /d/... 路径,
且会把当前工作目录拼在绝对路径前面。必须 cd 到产物目录再用纯文件名,
并 export MSYS2_ARG_CONV_EXCL='*'。同理 file recv 也是。

三、运行验证(全部通过)

  • 进程存活:pidof = 43406,稳定运行,无 FATAL / jscrash 记录
  • 启动日志:start ability successfully
  • 后台同步正常:后台同步[foreground] 完成:12/12,耗时 3 秒、发现附件 248 个(新登记 4)
  • 桌面卡片 Ability 正常注册/注销:FbFormAbility 生命周期完整

界面渲染(dumpLayout 取到的真实文字):

首页 / 杨 / ☾ 晚上好,杨永全 / 17°C / 晴
10 月 29 日 · 星期四 / 九月二十
山东·青岛 · 20° / 14° · 西风 9 km/h
今天日程 在做 11 / 待办 3 / 逾期 5 / 0
+ 新建 / 今天的日程 11 条
清理万向轮充电座  全天
08:20-09:00 语文
09:15-09:55 综合实践活动
10:05-11:55 生成式人工智能  B216
10:25-11:05 艺术2
13:30-15:30 2026年趣味运动会  西海岸校区西区体育场
14:00-14:40 计算机技术与社会、法律和伦理★  B202
15:35-17:00 👊散打搏击

数据是真实业务数据(含农历、天气、课程表),不是占位。

四、交互验证

动作 结果
点「+ 新建」 ✅ 跳到新建日程页(含日历、列表/周/月切换)
返回 ✅ 正确回首页
点日程条目 ✅ 弹出详情浮层(标题/时间/日历本/地点/备注)
详情页「导航」按钮 ✅ 存在(有地点时才显示)
详情页「编辑日程」 ✅ 就地弹编辑表单,不跳页
编辑表单结构 ✅ 标题输入 / 全天 Toggle / 加入哪本日历 / 日期与时间 / 重复 / 删除 / 保存
输入并保存 ⚠️ 见下节

注:uitest uiInput inputText 必须写成 inputText <x> <y> <text>(带坐标),
只给文字会被当成缺参数静默忽略。收键盘用 keyEvent Back,
键盘弹起时会盖住「保存」按钮,必须先收键盘。

五、🔴 发现的真实缺陷:只读日历仍给「编辑日程」

日程「生成式人工智能」属于「工作学习」日历本,当前账号没有写权限。
但首页详情卡照样显示「编辑日程」,点进去能编辑,点保存才报错:

保存失败:这本日历你没有写权限。

hvigor 日志侧同时留下:

W A00000/familybook.yangyq.net/FbEventEdit: 保存日程失败:这本日历你没有写权限。

根因(代码级):

FbHomePage.ets:1501 把 canEdit 写死成 true:

FbEventSheet({
  ...
  canEdit: true,        // ← 无条件给编辑入口
  onEdit: (): void => { this.editEventFromDetail(); }
})

而 FbEventSheet.ets:427 只是照这个布尔值渲染按钮:

if (this.canEdit) {
  Text('编辑日程').onClick((): void => { this.onEdit(); })
}

对比日历页(同一件事做对了):

// FbCalendarPage.ets:902
canEdit: this.detailBase !== null && isEditableEvent(this.detailBase),

isEditableEvent()(Types.ets:640)的定义是:

export function isEditableEvent(e: FbCalEvent): boolean {
  return e.kind === 'custom' && e.id > 0 && e.calId > 0;
}

⚠️ 注意它只判了 kind/id/calId,没判 canWrite,所以即便照搬也还不够 ——
真正要的是「这本日历我能不能写」。FbCalBook 上有现成的 canWrite 字段
(Types.ets:650,注释写着「我能不能写(Calendar::canWrite)」)。

首页 canEdit: true 是 v86 有意为之(注释记录了「打开编辑入口」的决定),
那条决定本身没错 —— 错在没把"只读日历"排除掉。

建议修法(待确认后实施):首页把 canEdit 改成
this.evtBase !== null && isEditableEvent(this.evtBase) && 该日程所属日历的 canWrite,
与日历页对齐,同时补上 canWrite 判定;FbCalendarPage 那处也一并补。

六、🔴 另一个问题:需要人工解锁手机

测试到中途设备锁屏,aa start 报:

Error Code:10106102
Error Message:The device screen is locked during the application launch, unlock screen failed.
Error cause: The current mode is developer mode, and the screen cannot be unlocked automatically

power-shell wakeup、keyEvent Power 都只能点亮屏幕,有密码锁的情况下无法脚本化解锁。
后续自动化测试开始前,需要先手动解锁手机(或临时关闭锁屏密码)。

七、工具

新增 fb_device_probe.sh(真机端到端探测):
screens 列当前页全部文字与可点坐标、tap-text 按文字点击、
flow-edit 跑完整编辑流程、shot 截图。
核心思路是每次点击前重新 dumpLayout 动态取坐标,
因为叠层时坐标会漂移,硬编码必然点错(本轮踩了多次)。

八、待办

  1. 🔴 修「只读日历仍给编辑入口」—— 需你确认修法后我改码,改完重新编译 + 真机复验。
  2. 解锁手机后继续测:新建日程、删除、重复规则、附件预览、其它模块(任务/资源/记账等)。
  3. 工单 #29(资源模块详情/编辑分离)真机点验。
## 进展 5(2026-10-29 20:35):真机安装首次成功,实测发现 1 个真实缺陷 手机上线后开始端到端实测。**先报结论:安装、启动、界面渲染、交互全部正常; 但发现一个真实功能缺陷 —— 只读日历的日程在首页仍显示「编辑日程」按钮,点了必然报错。** ### 一、设备与环境 | 项 | 值 | |---|---| | 序列号 | `5NC0225B27004718` | | 型号 | DEL-AL20(HUAWEI) | | 系统 | HarmonyOS 7.0.0.109(SP6C00E105R3P5) / API 26 | | **UDID** | `D5AB2387EA48A57D60BB2F139C36443367B41FEFB0DCCC6071C6FC95C1E77998` | 🔴 **UDID 与 p7b profile 里的 `device-ids` 完全一致** ⇒ 签名绑定正确,可以安装。 ### 二、安装 ```bash hdc -t 5NC0225B27004718 install -r <signed.hap> ``` ``` [Info]App install path:D:\...\entry_build_default_outputs_default_entry-default-signed.hap msg:install bundle successfully. AppMod finish ``` `bm dump -n familybook.yangyq.net` 能读到完整 applicationInfo,`appIdentifier 6918744692675798335` 与 profile 的 `app-identifier` 一致。 > ⚠️ 踩坑:`hdc.exe` 是 Windows 程序,**不接受 Git Bash 的 `/d/...` 路径**, > 且会把当前工作目录拼在绝对路径前面。必须 `cd` 到产物目录再用**纯文件名**, > 并 `export MSYS2_ARG_CONV_EXCL='*'`。同理 `file recv` 也是。 ### 三、运行验证(全部通过) - 进程存活:`pidof` = 43406,稳定运行,**无 FATAL / jscrash 记录** - 启动日志:`start ability successfully` - 后台同步正常:`后台同步[foreground] 完成:12/12,耗时 3 秒`、`发现附件 248 个(新登记 4)` - 桌面卡片 Ability 正常注册/注销:`FbFormAbility` 生命周期完整 **界面渲染(dumpLayout 取到的真实文字)**: ``` 首页 / 杨 / ☾ 晚上好,杨永全 / 17°C / 晴 10 月 29 日 · 星期四 / 九月二十 山东·青岛 · 20° / 14° · 西风 9 km/h 今天日程 在做 11 / 待办 3 / 逾期 5 / 0 + 新建 / 今天的日程 11 条 清理万向轮充电座 全天 08:20-09:00 语文 09:15-09:55 综合实践活动 10:05-11:55 生成式人工智能 B216 10:25-11:05 艺术2 13:30-15:30 2026年趣味运动会 西海岸校区西区体育场 14:00-14:40 计算机技术与社会、法律和伦理★ B202 15:35-17:00 👊散打搏击 ``` 数据是真实业务数据(含农历、天气、课程表),不是占位。 ### 四、交互验证 | 动作 | 结果 | |---|---| | 点「+ 新建」 | ✅ 跳到新建日程页(含日历、列表/周/月切换) | | 返回 | ✅ 正确回首页 | | 点日程条目 | ✅ 弹出详情浮层(标题/时间/日历本/地点/备注) | | 详情页「导航」按钮 | ✅ 存在(有地点时才显示) | | 详情页「编辑日程」 | ✅ 就地弹编辑表单,**不跳页** | | 编辑表单结构 | ✅ 标题输入 / 全天 Toggle / 加入哪本日历 / 日期与时间 / 重复 / 删除 / 保存 | | 输入并保存 | ⚠️ 见下节 | > 注:`uitest uiInput inputText` 必须写成 `inputText <x> <y> <text>`(带坐标), > 只给文字会被当成缺参数静默忽略。收键盘用 `keyEvent Back`, > **键盘弹起时会盖住「保存」按钮**,必须先收键盘。 ### 五、🔴 发现的真实缺陷:只读日历仍给「编辑日程」 日程「生成式人工智能」属于「工作学习」日历本,当前账号**没有写权限**。 但首页详情卡照样显示「编辑日程」,点进去能编辑,点保存才报错: ``` 保存失败:这本日历你没有写权限。 ``` hvigor 日志侧同时留下: ``` W A00000/familybook.yangyq.net/FbEventEdit: 保存日程失败:这本日历你没有写权限。 ``` **根因(代码级)**: `FbHomePage.ets:1501` 把 `canEdit` **写死成 `true`**: ```ts FbEventSheet({ ... canEdit: true, // ← 无条件给编辑入口 onEdit: (): void => { this.editEventFromDetail(); } }) ``` 而 `FbEventSheet.ets:427` 只是照这个布尔值渲染按钮: ```ts if (this.canEdit) { Text('编辑日程').onClick((): void => { this.onEdit(); }) } ``` 对比**日历页**(同一件事做对了): ```ts // FbCalendarPage.ets:902 canEdit: this.detailBase !== null && isEditableEvent(this.detailBase), ``` `isEditableEvent()`(`Types.ets:640`)的定义是: ```ts export function isEditableEvent(e: FbCalEvent): boolean { return e.kind === 'custom' && e.id > 0 && e.calId > 0; } ``` ⚠️ 注意它**只判了 kind/id/calId,没判 `canWrite`**,所以即便照搬也还不够 —— 真正要的是「这本日历我能不能写」。`FbCalBook` 上有现成的 `canWrite` 字段 (`Types.ets:650`,注释写着「我能不能写(Calendar::canWrite)」)。 首页 `canEdit: true` 是 v86 有意为之(注释记录了「打开编辑入口」的决定), 那条决定本身没错 —— **错在没把"只读日历"排除掉**。 **建议修法**(待确认后实施):首页把 `canEdit` 改成 `this.evtBase !== null && isEditableEvent(this.evtBase) && 该日程所属日历的 canWrite`, 与日历页对齐,同时补上 `canWrite` 判定;`FbCalendarPage` 那处也一并补。 ### 六、🔴 另一个问题:需要人工解锁手机 测试到中途设备锁屏,`aa start` 报: ``` Error Code:10106102 Error Message:The device screen is locked during the application launch, unlock screen failed. Error cause: The current mode is developer mode, and the screen cannot be unlocked automatically ``` `power-shell wakeup`、`keyEvent Power` 都只能点亮屏幕,**有密码锁的情况下无法脚本化解锁**。 后续自动化测试开始前,需要先手动解锁手机(或临时关闭锁屏密码)。 ### 七、工具 新增 `fb_device_probe.sh`(真机端到端探测): `screens` 列当前页全部文字与可点坐标、`tap-text` 按文字点击、 `flow-edit` 跑完整编辑流程、`shot` 截图。 核心思路是**每次点击前重新 dumpLayout 动态取坐标**, 因为叠层时坐标会漂移,硬编码必然点错(本轮踩了多次)。 ### 八、待办 1. 🔴 修「只读日历仍给编辑入口」—— 需你确认修法后我改码,改完重新编译 + 真机复验。 2. 解锁手机后继续测:新建日程、删除、重复规则、附件预览、其它模块(任务/资源/记账等)。 3. 工单 #29(资源模块详情/编辑分离)真机点验。
Author
Owner

用户验收通过,关单(2026-11-01)

用户 2026-11-01 明确回复「#30,可以关单了」。

五条验收项终态

验收项 结果
1. 两仓库 clone 到 WSL,与 Windows 一致 ✅ /home/yongquan/code/{FamilyBook,FamilyBook_harmonyos},remote 指向 code.yangyq.net
2. WSL 内 assembleHap 跑通并产出 HAP ✅ 34 tasks 全执行 0 up-to-date,退出码 0;干净重建同样通过
3. cert/ 证书规范、权限受控、签名在 WSL 生效 ✅ cert/familybook/ 700/600/644 分层;material/ 账号级材料已补齐
4. 产物回流脚本 + 实际执行记录 ✅ tools/hap_export.sh,sha256 双侧独立校验一致,含 4 组反证
5. WSL 构建流程文档 ✅ wsl-harmonyos-build.md

关键技术结论(留给以后)

  • 唯一缺口是API 26 Linux 版闭源 hms,公开镜像只到 API 18,必须用
    commandline-tools-linux-x64-26.0.0.851.zip(含 x86-64 的 libimage_transcoder_shared.so)。
    跨版本拼接 SDK 会造成「假通过后签不出/装不上」,已列入禁止项。
  • 签名坑:storePassword/keyPassword 是加密 hex,hvigor 会在 storeFile 的上一级目录
    找 material/(fd/ac/ce 三组密钥)派生 AES-128-GCM key。缺这个目录报
    00308018 ENOENT ... material。material 是账号级材料,所有项目共用,必须严格保密。
  • 产物回流默认走 /mnt/d 直写(Windows 侧没开 sshd),落点在仓库之外避免污染 git status。

遗留(不属本单范围)

  • p7b 的 device-ids 单设备绑定(当前这台 UDID D5AB2387…7998),换机需重签 profile。
  • 真机上的只读日历编辑入口问题已在 #31 单独修复并关闭。
## 用户验收通过,关单(2026-11-01) 用户 2026-11-01 明确回复「#30,可以关单了」。 ### 五条验收项终态 | 验收项 | 结果 | |---|---| | 1. 两仓库 clone 到 WSL,与 Windows 一致 | ✅ `/home/yongquan/code/{FamilyBook,FamilyBook_harmonyos}`,remote 指向 code.yangyq.net | | 2. WSL 内 `assembleHap` 跑通并产出 HAP | ✅ 34 tasks 全执行 0 up-to-date,退出码 0;干净重建同样通过 | | 3. `cert/` 证书规范、权限受控、签名在 WSL 生效 | ✅ `cert/familybook/` 700/600/644 分层;`material/` 账号级材料已补齐 | | 4. 产物回流脚本 + 实际执行记录 | ✅ `tools/hap_export.sh`,sha256 双侧独立校验一致,含 4 组反证 | | 5. WSL 构建流程文档 | ✅ `wsl-harmonyos-build.md` | ### 关键技术结论(留给以后) - 唯一缺口是**API 26 Linux 版闭源 hms**,公开镜像只到 API 18,必须用 `commandline-tools-linux-x64-26.0.0.851.zip`(含 x86-64 的 `libimage_transcoder_shared.so`)。 跨版本拼接 SDK 会造成「假通过后签不出/装不上」,已列入禁止项。 - 签名坑:`storePassword`/`keyPassword` 是加密 hex,hvigor 会在 **`storeFile` 的上一级目录** 找 `material/`(`fd`/`ac`/`ce` 三组密钥)派生 AES-128-GCM key。缺这个目录报 `00308018 ENOENT ... material`。`material` 是账号级材料,所有项目共用,必须严格保密。 - 产物回流默认走 `/mnt/d` 直写(Windows 侧没开 sshd),落点在仓库之外避免污染 git status。 ### 遗留(不属本单范围) - p7b 的 `device-ids` 单设备绑定(当前这台 UDID `D5AB2387…7998`),换机需重签 profile。 - 真机上的只读日历编辑入口问题已在 #31 单独修复并关闭。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/FamilyBook#30