使用过 Mac OS 的人可能都知道,Mac 下的软件大部分都只有一个 .app
目录,里面包含了程序全部资源和可执行文件。简单来说,Mac 下的软件就像是 Windows 下的绿色软件一样,解压后即可使用,不需要安装,卸载的话也只用删除程序文件即可(这里不涉及 pkg 格式安装包)。而 ipa
格式可以视为这种 .app
软件的衍生物。
ipa 文件实质是一个 zip
压缩包(不是 rar 或 7z 包),包含 3 个组件:
- payload 目录下的
.app
目录,这个是软件的主程序; - iTunesArtwork,实质是一个无后缀名的
png
图片,用来在 iTunes 中显示图标; - iTunesMetadata.plist,记录购买者信息、售价等数据。
由于 zip 包不能记录权限和所有者等信息,所以苹果规定了 ipa 的安装方式,即全部 ipa 都会解包安装在 /var/mobile/Applications
目录下,全部文件和目录的所有者及用户组均设为 mobile(ID 为 501),主程序(可执行文件)的权限设为 0755 (所有人都可以执行,但只有所有者可以修改),可执行文件在 plist 中定义。全部目录权限设为 0755,而其它所有文件都设为 0644(仅所有者可以修改,其余人只允许读取,全部人都不允许执行)
。
ipa 解包后并非直接放置于 Applications 目录下,而是放在一串由随机码构成的目录下,其作用在于,只允许这个软件运行在一个特定的沙盒(Sandbox)中,不能干扰其他软件。因此那串随机码目录下,除了 ipa 本身的三个组件之外,还有三个目录:
Library,一般是用了储存设置文件等数据;
Documents,存储数据,多用了保存存档;
tmp,临时文件夹。
由于这个软件只能在这个特定的目录下运行(当然了,部分程序会调用系统的通讯录、相机等组件,但仍然是受限制的),从而保证了整个系统的安全性和稳定性。
由于 Unix 系统下对权限的规定相当严格,所以“越权”的行为是绝对不允许的。举个例子,mobile 用户无权删除 root 所有的文件,因为 root 的权限高于 mobile。所以有些人在修改 ipa 安装后的文件时,比如进行汉化或者修改存档,发现不能删除干净软件,或不能保存,这是因为删除时不能删除 root 所有的文件,程序本身也无法对 root 所有的存档文件进行写入操作。