從 xcarchive 到分發的 ipa

寫這篇文章的原由是要更新 app ,然而上傳 ipa 文件到 iTunes Connect 時發現體積巨大,是 App Store 顯示的體積的好幾倍,因而仔細研究了一下,各類體積的文件都是些什麼。javascript

各格式簡要說明

.xcarchivehtml

- Xcode Archive
- 由 Xcode 進行 Archive 操做產生的結果,出如今 Xcode Organizer 中
- 主要包含 .dSYM .app .dylib(針對 Swift)
- 用於生成 .ipa 文件複製代碼

.ipa(Xcode 產出)java

- iPhone Application Archive
- 主要包含 .app .dylib(針對 Swift)
- 最終從本地 upload 到 iTunes Connect 的文件複製代碼

.ipa(iTunes 下載)xcode

- iPhone Application Archive
- 主要包含 .app iTunesMetadata iTunesArtwork
- iTunes 用於管理應用軟件安裝包的形式複製代碼

.app服務器

- Applicaiton
- 主要包含圖片、語言文件等資源,以及動態庫和 Unix 可執行文件
- 安裝到 iOS 設備的文件的格式複製代碼

從 xcarchive 到 ipa

在進行 Archive 操做以前,咱們就能夠在 Xcode 導航欄的 Products 目錄中看到 .app 文件,extension target 對應的是 .appex 文件,因此歸檔出 .xcarchive 並非一個很是複雜的操做,只須要編譯、連接、簡單的簽名,若是是 Swift 項目的話還須要拷貝一下標準庫。架構

咱們查看 .xcarchive 裏面的內容是經過「顯示包內容」看見的,而 .ipa 則須要像 .zip 文件同樣解壓,那麼也能夠理解爲何打包出 ipa 文件相對耗時了,尤爲是 Swift 項目,不光要進行壓縮操做,要 processing,一堆原生動態庫加上第三方 framework 還要輪着等着簽名。
app


這些保證了 ipa 文件不能被模擬器裝上(沒有 x86 架構),只能被 iOS 設備安裝,你買的應用程序發給別人,別人並不能直接裝上。從兔兔助手等平臺安裝的盜版軟件必定是被從新簽名過的。
(因爲 ipa 文件上傳到 iTunes Connect 以後,還會被從新處理,因此我的尚且不知道後續的處理過程還進行過怎樣的簽名工做)

因此 ipa 文件才能夠做爲加密文件放在軟件商店,xcarchive 不能夠。ide

從 Xcode 產出的 ipa 到用戶下載的 ipa


如圖是我開發的一款軟件打包過程的各個狀態,能夠看到壓縮狀態的 ipa 文件是體積最小的。若是將 ipa 文件解壓成文件夾,它的體積會和 xcarchive 文件很接近,由於它內部包含了比它自己還要大的整個 .app 包。

而後我分別經過 AppStore 和 TestFlight 安裝了我上傳的軟件,結果都只佔用了大約 15M 的空間。
前面提到,下載到設備的是 ipa,安裝到設備的是 app。但看圖,會發現 TestFlight 頁面展現的體積和另外三張圖相去甚遠,30M+。仔細分析下:

  1. iPhone 5S 推出以後,iOS 設備指令集從 armv六、armv七、armv7s 一路幹到了 arm64,這麼些個不一樣的設備安裝到本地的文件確定不同吧
  2. 同一設備不一樣系統,安裝的文件也不同吧
  3. Xcode 一次只產出一個 ipa,可是考慮到這款軟件支持的系統版本數量和設備種類數量,可能最終幾十種不一樣的 iOS 環境(自造詞,系統版本或設備型號不一樣都算環境不一樣),從同一個 AppStore 頁面,下載了幾十個不一樣的 ipa 文件
  4. 嘗試發佈過 app 的開發者都知道,上傳 ipa 文件完成以後,還要等待一段時間,才能在 iTunes Connect 頁面看見一個「構建版本」。雖然不知道這個「構建版本」在 Apple 的服務器裏面具體都有哪些東西,但至少應該包含一大堆的 ipa 文件,分別指定了對應什麼系統版本、什麼設備型號
  5. 在這個過程當中 ipa 文件的體積發生了很大變化,App Thining 也發生在這個過程當中。

至此能夠看出,AppStore 頁面顯示的體積應該是預估的應用安裝到設備的體積,而不是你下載這款軟件所耗費的流量。這也解釋了我以前嘗試用剩 1G 存儲的 iPad 去裝一個 AppStore 顯示 大小不到 1G 的遊戲,爲何會裝不上,由於下載到 iPad 的文件實際可能大於 1G。ui

TestFlight 裏面顯示的 30M+,確定是通過 iTunes Connect 處理過的 ipa,但考慮到 .ipa 文件並不會比安裝到設備的 .app 包體積更小,我的認爲這是解壓事後的 ipa 文件的體積。加密

個人 app 是如何一步一步變小的

未處理的 .app - 85.6 M
(加入動態庫、.dSYM 等)
xcarchive - 167.7 M
未處理的 ipa 文件夾 - 172 M
(通過相似 zip 壓縮)
未處理的 .ipa - 70.8 M(開發者感覺到的體積)
(我的推測)處理後的 ipa 文件夾- 約 30M(用戶下載須要耗費的流量)
處理後的 .app - 約 15M(最終佔用用戶設備體積)

備註

App Thining 包含 Slicing、Bitcode 和 On-Demand Resources,其中 Slicing 是默認啓用、沒法關閉的,但只在 iOS 9.0.2 以後有效,後面兩個選項在 Xcode 中默認開啓,能夠手動關閉。

這是 Xcode 產物體積與用戶下載到設備中的軟件體積差距較大的主要緣由。

推薦閱讀:初探 iOS 9 的 App 瘦身功能

相關文章
相關標籤/搜索