修复:macOS 启动即崩溃 / Fix: macOS crash on launch
根因 / Root cause
macOS 包在使用 Hardened Runtime 的同时只是 ad-hoc 签名,却缺少该组合下必需的 com.apple.security.cs.disable-library-validation entitlement。
Hardened Runtime 会强制所有被 dlopen() 加载的动态库与主进程的 Team ID 一致。主进程是 ad-hoc 签名(没有 Team ID),而包内三个第三方预编译原生模块同样没有 Team ID,于是加载 better_sqlite3.node 时被 dyld 拒绝,主进程在初始化数据库时直接崩溃:
code signature in [...] not valid for use in process:
mapping process and mapped file (non-platform) have different Team IDs
v1.2.0 新增的 anki-apkg-export 把新的原生加载链路带进了启动路径,因此问题在 1.2.0 集中爆发。该缺陷在 v1.1.1 就已存在。
对已发布的 v1.2.0 产物做过签名解析验证:包内全部 22 个 Mach-O 均为 flags=0x10002 (CS_RUNTIME|CS_ADHOC)、TeamIdentifier 为空,嵌入的 entitlement 恰好只有旧的三个。
macOS 用户必读 / Required step for macOS users
本版本仍然没有 Developer ID 签名、未经过公证(目前没有 Apple Developer 账号)。首次启动前需要清除隔离标记:
sudo xattr -rd com.apple.quarantine /Applications/KnowNote.app这一步是必须的。此前 #32 中提到的同类操作之所以无效,是因为当时失败的并不是 Gatekeeper 隔离检查,而是上面的库校验。
本次改动 / Changes
build/entitlements.mac.plist增加disable-library-validation(核心修复)- 显式声明
mac.entitlements/hardenedRuntime/gatekeeperAssess asarUnpack补全**/*.node与**/*.dylib- DMG 产物名补上
${arch}(此前 arm64/x64 会静默互相覆盖) - 移除 npmmirror 的
electronDownload.mirror,保证签名可复现 - CI:发布前校验 entitlement,发布后回读产物验证;产物先以 draft 发布,验证通过才对外可见
已知限制 / Known limitations
- Intel Mac 暂不支持。 发布产物一直只有
arm64。在 Apple Silicon runner 上交叉构建会把 arm64 原生模块塞进 x64 包,因此未强行加入。 - 无公证。 需要 Apple Developer 账号才能做到开箱即用。
- #33 / #37 未修复。 embedding 失败与文档上传失败属于摄入链路的独立缺陷,仍然 open。
需要确认 / Please verify
本环境无法启动 macOS 应用,请 #32 / #34 的反馈者在本版本上确认一次。如仍有问题请重新开 issue 并附上崩溃日志。
Release artifacts
| File | 说明 |
|---|---|
knownote-1.2.1-arm64.dmg
| macOS (Apple Silicon),需执行上方 xattr 命令
|
KnowNote-1.2.1-arm64-mac.zip
| macOS 自动更新包 |
knownote-1.2.1-setup.exe
| Windows 安装包 |