文章目錄
目前 iOS 平台上常見的安裝包有三種:deb、ipa 和 pxl。
deb格式
deb 是 Unix 系 統(其實主要是 Linux )下的安裝包,基於 tar 包,因此本身會記錄檔案的許可權(讀/寫/可執行)以及所有者/使用者組。由於 Unix 類系統 對許可權、所有者、組的嚴格要求,而 deb 格式安裝包又經常會涉及到系統比較底層的操作,所以許可權等的設定尤其重要。
deb 包本身有三部分組成:
(1)資料包,包含實際安裝的程式資料,檔案名稱為 data.tar.XXX;
(2)安裝資訊及控制指令碼包,包含 deb 的安裝說明,標識,指令碼等,檔案名稱為 control.tar.gz;
(3)最後一個是 deb 檔案的一些位元據,包括檔案頭等資訊,一般看不到,在某些軟體中開啟可以看到。
deb 本身可以使用不同的壓縮方式。tar 格式並不是一種壓縮格式,而是直接把分散的檔案和目錄集合在一起,並記錄其許可權等資料資訊。之前提到過 的 data.tar.XXX,這裡 XXX 就是經過壓縮後的尾碼名。deb 預設使用的壓縮格式為 gzip 格式,所以最常見的就 是 data.tar.gz。常有的壓縮格式還有 bzip2 和 lzma,其中 lzma 壓縮率最高,但壓縮需要的 CPU 資源和時間都比較長。
data.tar.gz包含的是實際安裝的程式資料,而在安裝過程中,該包裡的資料會被直接解壓到根目錄(即 / ),因此在打包之前需要根據檔案所在位置設定好相應的檔案/分類樹。
而 control.tar.gz 則包含了一個 deb 安裝的時候所需要的控制資訊。一般有 5 個檔案:
1. control,用了記錄軟體標識,版本號碼,平台,依賴資訊等資料;
2. preinst,在解包 data.tar.gz 前啟動並執行指令碼;
3. postinst,在解包資料後啟動並執行指令碼;
4. prerm,卸載時,在刪除檔案之前啟動並執行指令碼;
5. postrm,在刪除檔案之後啟動並執行指令碼;
在 Cydia 系統中,Cydia 的作者 Saurik 另外添加了一個指令碼,extrainst_,作用與 postinst 類似。
其中 deb 格式是 Debian 系統(包含 Debian 和 Ubuntu )專屬安裝包格式,配合 APT 軟體管理系統,成為了當前 在 Linux 下非常流行的一種安裝包。進入 2.x 時代之後有 Cydia 作者 Jay Freeman(saurik) 移植 到 iPhone 平台上,一起的還有 APT 軟體管理系統。
ipa格式
ipa 格式則是蘋果在 iOS 平台上推出的專屬軟體安裝包,在2.0韌體開始才正式使用,是目前 iPhone/iPod Touch/iPad 平台上唯一的官方安裝包。
使用過 Mac OS 的人可能都知道,Mac 下的軟體大部分都只有一個 .app 目錄,裡麵包含了程式全部資源和可執行檔。簡單來說,Mac 下的 軟體就像是 Windows 下的綠色軟體一樣,解壓後即可使用,不需要安裝,卸載的話也只用刪除程式檔案即可(這裡不涉及 pkg 格式安裝包)。 而 ipa 格式可以視為這種 .app 軟體的衍生物。
ipa 檔案實質是一個 zip 壓縮包(不是 rar 或 7z 包),包含 3 個組件:
(1)payload 目錄下的 .app 目錄,這個是軟體的主程式;
(2)iTunesArtwork,實質是一個無尾碼名的 png 圖片,用來在 iTunes 中顯示表徵圖;
(3)iTunesMetadata.plist,記錄購買者資訊、售價等資料。
由於 zip 包不能記錄許可權和所有者等資訊,所以蘋果規定了 ipa 的安裝方式,即全部 ipa 都會解包安裝在 /var/mobile /Applications 目錄下,全部檔案和目錄的所有者及使用者組均設為 mobile(ID 為 501),主程式(可執行檔)的許可權設 為 0755 (所有人都可以執行,但只有所有者可以修改),可執行檔在 plist 中定義。全部目錄許可權設為 0755,而其它所有檔案都設 為 0644(僅所有者可以修改,其餘人只允許讀取,全部人都不允許執行)。
ipa 解包後並非直接放置於 Applications 目錄下,而是放在一串由隨機碼構成的目錄下,其作用在於,只允許這個軟體運行在一個特定的沙箱(Sandbox)中,不能干擾其他軟體。因此那串隨機碼目錄下,除了 ipa 本身的三個組件之外,還有三個目錄:
(1)Library,一般是用了儲存設定檔案等資料;
(2)Documents,儲存資料,多用了儲存存檔;
(3)tmp,臨時檔案夾。
由於這個軟體只能在這個特定的目錄下運行(當然了,部分程式會調用系統的通訊錄、相機等組件,但仍然是受限制的),從而保證了整個系統的安全性和穩定性。
由於 Unix 系統下對許可權的規定相當嚴格,所以“越權”的行為是絕對不允許的。舉個例子,mobile 使用者無權刪除 root 所有的檔案,因 為 root 的許可權高於 mobile。所以有些人在修改 ipa 安裝後的檔案時,比如進行漢化或者修改存檔,發現不能刪除乾淨軟體,或不能儲存,這 是因為刪除時不能刪除 root 所有的檔案,程式本身也無法對 root 所有的封存檔案進行寫入操作。
pxl格式
pxl格式則起源於 Mac 系統上的 pkg 安裝包,被廣泛應用於1.x韌體時代,曾經是 iPhone 平台上唯一的軟體安裝包,現在仍在被91等軟體所使用。
pxl格式在1.x時代是 iPhone 平台上唯一的安裝格式,原因是那時候還沒有 Cydia 這樣的 APT 管理軟體,蘋果官方也沒有推 出 App Store。由於在1.x時代積累了大量人氣,在接下來的 App Store 時代中,pxl 格式以其相對簡易的打包和安裝方式,仍然占 據了很大一部分市場。但隨著 Installer 的停止開發,iBrickr 等軟體停止更新,目前唯一還在堅持使用 pxl 格式的就只剩下91一家 了。
pxl 安裝包通常包含3個組件:
(1)PxlPkg.plist 記錄程式檔案的存放位置、所有者、許可權以及軟體標識等資訊;
(2)PkgScript文 件夾,存放安裝和卸載指令碼;
(3)程式檔案。
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個指令碼依照安裝和卸載的先後順序執行,可以提供更多選擇。比如備份還原作業,可以在 preinst 中備份檔案,而在 postrm 中還原檔案
嚴 格的依賴關係:deb 遵循嚴格的依賴關係(於 Depends 和 Pre-Depends 指定),可以確保軟體運行所必需的組件。線上安裝的時候會 自動安裝所依賴的軟體包。卸載時也很重要,比如軟體包 A 依賴於 B,當卸載 B 的時候會提示 A 依賴於 B,卸載掉 B 的話會導致 A 不能 用,這樣可以確保系統的完整性和穩定性。
Conflicts、Replaces、Provides 等索引值的存在可以實現衝突提示或替換其它軟體包。
完全許可權:由於 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 或 91 來安裝 ipa,這也確實是個不錯的選擇。
Installous 一 般沒什麼問題,但對部分驗證比較嚴格的 ipa 處理不是很好。雖然 Installous 基本能代替 iTunes,但畢竟不完全等同。最典型的就 是 Installous 安裝 Microsoft 官方出的 Live Messenger (正版,非破解版)時不能運行。實際 上 Installous 對很多未破解的正版軟體支援不是很好。
至 於91,經常被人批評。91 雖然可以安裝 ipa,但除了 Installous 都有的正版軟體的支援問題外,由於91的安裝機制有缺陷,軟體不能實 現多語言,只會使用英文介面,而忽略掉 zh_CN.lproj,zh_TW.lproj 這些語言套件。這對那些用希望使用漢化版的人來說實在是一個悲 劇。所以通常是要避免使用91來安裝 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 轉 ipa http://bbs.weiphone.com/read-htm-tid-569364.html
pxl 轉 deb http://bbs.weiphone.com/read-htm-tid-692225.html
pxl 格式曾經是1.x時代唯一的安裝包格式,給我們留下了太多的回憶,對於 pxl 的貢獻,我們還是應該緬懷和尊敬的。但隨著時代的發展,pxl 已經老態盡顯,就如同 Installer 的退出一樣,pxl 最終會退出市場而被供奉在殿堂之內。
總 結一般的軟體還是盡量用 ipa 格式,不要使用 ipa 轉換成的 deb 或 pxl 格式,這樣可以確保相容性和安全性。而在系統級的程式 (如 SBSettings 和IME),ipa 是絕無能力的,那麼最好的選擇還是 deb。pxl 作為快被淘汰的格式,還是果斷的放棄比較好。
至於 ipa 和 deb 的安裝方式,ipa 的安裝首選 iTunes 同步和 App Store 線上安裝,次選 Installous,以保證最佳相容性。deb 的安裝首選 Cydia 線上安裝,次選除91外的其它任何安裝方式。
任何情況下都不推薦用91來安裝 ipa 和 deb,因為91的安裝機制並不完善,很容易出問題。