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個組件:

  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 種

  1. Cydia 或同類 APT 管理軟件在線安裝,這個是最佳的安裝方式,因爲通常無需考慮依賴關係,但缺點是對網絡的要求比較高;
  2. 命令行中以 dpkg -i XXX.deb 的形式安裝,好處是可以以通配符一次性安裝多個 deb,而且也可以直接看到腳本的運行狀況和安裝成功/失敗的提示信息,缺點是需要命令行軟件的支持,如 Putty/WinSCP的控制檯/iSSH/MobileTerminal,很多人也不熟悉命令行下的操作。另外,安裝完後會不顯示圖標;
  3. 放置於 AutoInstall 目錄重啓安裝。該方法實際是 Cydia 提供的一個啓動腳本,在每次系統啓動時以 dpkg 命令安裝 AutoInstall 目錄下的 deb,好處是不需要命令行操作,缺點是必須要重啓,有些甚至要重啓兩次,也會出現不顯示圖標的情況;
  4. 利用 iFile 安裝,好處是圖形化操作,桌面會顯示圖標,缺點是不能一次安裝多個 deb;
  5. 用 Cyder II 等軟件來安裝,其原理是模擬一個 APT 軟件管理器來下載相應的 deb 文件並傳到設備,然後以前面幾種方式來安裝。


總體來說,deb 的安裝都是依賴於 dpkg -i 命令來安裝,只不過有些是在命令行下輸入命令,有些是提供了圖形界面。但除了 Cydia 安裝一種方式之外,其餘幾種安裝方式都存在一些共有的問題:

  • 不會自行搜索依賴關係,必須手動提供所依賴的 deb;
  • Cydia 會讀取安裝腳本里的一些特殊語句,比如僅在全新安裝時執行而不在升級時執行,安裝完成後重啓 SpringBoard 或設備等等。



當然了,deb 軟件的卸載也比較簡單,有兩種方式:

  • Cydia 裏卸載,優點是卸載過程和提示信息很詳細,全圖形界面操作,同時也提供了重新安裝的選項;
  • 以 dpkg -r Package_ID 命令或 dpkg -P Package_ID 命令來卸載(詳情後面會說);
  • Cydelete 來卸載,優點是可以直接在桌面上卸載有圖標的軟件,但對那些沒有圖標的無能爲力。



其實,不管是安裝還是刪除,都可以纔要全手動的方法。即,解包 deb 之後,自己將文件放到相應位置,然後設置權限等並執行腳本。但這樣有必要麼?


deb 的安裝過程如下:

  1. 讀取數據庫並鎖定,避免同時有兩個安裝程序在運行
  2. 讀取 control 中的 Package(軟件包標識)和版本信息,並搜索數據庫,若已存在,則卸載之後再安裝;
  3. 檢查 Depends, Pre-Depends, Conflicts 和 Replaces,如果檢測到已存在 Conflicts 中存在的軟件,則報錯並終止安裝。如未找到 Pre-Depends 指定的軟件,則報錯並終止安裝。如找到 Replaces 中指定的軟件,則卸載之;
  4. 將數據寫入 /var/lib/dpkg/status 文件中;
  5. 執行 preinst 腳本(如果有);
  6. 解包 data.tar.gz,將文件放置於相應位置,並將文件列表寫入 /var/lib/dpkg/info/XXX.list;
  7. 運行 postinst 和 extrainst_ 腳本(如果有);
  8. 如果之前的安裝都沒有出錯,即安裝成功,那麼會在 status 文件中寫入 Status: install ok installed 信息,否則會寫入其它狀態數據,比如 Unpacked (未解包數據)、Failed-config(腳本未能成功執行)、Half-installed(安裝失敗等);
  9. 重新加載數據庫並解除鎖定。



deb 的卸載過程如下:

  1. 讀取數據庫並鎖定;
  2. 根據軟件標識搜尋數據庫;
  3. 檢查是否有軟件依賴於待卸載的軟件,如果有則提示,並中斷卸載;
  4. 執行 prerm 腳本(如果有);
  5. 讀取 /var/lib/dpkg/info/XXX.list 文件,並刪除 list 文件中記錄的全部文件和非空文件夾;
  6. 運行 postrm 腳本;
  7. 如果卸載命令是 dpkg -r,則保留 status 中的記錄並改爲 Status: Not installed;如果卸載命令是 dpkg -P,則刪除全部數據;
  8. 如果卸載過程沒有錯誤的話,重新讀取數據庫並解除鎖定。



由於 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 格式本身了。

總結:

一般的軟件還是儘量用 ipa 格式,不要使用 ipa 轉換成的 deb 或 pxl 格式,這樣可以確保兼容性和安全性。而在系統級的程序(如 SBSettings 和輸入法),ipa 是絕無能力的,那麼最好的選擇還是 deb。pxl 作爲快被淘汰的格式,還是果斷的放棄比較好。

至於 ipa 和 deb 的安裝方式,ipa 的安裝首選 iTunes 同步和 App Store 在線安裝,次選 Installous,以保證最佳兼容性。deb 的安裝首選 Cydia 在線安裝,次選除91外的其它任何安裝方式。

任何情況下都不推薦用91來安裝 ipa 和 deb,因爲91的安裝機制並不完善,很容易出問題。
 

本文是原樣轉過來的,甚至字體以及顏色都沒有更改。主要是爲了方便機友查閱,也好進行更進一步的操作。感謝威鋒網,感謝作者autopear。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章