OpenLogi macOS 打包内幕:签名、公证、DMG 与 dev/production 双通道 Bundle 全解指南

OpenLogi macOS 打包内幕:签名、公证、DMG 与 dev/production 双通道 Bundle 全解指南 OpenLogi macOS 打包内幕签名、公证、DMG 与 dev/production 双通道 Bundle 全解指南【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options, written in Rust — remap buttons, DPI, and SmartShift over HID. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogiOpenLogi 是一款用 Rust 编写的本地优先 Logitech Options 替代品无需账号、无遥测通过 HID 协议重映射按钮、DPI 与 SmartShift。它的 macOS 版本要交付签名 公证的.dmg本文带你拆解这套打包流水线签名、公证、DMG 制作以及 dev/production 双通道 Bundle 的身份隔离机制。为什么 macOS 打包比想象中难先看懂 3 个关键词在动手之前先建立三个概念后面所有设计都围绕它们展开关键词含义在 OpenLogi 中的对应代码签名用 Apple 身份对每个可执行文件签名macOS 据此识别谁在运行Agent 的辅助功能TCC授权绑定签名身份公证苹果对分发包的最终审查签名 安全时间戳是前提Developer ID 签名 --timestampTCC系统隐私授权辅助功能、输入监控、摄像头按 Bundle 身份记名身份一变授权全部作废最后一点是理解双通道设计的钥匙macOS 把权限授权记在 Bundle 的CFBundleIdentifier上身份换了 授权作废 配置目录漂移。打包流水线总览5 条 xtask 命令搞定 Bundle所有 macOS 打包逻辑集中在 xtask/src/commands/macos.rs 中共 5 个子命令macos icon—— 从 Icon Composer 文档编译应用图标macos bundle—— 构建OpenLogi.app默认 dev 通道macos dev-bundle—— 由 cargo runner 驱动把cargo run的二进制包成target/dev/OpenLogi.appmacos dmg—— 从现成 Bundle 制作品牌化 DMGmacos package——一键发行production 通道构建 Bundle → 可选 Developer ID 签名 → 打包签名 DMG其中macos bundle的核心流程见 xtask/src/commands/macos/bundle.rs是编译图标 → 构建全部 Release 二进制 →cargo-bundle生成.app→ 嵌入 Agent/Overlay 助手 → 嵌入 CLI → 校验二进制齐全 → 盖章身份 → 校验身份 →最后才签名因为签名会封死Info.plist一个 Bundle 里其实装了4 个可执行文件GUIopenlogi-desktop、常驻 Agentopenlogi-agent、Actions Ring 悬浮窗 Overlayopenlogi-overlay和命令行 CLI。助手表定义在 xtask/src/commands/macos/bundle/embed.rs。dev 与 production 双通道 Bundle身份隔离是怎么做的OpenLogi 用一个Channel枚举管理两套身份xtask/src/commands/macos/bundle/identity.rs。每个组件在两个通道下的身份如下组件production 身份dev 身份Apporg.openlogi.openlogi/ OpenLogiorg.openlogi.openlogi-dev/ OpenLogi DevAgentorg.openlogi.agent/ OpenLogi Agentorg.openlogi.agent-dev/ OpenLogi Agent DevOverlayorg.openlogi.overlay/ OpenLogi Overlayorg.openlogi.overlay-dev/ OpenLogi Overlay Dev品牌常量统一收敛在 crates/openlogi-core/src/brand.rsdev 通道 正式 ID 加-dev后缀、名称加Dev后缀。为什么不能偷懒这段注释里藏着一段血泪史releases 0.6.24–0.6.26 曾把 dev 身份的包发给了用户直接作废了所有已授予的权限配置也读错了目录。所以 OpenLogi 规定身份从不推断而是显式盖章stamp()—— 把所选通道身份写进每个组件的Info.plistverify()—— 签之前逐项读回校验dev 包绝不可能被误发布verify_icons()—— 确保每个组件都带 OpenLogi 图标隐私面板不会显示空白行嵌套助手的目录名与显示名严格一致如Contents/Library/LoginItems/OpenLogi Agent.app因为 macOS 隐私面板在元数据过期时会回退用文件名显示——名字差一个字母用户就无法辨认该行属于谁。从内到外签名为什么放弃 --deep改用 4 步签名顺序签名实现位于 xtask/src/commands/macos/bundle/signing.rs顺序是由内向外Agent 助手独立签名Overlay 助手独立签名内嵌 CLIContents/MacOS/openlogi带摄像头权限外层 App封装上面所有已签名内容之后用codesign --verify --strict逐一复核 4 个目标。这里有两个关键取舍不用--deep它已被苹果弃用且无法给嵌套助手独立签名。而 Agent 的辅助功能授权恰恰需要一份跨更新保持稳定的独立签名身份否则每次升级用户都要重新授权。加固运行时 时间戳所有签名都带--options runtime。production 用--timestamp安全时间戳是公证的必要条件本地开发签名用--timestampnone只保证本机可运行。本地签名走一条降级链signing.rsOPENLOGI_SIGN_IDENTITY→OPENLOGI_LOCAL_CODESIGN_IDENTITY→ 自动发现首个Apple Development:身份 → 都没有就跳过并警告未签名包每次构建会被 ad-hoc 重签辅助功能授权会反复失效。摄像头是另一个细节GUI 和 CLI 会打开摄像头预览/快照需要单独的加固运行时例外声明在 crates/openlogi-desktop/bundle/OpenLogi.entitlements 中Agent 和 Overlay 不用摄像头刻意不带这个权限。公证Notarization前的最后一道验证公证是苹果对分发包的最终审查仓库把公证所需的全部前提内置在构建流程里Developer ID 签名 加固运行时 安全时间戳 逐组件独立签名。production 通道只有在提供签名身份时才会真正签名bundle.rs未提供时明确打印 unsigned 提示从源头杜绝把未签名包当发行物的可能。DMG 环节还有一道身份闸门只要指定了签名身份就强制校验包内 Bundle 是 production 身份xtask/src/commands/macos/dmg.rs——一个 dev 包若流入用户手中会作废其权限授权并切换配置目录这与 0.6.24–0.6.26 的教训如出一辙。品牌化 DMG 制作步骤760×480 背景与 ULMO 压缩DMG 由create-dmg驱动细节都经过精打细算格式选 ULMOLZMA比默认 UDZOzlib小约 20%且 macOS 10.15 均可挂载低于项目 13.0 的底线几何锁定背景图是 760×480 的品牌图create-dmg使用外窗口尺寸故窗口高 480 32pt Finder 标题栏 512图标 128px应用图标定位 (212, 250)拖到 Applications 链接定位 (548, 250)背景图按需下载品牌背景通过OPENLOGI_DMG_BACKGROUND_URL指定默认从官方资源端拉取DMG 本体也签名codesign --force --timestamp --sign后附--verify复核dev bundle 快速上手cargo run 也能跑完整应用cargo run -p openlogi-desktop跑出来的裸target/debug二进制没有Info.plist和资源——macOS 只会显示通用图标、不注册openlogi://深链、TCC 也无从记名。macos dev-bundle就是为了解决这一切xtask/src/commands/macos/dev_bundle.rs与发行包共用同一套代码同一张身份表、同一份助手表、同一组Info.plist模板desktop-dev/Info.plist历史上两套实现曾导致 dev 版 Overlay 丢图标、dev 身份被迫改名两次硬链接加速95MB 的二进制优先硬链接进 Bundle瞬时完成签名时因codesign原地改写 Mach-O 而改用拷贝避免背着 Cargo 改了自己的构建产物Profile 匹配助手与 GUI 同 profile 构建——release GUI 配 debug Agent 是调试噩梦LaunchServices 注册lsregister -R让openlogi://深链指向 dev 构建且能重新抢占已安装版本占用的 schemeOPENLOGI_DEV_AGENT0可跳过助手嵌入只打主程序常用命令速查表 ⚡场景命令本地构建dev 通道默认cargo xtask macos bundle显式 production 通道构建cargo xtask macos bundle --channel production一键发行签名 DMGOPENLOGI_SIGN_IDENTITYDeveloper ID Application: … cargo xtask macos package交叉打包 Intel 版cargo xtask macos package --target x86_64-apple-darwin离线打包设备资产OPENLOGI_BUNDLE_ASSETS1 cargo xtask macos bundle重新编译应用图标cargo xtask macos icon更多打包背景可查阅 xtask/README.md 与 docs/DEVELOPMENT.md。关键文件清单 xtask/src/commands/macos/bundle/identity.rs —— 双通道身份设计说明xtask/src/commands/macos/bundle/signing.rs —— 从内到外签名与本地签名降级链xtask/src/commands/macos/dmg.rs —— 品牌化 DMG 几何与压缩策略crates/openlogi-core/src/brand.rs —— 三个 Bundle ID 与-dev后缀的唯一事实源crates/openlogi-desktop/bundle/ —— Agent/Overlay 的Info.plist模板与摄像头 entitlements总结OpenLogi 的 macOS 打包把身份当成一等公民——显式盖章、逐项校验、由内向外签名用双通道隔离开发环境与发行环境最终产出一个经得起公证、授权跨更新持久的分发包。这套思路对任何需要辅助功能权限的 macOS 工具都是很好的参考范本。【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options, written in Rust — remap buttons, DPI, and SmartShift over HID. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考