苹果新手Mac OS X 使用笔记--------应用程序静态布局

来源:互联网 发布:淘宝店铺找回 编辑:程序博客网 时间:2024/05/17 01:23

注意:MacOS X系统支持多种形式的应用程序,请参考:苹果新手Mac OS X 使用笔记--------四种应用程序类型

本文特指具有GUI的基于Cocoa开发的程序,此种程序也是MacOS X中的最普遍最“苹果”的程序。

学习一种新的操作系统,就必须要学习一个应用程序是如何组织和运行的。也就是一个可执行程序的静态和动态布局。静态布局指的是程序作为文件或者文件夹是如何存放到文件系统中的,动态布局则是指操作系统的程序加载器如何把程序文件加载到内存中并跳转到程序入口点执行。对于同样的硬件体系结构来说,程序的动态布局基本相同,而静态布局则相差甚远。

1 Windows、Linux系统应用程序静态布局及其问题

1. 1 Windows系统应用程序静态布局及问题

对Windows用户来说,应该很熟悉一个程序的静态布局了。对于常见的程序如Word来说,基本上程序的文件和配置分散到三个地方:

  • l  第一个是程序的安装主目录,如C:\ProgramFiles\Microsfot Office
  • l  第二个是系统共享动态库目录C:\Windows\System32
  • l  第三个就是系统注册表。

 

这种布局导致的问题已经众所周知了。其中system32下动态链接库版本问题导致的“dll地狱”让人尤其头疼,注册表过于庞大杂乱臃肿让人心烦。

微软为了解决这个问题,发起了.net项目。目前.net已经成为了微软操作系统的核心组成部分,也确实解决了上述问题,用.net开发绿色软件非常方便可行。

1.2 linux系统应用程序静态布局及问题

Linux系统本身并没有应用程序的静态布局规范,不同的安装软件方式导致不同的布局方式。例如使用源码编译安装时可以选择把程序的所有文件安装到自己独立的目录下,也可以选择安装到不同的目录下。当系统中安装的程序变多以及依赖关系复杂时,就会导致很大的混乱。

为此,各个发行版厂商提供了自己的包管理工具,如RedHat提出的著名的rpm,以及Debian提出的pkg。目前这两大包管理工具基本解决了软件包的管理问题。但是个人觉得软件的静态布局本身还是很零散,彼此隔离做的不好,只是包管理工具为用户屏蔽了这种复杂性。

 

2 Mac OS X系统应用程序静态布局与bundle

2.1 bundle

bundle是Mac OSX中的核心概念,它起源于NeXTSTEP,现在已经是移动app的事实标准了。Bundle是应用程序、框架、插件、组件、甚至内核扩展的基础。

苹果公司把bundle定义为:“用来容纳可执行文件和可执行文件所依赖的资源的一种标准的目录层级结构”。尽管存在不同类型的bundle,但是所有的bundle共享相同的基本目录结构,同样类型的bundle则拥有完全相同的目录结构。

2.2 应用程序静态布局

在Mac OSX中应用程序是作为一种特定类型的bundle出现的。本质上,应用程序bundle就是一个文件夹,只是这个文件夹的名字以.app结尾。在Finder中,如果直接双击名字以.app结尾的文件夹,系统会把这个文件夹当做应用程序来加载执行。如果不想运行程序,而是想要查看这个文件夹里的内容,则需要右键,然后选择显示包内容。下面以GoogleChrome浏览器这个程序为例进行说明。在Finder中右键GoogleChrome.app这个程序图标,然后选择显示包内容,会打开这个文件夹。如下图所示:

 

上图呈现的目录结构层次是所有的GUI应用程序共同遵守的。程序根目录下只有一个名为Contents的子目录,该子目录下分设多个文件和目录,下面逐一进行说明。

  • info.plist

这是程序的属性文件,包含了这个程序的依赖项描述和其他的元信息。此文件有三种形式:xml文本格式、xml二进制、json文本格式。Xml文本格式易于人来读写,二进制则利于系统快速加载,json格式对人和机器分析都很友好。目前来看,在MacOS X中使用最多的还是xml文本格式,二进制在iOS的移动app中使用较多,json格式很少见。

既然是文本文件,就很容易使用文本编辑工具进行查看和修改,我们使用vim打开此文件,查看一些常见的配置项如下:

键名

键值

含义

CFBundleDevelopmentRegion:

en

如果用户没有指定语言配置,默认使用此处指定的语言。

CFBundleDisplayName:

Google Chrome

应用程序显示名称,供Finder等使用。

CFBundleDocumentTypes:

….

应用程序能够处理的各种文件类型。

CFBundleExecutable:

Google Chrome

应用程序中实际执行的二进制文件的名称,这个文件位于./MacOS目录下。

CFBundleIconFile:

app.icns

供Finder显示此程序的图标文件,这个图标文件中包含各种大小的图标。位于./Resources目录下

CFBundleIdentifier:

com.google.chrome

应用程序的唯一ID,使用反向DNS表示,此处为com.google.chrome。

CFBundleName:

Chrome

应用程序本身的名字。

CFBundlePackageType:

APPL

bundle类型,对于应用程序来说,其值必须为APPL。

CFBundleSignature:

rimZ

bundle的短名称。

CFBundleURLTypes:

应用程序能够处理的URL类型。

  • Resources

这个文件夹用来存放程序运行所需要的各种资源,如图标、图片、文档、数据….。这也是bundle优于其他布局方式的原因之一,在其他平台,这些资源往往需要与可执行代码编译连接到一起。资源文件与可执行代码分离的好处是很多的,如可执行文件更小、可以选择的性部分更新资源文件等。

资源文件的种类没有限制,其中有一些是非常常用的,列举如下:

    • .nib文件

这是程序GUI界面的描述文件,是.xib文件的二进制版本。使用Xcode开发的GUI程序一般都由此文件。

    • .icns文件

图标文件,里面包含了多个不同大小的图标文件,供程序自身以及Finder使用。

    • .lproj文件夹

这个是国际化文件夹,每种语言对应一个。文件夹里面是针对该语言的特殊键值配置项。例如zh_CN.lproj表示大陆中文,en.lproj表示英文。

  • _CodeSignature

该文件夹下面只有一个CodeResources文件。这个文件是为了防止外界对程序进行修改而存在的。里面存放的是改程序所包含的文件名及其对应的hash值。如果外界修改了某个文件,显然此hash值也就对应不上了。

  • MacOS

此文件夹里存放的是真正的可执行二进制文件。

  • Versions

在Mac OSX中,同一个程序的不同版本可以同时和谐相处,这在传统的Windows程序中几乎不可想象。此文件夹下面是针对程序不同版本的部分。对于GoogleChrome来说,此文件夹是真正的主要部分,MacOS下面的googlechrome仅仅是个程序外壳而已。此文件夹下又可以嵌套其他的应用程序bundle。可见,bundle是可以嵌套的。

2.3 Mac OS X中的程序都是绿色程序

在Windows中,需要为应用程序专门制作安装程序,让用户点击下一步来完成程序的部署;在Linux中,则是使用统一的软件包管理工具部署程序。那么在MacOS X中,如何部署程序呢?答案是复制粘贴。

前面我们也看到了,在MacOS X中应用程序本身就是一个独立的文件夹,其本身是自我说明的,不需要再额外依赖其他的文件。所以在安装软件的过程就是直接把下载的软件复制到/Application下。

3 动手开发一个应用程序bundle并部署

使用Xcode建立一个基于Cocoa的项目,名称为BundleTest。编译后在左侧项目视图中会出现Products\BundleTest.app的项。这个就是Xcode为我们自动编译打包生成的bundle。右键单击这个项,选择在Finder中显示,发现这个bundle位于Xcode的临时编译目录下。


在Finder中右键BundleTest.app,选择显示包内容,结果如下:


我们会发现,这个目录结构和前面分析的GoogleChrome程序目录结构非常相似。在Finder中把这个BundleTest.app文件夹复制到/Application中,就完成了此程序的安装部署。下图显示了部署后,BundleTest.app已经出现到了/Application中。此时双击它就可以运行了。


0 0
原创粉丝点击