Hacker News 中文摘要

RSS订阅

macOS应用架构解析 -- The Anatomy of a macOS App

文章摘要

这篇文章简要介绍了macOS应用程序的基本结构和运行原理,重点讲解了在窗口化环境中运行的macOS程序的核心组成部分。

文章总结

macOS应用程序的结构解析

经典Mac OS时代

在早期的Mac OS中,应用程序采用资源分叉(Resource Fork)存储窗口、菜单等资源,而非将所有内容嵌入单一文件。例如,通过资源编辑器ResEdit可以查看QuarkXPress等软件的资源文件,其中可执行代码也以CODE资源形式存储,每个文件还包含类型和创建者信息以支持Finder的功能。

Mac OS X的革新

Mac OS X引入了从NeXTSTEP继承的Bundle结构,取代了资源分叉。应用程序变为包含以下目录的层级结构:
- .app扩展名:主Bundle名称。
- Contents目录:包含核心组件。
- MacOS:存放GUI应用的主可执行文件及命令行工具。
- Resources:包含图标和GUI组件。
- Frameworks(部分应用):存放动态库(dylibs)。
- 关键文件
- Info.plist:定义可执行文件名称、图标、最低系统版本、文档类型等。
- PkgInfo:继承经典Mac OS的类型和创建者信息(非强制但普遍存在)。

应用启动依赖LaunchServices和RunningBoard,通过解析Info.plist信息协调launchd执行。

现代macOS的演进

2007年Mac OS X 10.5引入代码签名后,新增了:
- CodeSignature目录:存储签名文件CodeResources,用于验证Bundle完整性。
-
MASReceipt目录(App Store应用):存放商店收据。
- 公证机制(2018年起):可将苹果签发的“票据”钉入Bundle。

其他常见目录包括:
- Library:替代全局或用户Library文件夹的启动守护进程和登录项。
- XPCServicesPluginsExtensions:分别用于服务、插件和扩展功能。

优势与兼容性

Bundle结构的集中化提升了安装、更新和卸载的便捷性,同时增强了安全性。此外,针对Intel和Arm架构的应用程序结构无差异,通用二进制文件(Universal Binary)通过单一Mach-O文件包含多平台代码,并共享签名文件。

(注:原文中的导航菜单、评论、标签等非核心内容已省略,保留技术细节和演进逻辑。)

评论总结

以下是评论内容的总结:

  1. 关于苹果公证制度的争议

    • 主要观点:认为苹果的公证制度对非App Store应用造成负面影响,增加了用户使用难度
    • 关键引用:
      "非公证应用对用户来说体验很差,实际上这不是可选项"
      "对于知道如何操作的用户,现在需要进入系统设置才能允许运行应用"
      "我支持苹果的安全措施,但认为对非App Store应用的公证制度对各方都是负面影响"
  2. 技术历史背景

    • 主要观点:指出NeXTSTEP的bundle系统对Java JAR文件的启发
    • 关键引用:
      "NeXTSTEP bundle系统是Java JAR文件的灵感来源"
  3. 对现代操作系统的批评

    • 主要观点:认为操作系统限制促使更多人转向Web应用
    • 关键引用:
      "难怪大家都在构建Web应用,操作系统正在努力让自己过时"
      "老版MacOS经典版很有趣,记得在学校用resedit修改应用"
  4. 对早期操作系统界面的怀念

    • 主要观点:怀念早期实用主义的操作系统界面设计
    • 关键引用:
      "第一张操作系统截图让我心沉,提醒我们已经走了多远"
      "多么希望我们的操作系统仍保持这种实用主义风格,而不是每年减少可用空间的圆角设计"
      "Mac硬件的卓越质量是我不转向Thinkpad/Linux的唯一原因"

总结呈现了四个主要观点:对苹果公证制度的批评、技术历史背景、对现代操作系统的看法,以及对早期操作系统界面的怀念。每个观点都保留了原始评论的关键引用,并保持了不同观点的平衡性。