Monthly Archives: January 2022

第二章-OSX概览 框架

如前文所说Mac OS X的框架也是一种特殊的bundle。框架中通常包含一个或多个动态链接库和其他的必要文件。框架通常包含以下资源 动态链接库 头文件 Nib(NeXT Interface Builder)文件 本地化文件 图片 文档 Info.plist 音频文件 一个框架通常有着清晰的结构,有些是系统强制的,另一些是出于习惯或约定。例如有一个Foo.framework,那么它的结构应该是这样的 在Resources目录里的Info.plist包含了框架的信息。框架可以带版本,意味着如果一个应用程序需要一个特定版本的框架,那系统需要包含相同或兼容的版本号的框架才能运行。通常大版本更新都意味着不兼容,而小版本之间可以相互兼容。一个框架可以有多个大版本,例如Foo有两个版本,A和B。另外框架还有一个符号链接Current指向最新的大版本。如果不指定版本系统将使用Current指向的动态链接库。 一个框架可以包含其他的子框架,这种框架叫umbrella framework。Umbrella framework可以隐藏内部复杂的依赖关系,对外看起来就像一个大框架。Umbrella framework的文件结构和上文中普通的框架类似,但有一个额外的子目录Framework,就是包含子框架的目录。通常程序员不会专门要求链接器链接到一个子框架,也不需要知道自己使用的框架是不是umbrella framework。使用umbrella framework时会自动暴露所有子框架的API。如果动态链接器遇到一个umbrella framework中的符号,它会自动搜索所有的子框架去寻找这个符号。 框架也可以是私有private的,意味着第三方程序员不能使用这个框架。Mac OS X有一些私有框架,包含在/System/Library/PrivateFrameworks/目录。例如DiskImages.framework就是其中之一。这些框架的不同之处在于 苹果不会说明这些框架的API,甚至不会公布它们的头文件 默认情况下第三方程序员不能链接到这些框架,然而如果提供给链接器完整的路径,这些框架还是可以被链接的。然而苹果不会给予这种链接方法任何支持 当一个使用动态链接的程序编译后,动态链接库的路径就会被编译进程序。通常使用系统框架的会使用绝对路径表示。除此之外第三方应用可以自带框架存储在它们的bundle中,这些框架可以使用相对路径表示。

Posted in OSX Internals笔记 | Leave a comment

第二章-OSX概览 核心服务

核心服务层实现了多个底层特性供更高层的应用使用。其中最重要的部分是Core Foundation框架(CoreFoundation.framework)和Core Service umbrella framework(CoreServices.framework)。这些框架包含一些重要的非图形化系统服务和API。例如,Core Foundation包含基本的数据管理API。这个框架使用C,Objective-C和swift写成。其他的一些框架,例如Cocoa,链接到Foundation框架,而最终也会链接到Core Foundation框架。因此Core Foundation是大部分框架的基础。很多Foundation的类是基于Core Foundation的类型的,使得在兼容的类型间转换变得容易。大部分导出的内核功能,也就是BSD和Mach的syscall,可以从核心服务器访问。 核心服务层包含一下功能,其中有一些已经被废弃,但在最新的Mac OS系统中仍然存在 Carbon服务,已经被废弃(CarbonCore.framework) 用户空间的网络API,支持HTTP,FTP,LDAP,Bonjour等协议(CFNetwork.framework) 用于访问系统组件,例如用户管理的API(OSServices.framework) 用于多语言搜索的API(SearchKit.framework) Spotlight搜索使用的元数据存储API(Metadata.framework) 通过Apple Event在进程间发送消息的API(AE.framework) 在系统字典中搜索词语的API(DictionaryServices.framework) 接收文件系统修改事件的API(FSEvent.API) 在Mac OS X中,不管是Finder搜索还是邮件搜索还是Spotlight,最后都是用SearchKit框架搜索的。

Posted in OSX Internals笔记 | Leave a comment