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 命令執行。
2.特點
deb的特點
豐富的資源:Cydia 上本身就不少,更何況任何格式的安裝包都可以轉換為 deb。
相對方便的在線購買模式:Cydia Store,不過盡管沒有 App Store 的5臺設備的限制,但對國內用戶來說,付款方式比較困難。
破解難度較大,沒有使用 App Store 的驗證方式,所以必須將驗證和防破解措施加入程序里面,這樣就比較難破解,對軟件開發者來說是個好事。
完善的 Unix 文件系統支持:無需以命令設置文件的權限、所有者和用戶組(當然也可以以腳本來設置)
完善的腳本支持:5個腳本依照安裝和卸載的先后順序執行,可以提供更多選擇。比如備份還原操作,可以在 preinst 中備份文件,而在 postrm 中還原文件
嚴格的依賴關系:deb 遵循嚴格的依賴關系(于 Depends 和 Pre-Depends 指定),可以確保軟件運行所必需的組件。在線安裝的時候會自動安裝所依賴的軟件包。卸載時也很重要,比如軟件包 A 依賴于 B,當卸載 B 的時候會提示 A 依賴于 B,卸載掉 B 的話會導致 A 不能用,這樣可以確保系統的完整性和穩定性。
完全權限:由于 deb 必須以最高權限 root 的身份運行,deb可以對系統任何位置進行操作,換句話說,deb 擁有對整個系統的完全控制,因此 deb 安裝包軟件可以實現很多 ipa 不能實現的功能。
相對簡單的獲取方式(在線或離線)和安裝方式,也不用擔心在不同機器上同步會刪掉程序的問題。
安裝相對簡單:其實無論是哪種安裝包,安裝方法都不算很復雜,只不過 deb 稍微復雜一些。
deb 的安裝方法大體有 5 種:
Cydia 或同類 APT 管理軟件在線安裝,這個是最佳的安裝方式,因為通常無需考慮依賴關系,但缺點是對網絡的要求比較高;
命令行中以 dpkg -i XXX.deb 的形式安裝,好處是可以以通配符一次性安裝多個 deb,而且也可以直接看到腳本的運行狀況和安裝成功/失敗的提示信息,缺點是需要命令行軟件的支持,如 Putty/WinSCP的控制臺/iSSH/MobileTerminal,很多人也不熟悉命令行下的操作。另外,安裝完后會不顯示圖標;
放置于 AutoInstall 目錄重啟安裝。該方法實際是 Cydia 提供的一個啟動腳本,在每次系統啟動時以 dpkg 命令安裝
AutoInstall 目錄下的 deb,好處是不需要命令行操作,缺點是必須要重啟,有些甚至要重啟兩次,也會出現不顯示圖標的情況;
利用 iFile 安裝,好處是圖形化操作,桌面會顯示圖標,缺點是不能一次安裝多個 deb;
用 Cyder II 等軟件來安裝,其原理是模擬一個 APT 軟件管理器來下載相應的 deb 文件并傳到設備,然后以前面幾種方式來安裝。
總體來說,deb 的安裝都是依賴于 dpkg -i 命令來安裝,只不過有些是在命令行下輸入命令,有些是提供了圖形界面。但除了 Cydia 安裝一種方式之外,其余幾種安裝方式都存在一些共有的問題:
不會自行搜索依賴關系,必須手動提供所依賴的 deb;
Cydia 會讀取安裝腳本里的一些特殊語句,比如僅在全新安裝時執行而不在升級時執行,安裝完成后重啟 SpringBoard 或設備等等。
當然了,deb 軟件的卸載也比較簡單,有三種方式:
Cydia 里卸載,優點是卸載過程和提示信息很詳細,全圖形界面操作,同時也提供了重新安裝的選項;
以 dpkg -r Package_ID 命令或 dpkg -P Package_ID 命令來卸載(詳情后面會說);
Cydelete 來卸載,優點是可以直接在桌面上卸載有圖標的軟件,但對那些沒有圖標的無能為力。
其實,不管是安裝還是刪除,都可以才要全手動的方法。即,解包 deb 之后,自己將文件放到相應位置,然后設置權限等并執行腳本。但這樣有必要么?
deb 的安裝過程如下:
讀取數據庫并鎖定,避免同時有兩個安裝程序在運行
讀取 control 中的 Package(軟件包標識)和版本信息,并搜索數據庫,若已存在,則卸載之后再安裝;
檢查 Depends, Pre-Depends, Conflicts 和 Replaces,如果檢測到已存在 Conflicts 中存在的軟件,則報錯并終止安裝。如未找到 Pre-Depends 指定的軟件,則報錯并終止安裝。如找到 Replaces 中指定的軟件,則卸載之;
將數據寫入 /var/lib/dpkg/status 文件中;
執行 preinst 腳本(如果有);
解包 data.tar.gz,將文件放置于相應位置,并將文件列表寫入 /var/lib/dpkg/info/XXX.list;
運行 postinst 和 extrainst_ 腳本(如果有);
如果之前的安裝都沒有出錯,即安裝成功,那么會在 status 文件中寫入 Status: install ok installed 信息,否則會寫入其它狀態數據,比如 Unpacked (未解包數據)、Failed-config(腳本未能成功執行)、Half-installed(安裝失敗等);
重新加載數據庫并解除鎖定。
deb 的卸載過程如下:
讀取數據庫并鎖定;
根據軟件標識搜尋數據庫;
檢查是否有軟件依賴于待卸載的軟件,如果有則提示,并中斷卸載;
執行 prerm 腳本(如果有);
讀取 /var/lib/dpkg/info/XXX.list 文件,并刪除 list 文件中記錄的全部文件和非空文件夾;
運行 postrm 腳本;
如果卸載命令是 dpkg -r,則保留 status 中的記錄并改為 Status: Not installed;如果卸載命令是 dpkg -P,則刪除全部數據;
如果卸載過程沒有錯誤的話,重新讀取數據庫并解除鎖定。
由于 deb 安裝的軟件可能會在運行時在 /var/mobile/Documents 下放置存檔文件,或在 /var/mobile/Library/Preferences 下放置設置文件,而這些文件并沒有記錄在 list 文件里,所以卸載的時候不會被刪除。
ipa的特點
豐富的資源:App Store 上那么多資源,apptrackr 等網站也提供了很多破解版。
完善的更新、后期服務。
只能使用最小權限,保障安全性。
不涉及系統級的操作,所以一般不容易造成死機或白蘋果(有些是因為資源消耗太大所以卡死)。
便捷的安裝方式,無論是直接在設備上用App Store安裝,還是用 iTunes 來同步,抑或是用 Installous 和 91 這類第三方軟件來安裝,都是很方便快速的安裝方式。
超級簡單的卸載方式:還有什么比只需要點一個 X 就能卸載更簡單呢?
完全刪除,不會留下任何垃圾文件(如存檔、設置文件等)
總體來說破解還是比較容易的,但現在越來越多軟件加入了防破解措施。
之前提到過,ipa 軟件是被安裝在一個類似于沙盒的環境中,除了能對 /var/mobile/Media/DCIM 目錄(拍照、截圖存放目錄)進行操作,或是調用壁紙、鈴聲、相機等組件,不能對系統進行任何干涉,這樣在最大程度上保證了系統的穩定運行,也不會干擾其它軟件的正常使用。但問題是,由于 ipa 軟件的權限很低,想要對系統進行修改,尤其是應用補丁時,ipa 就無能為力了。
ipa 軟件官方的安裝方式有兩種,一是在 App Store 這個軟件中下載安裝,二是用 iTunes 同步。
前者的問題主要是網絡問題,網速不好很容易安裝失敗;GPRS之類的上網安裝又很耗流量。后者的問題主要是不能在不同系統下使用(包含不同電腦和同一部電腦上的不同系統),在其它系統上同步會抹掉原有的軟件。當然了,iTunes 每次同步時間比較長也是經常被人詬病的。尤其是當安裝軟件比較多的時候,每次同步之前的備份需要很長很長時間,這個很惡心(不過可以直接 X 掉備份操作)。
由于以上兩種方式存在一些問題,所以很多人會選擇使用 Installous 或其他手機助手來安裝 ipa,這也確實是個不錯的選擇。
Installous 一般沒什么問題,但對部分驗證比較嚴格的 ipa 處理不是很好。雖然 Installous 基本能代替 iTunes,但畢竟不完全等同。最典型的就是 Installous 安裝 Microsoft 官方出的 Live Messenger (正版,非破解版)時不能運行。實際上 Installous 對很多未破解的正版軟件支持不是很好。
至于91,經常被人批評。91 雖然可以安裝 ipa,但除了 Installous 都有的正版軟件的支持問題外,由于91的安裝機制有缺陷,軟件不能實現多語言,只會使用英文界面,而忽略掉 zh_CN.lproj,zh_TW.lproj 這些語言包。這對那些用希望使用漢化版的人來說實在是一個悲劇。所以通常是要避免使用91來安裝 ipa 的。
至于ipa文件的卸載,三種方法:
設備上按住圖標直到開始晃動,點擊圖標左上角的 X 即可卸載;
于 iTunes 中取消選中,然后同步
找到 /var/mobile/Applications 下的相應目錄,強行刪除整個文件夾。這個在前面兩種方法無法使用是可以采用(有時候卸載體積太大的軟件,比如超過 1G,因為刪除過程太長導致失去響應并刪除失敗。),但這種方法會造成系統的不穩定。除非是確實碰到了問題,否則強烈建議不要使用。
pxl的特點
嚴格來說,pxl 格式的資源并不算多,但也不少。現在使用 pxl 格式的絕大多數都是91的用戶。
從時效性上來說,很多軟件(主要是 App Store 上的)一被人破解就馬上會被人轉成 pxl 格式,這樣來說,pxl 格式的更新還是不錯的。
由于91手機助手沒有 iTunes 同步會抹掉軟件的問題,加上其它一些比較方便的功能,使得很多新手都是從91開始了解并熟悉 iPhone/iPod Touch 的使用。其結果是,pxl 格式依賴于91而生存。
pxl 格式的流行也不是歷史的遺物,而是符合市場規律的需求。91助手的便捷的軟件管理方式(尤其是支持 WiFi 管理),加上免費的旗號,使得 pxl 格式在新手中很受歡迎。
實際上,pxl 格式和 deb 格式具有的功能完全一樣。雖然 pxl 不能記錄文件的權限等數據,但完全可以用腳本來彌補。即是說,pxl 格式和 deb 格式其實是不相伯仲的。而且因為 pxl 格式的制作并不需要比較少見的 Unix 環境,尤其是 Debian 環境,其本身是優于 deb 格式的。
但為什么現在很多人都經常在說不要使用 pxl 呢?我個人認為,原因主要有以下幾個:
資源的局限性:除了91公司自己開發的幾個軟件之外,其余所有軟件都是從 deb 和 ipa 轉換而來。如果原版軟件沒破解,pxl 無能為力(比如 Microsoft 官方出的 Live Messenger 和 Cydia 上一眾沒被破解的軟件);
資源時效性:跟上面一點相似,pxl 格式大部分是從其它格式轉換而來,跟原版相比總是會慢一些,尤其是當無法破解時,pxl 根本就出不來;
打包人水平有限:現在很多人都是直接用91助手來打包 pxl。對大部分只有一個 XXX.app 目錄的程序來說一般不會有問題,但若遇見那些對文件權限等數據有嚴格要求的軟件(比如可執行文件沒有可執行權限,或是 mobile 用戶不能改寫 root 所有的文件等等),或是需要比較復雜的腳本才能運行的軟件,往往 pxl 制作者并沒有能力去制作一個完善的 pxl 出來,這樣也導致了許多安裝使用上的問題;
安全性:絕大部分人在制作 pxl 的時候都習慣用 chmod -R 命令來將整個 XXX.app 目錄及其中的全部文件和子目錄設為755/775/777權限,而這種行為會造成一定的安全隱患。關于這些數字的意思請自行搜索相關資料。這里簡單說明一下。644屬性表示僅有該文件的所有人才可以進行改寫操作,其余任何人都只能讀取,任何人都不能執行這個文件。755和775是在644的基礎上加入了可執行權限,755是該文件所在的用戶組的所有人都可以改寫。而777權限則標識任何人都可以改寫并執行。由于 mobile 本身是受限賬戶,如果使用777權限的話,有機會通過這個漏洞來獲取整個系統的控制權。只不過因為 iPhone 系統相對封閉,也不太有機會造成損失。但采用775和777權限是不應該的;
ipa 轉 pxl 的存檔問題:不少人都有這樣的經歷,在游戲 A 存檔之后再進游戲 B,存檔 B 之后再進 A,發現 A 的存檔已經不在了。原因在于,ipa 轉換成的 pxl 軟件,存檔全部是放在 /var/mobile/Documents 目錄下,而正好有兩個軟件的存檔文件名相同(最常見的就是 data.sav 或 save.data),互相改寫之后導致不能讀取。這種問題也發生在 ipa 轉 deb 上,而且無法解決;
無法完整刪除:卸載 pxl 格式時,不會刪除存檔文件、配置文件、臨時文件等數據,長期使用會導致可用空間減少;
在部分機型上存在兼容問題:有些機器越獄后并沒有將系統分區中的 /Applications 目錄轉移到 /var/stash 的用戶分區中。由于系統分區的可用空間很少(默認500MB,通常可用空間不超過50MB),強行往 /Applications 里安裝會導致剩余空間消耗殆盡或安裝失敗。
由此可以看出,pxl 格式的問題更多不是 pxl 本身的問題,而是打包者的問題以及安裝方式的缺陷所致。
另外要指出的是,pxl 最大的提供者91,經常是轉載他人發布的軟件(包括 網友自己購買破解的,或 Cydia 上直接下載的)然后當作自己發布的軟件,對版權問題完全不在意,這樣也引起了很多人,尤其是原發布者的反感。這種赤裸裸的剽竊行為實在是令人不恥。正因為這樣,很多人是因為不爽91而不爽 pxl,這實在是冤枉 pxl 格式本身了。
安裝和卸載:
91手機助手
91百寶箱
pxl 格式曾經是1.x時代唯一的安裝包格式,給我們留下了太多的回憶,對于 pxl 的貢獻,我們還是應該緬懷和尊敬的。但隨著時代的發展,pxl 已經老態盡顯,就如同 Installer 的退出一樣,pxl 最終會退出市場而被供奉在殿堂之內。
總結
一般的軟件還是盡量用 ipa 格式,不要使用 ipa 轉換成的 deb 或 pxl 格式,這樣可以確保兼容性和安全性。而在系統級的程序(如 SBSettings 和輸入法),ipa 是絕無能力的,那么最好的選擇還是 deb。pxl 作為快被淘汰的格式,還是果斷的放棄比較好。至于 ipa 和 deb 的安裝方式,ipa 的安裝首選 iTunes 同步和 App Store 在線安裝,次選 Installous或其他PC助手,以保證最佳兼容性。deb 的安裝首選 Cydia 在線安裝,次選除91外的其它任何安裝方式。