iOS開發--iOS安裝包的三種格式 deb、ipa 和 pxl的解釋和說明

目前 iOS 平臺上常見的安裝包有三種,deb、ipa 和 pxl。
轉自連接:http://fanlb.blogbus.com/logs/80466716.html  多謝做者分享!
其中 deb 格式是 Debian 系統(包含 Debian 和 Ubuntu )專屬安裝包格式,配合 APT 軟件管理系統,成爲了當前在 Linux 下很是流行的一種安裝包。進入 2.x 時代以後有 Cydia 做者 Jay Freeman(saurik) 移植到 iPhone 平臺上,一塊兒的還有 APT 軟件管理系統。html

  • 而 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 相似。

關於 deb 的詳細介紹和打包說明,請見此貼1樓: http://bbs.weiphone.com/read-htm-tid-669283.html
  
.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 命令執行。app

安裝包的特色iphone

 


 

.debide

  • 豐富的資源: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 種post

  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 格式自己了。

安裝和卸載

  • 91手機助手
  • 91百寶箱

 


 


pxl 格式曾經是1.x時代惟一的安裝包格式,給咱們留下了太多的回憶,對於 pxl 的貢獻,咱們仍是應該緬懷和尊敬的。但隨着時代的發展,pxl 已經老態盡顯,就如同 Installer 的退出同樣,pxl 最終會退出市場而被供奉在殿堂以內。

 

總結

    • 通常的軟件仍是儘可能用 ipa 格式,不要使用 ipa 轉換成的 deb 或 pxl 格式,這樣能夠確保兼容性和安全性。而在系統級的程序(如 SBSettings 和輸入法),ipa 是絕無能力的,那麼最好的選擇仍是 deb。pxl 做爲快被淘汰的格式,仍是果斷的放棄比較好。
    • 至於 ipa 和 deb 的安裝方式,ipa 的安裝首選 iTunes 同步和 App Store 在線安裝,次選 Installous,以保證最佳兼容性。deb 的安裝首選 Cydia 在線安裝,次選除91外的其它任何安裝方式。
    • 任何狀況下都不推薦用91來安裝 ipa 和 deb,由於91的安裝機制並不完善,很容易出問題。
相關文章
相關標籤/搜索