iOS 平台安装包deb、ipa 和 pxl介绍

前言:

目前 iOS 平台上常见的安装包有三种:deb、ipa 和 pxl。

其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统,成为了当前在 Linux 下非常流行的一种安装包。进入 2.x 时代之后有 Cydia 作者 Jay Freeman(saurik) 移植到 iPhone 平台上,一起的还有 APT 软件管理系统。

而 ipa 格式则是苹果在 iOS 平台上推出的专属软件安装包,在2.0固件开始才正式使用,是目前 iPhone/iPod Touch/iPad 平台上唯一的官方安装包。

而pxl格式则起源于 Mac 系统上的 pkg 安装包,被广泛应用于1.x固件时代,曾经是 iPhone 平台上唯一的软件安装包,现在仍在被91等软件所使用。

安装包格式

.deb

deb 是 Unix 系统(其实主要是 Linux )下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。由于 Unix 类系统对权限、所有者、组的严格要求,而 deb 格式安装包又经常会涉及到系统比较底层的操作,所以权限等的设置尤其重要。

deb 包本身有三部分组成:数据包,包含实际安装的程序数据,文件名为 data.tar.XXX;

安装信息及控制脚本包,包含 deb 的安装说明,标识,脚本等,文件名为 control.tar.gz;

最后一个是 deb 文件的一些二进制数据,包括文件头等信息,一般看不到,在某些软件中打开可以看到。

deb 本身可以使用不同的压缩方式。tar 格式并不是一种压缩格式,而是直接把分散的文件和目录集合在一起,并记录其权限等数据信息。之前提到过的 data.tar.XXX,这里 XXX 就是经过压缩后的后缀名。deb 默认使用的压缩格式为 gzip 格式,所以最常见的就是 data.tar.gz。常有的压缩格式还有 bzip2 和 lzma,其中 lzma 压缩率最高,但压缩需要的 CPU 资源和时间都比较长。

data.tar.gz包含的是实际安装的程序数据,而在安装过程中,该包里的数据会被直接解压到根目录(即 / ),因此在打包之前需要根据文件所在位置设置好相应的文件/目录树。

而 control.tar.gz 则包含了一个 deb 安装的时候所需要的控制信息。一般有 5 个文件:

control,用了记录软件标识,版本号,平台,依赖信息等数据;

preinst,在解包 data.tar.gz 前运行的脚本;

postinst,在解包数据后运行的脚本;

prerm,卸载时,在删除文件之前运行的脚本;

postrm,在删除文件之后运行的脚本;

在 Cydia 系统中,Cydia 的作者 Saurik 另外添加了一个脚本,extrainst_,作用与 postinst 类似。

.ipa

使用过 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 所有的存档文件进行写入操作。

.pxl

pxl 格式在1.x时代是 iPhone 平台上唯一的安装格式,原因是那时候还没有 Cydia 这样的 APT 管理软件,苹果官方也没有推出 App Store。由于在1.x时代积累了大量人气,在接下来的 App Store 时代中,pxl 格式以其相对简易的打包和安装方式,仍然占据了很大一部分市场。但随着 Installer 的停止开发,iBrickr 等软件停止更新,目前唯一还在坚持使用 pxl 格式的就只剩下91一家了。

pxl 安装包通常包含3个组件:

PxlPkg.plist 记录程序文件的存放位置、所有者、权限以及软件标识等信息;

PkgScript文 件夹,存放安装和卸载脚本;

程序文件。

PxlPkg.plist 文件的开头通常是 CFBundleIdentifier,记录着软件的唯一标识,以和其他软件进行区分。RDPxlPackageVersion 则记录软件版本。RDPxlPackageFireware 被用来记录可以运行的固件版本。其余还有一些键值是用来记录软件介绍、网址、作者信息等数据。

除 了软件标识、软件版本和可用固件版本以外,PxlPkg.plist 的核心部分就是 RDPxlPackageFiles 和 RDPxlPackagePostflight 两项。RDPxlPackageFiles 记录了程序文件应该被复制到的路径,并提供了是否覆盖的参数: overwrite。而 RDPxlPackagePostflight 则记录程序文件应该被赋予的所有者和权限,分别以 chown 和 chmod 命令来实现。另外,对于含有安装/卸载脚本的 pxl 来说,还会以 sh 命令执行相应的脚本 Postflight 和 Preremove。

PkgScript 通常包含两个文件,安装后执行的脚本 Postflight 和卸载前执行的脚本 Preremove,这两个脚本就是标准的 Linux Shell Script,以 sh 命令执行。

安装包的特点.

deb丰富的资源:Cydia 上本身就不少,更何况任何格式的安装包都可以转换为 deb。

相对方便的在线购买模式:Cydia Store,不过尽管没有 App Store 的5台设备的限制,但对国内用户来说,付款方式比较困难。

破解难度较大,没有使用 App Store 的验证方式,所以必须将验证和防破解措施加入程序里面,这样就比较难破解,对软件开发者来说是个好事。

完善的 Unix 文件系统支持:无需以命令设置文件的权限、所有者和用户组(当然也可以以脚本来设置)

完善的脚本支持:5个脚本依照安装和卸载