萬盛學電腦網

 萬盛學電腦網 >> 手機應用 >> iPhone >> 蘋果iPhone應用格式deb

蘋果iPhone應用格式deb

   deb 格式是 Debian 系統(包含 Debian 和 Ubuntu )專屬安裝包格式,配合 APT 軟件管理系統,成為了當前在 Linux 下非常流行的一種安裝包。進入 2.x 時代之後有 Cydia 作者 Jay Freeman(saurik) 移植到 iPhone 平台上,一起的還有 APT 軟件管理系統。

  安裝包格式

  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 類似。

  安裝包特點

  豐富的資源: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 稍微復雜一些。

  安裝方法

  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 或設備等等。

  卸載方法

  Cydia 裡卸載,優點是卸載過程和提示信息很詳細,全圖形界面操作,同時也提供了重新安裝的選項;

  以 dpkg -r Package_ID 命令或 dpkg -P Package_ID 命令來卸載;

  Cydelete 來卸載,優點是可以直接在桌面上卸載有圖標的軟件,但對那些沒有圖標的無能為力。

  安裝過程 讀取數據庫並鎖定,避免同時有兩個安裝程序在運行

  讀取 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(安裝失敗等);

  重新加載數據庫並解除鎖定。

  卸載過程 讀取數據庫並鎖定;

  根據軟件標識搜尋數據庫;

  檢查是否有軟件依賴於待卸載的軟件,如果有則提示,並中斷卸載;

  執行 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 文件裡,所以卸載的時候不會被刪除。

copyright © 萬盛學電腦網 all rights reserved