隨着屢次改版和時間的積累,工程愈來愈大,而這次接入某行SDK後,工程劇增幾十M,讓我意識到是時候給 app 瘦身了!
通過兩天的實踐,ipa 從70+M
縮減到了50+M
!前端
🔨工具 LSUnusedResourcesgit
⚠️注意1:對於使用 imageName_%d 這種方式使用的圖片,爲了防止誤刪,建議勾上github
使用時我對比了下勾選和不勾選 Ignore similar name 時的搜索結果,對可能會誤刪的圖片進行逐個肯定,意外的防止了一次誤刪!
圖片的名稱是這樣的,符合 tag_%d 格式:後端
然鵝,圖片的引用方式是這樣的:
[self.bg_Ima setImage:[UIImage imageNamed:type]];
type動態獲取。
誤打誤撞防止了一次誤刪,哈哈。緩存
🔨 工具:fdupesbash
⏳使用 HomeBrew
下載:brew install fdupes
服務器
⚙ 開始使用:fdupes -r .../Assets.xcassets
架構
⚠️注意:防止 AppIcon 誤刪app
一個用於
40 3x
一個用於60 2x
結果同樣,用的是同一張圖,這種狀況不該該刪框架
🔨工具:ImageOptim
⚙開始使用: 直接把 工程文件夾 或 Assets.xcassets
文件夾拖進去,工具會自動提取圖片,進行無損壓縮,最後覆蓋原圖片。
🥇結果: 🎉恭喜你節省了 20.86%
的空間,超越了 80%
的玩家~
-imageWithContentsOfFile:
加載Assets.xcassets
管理,適合較小且頻繁使用的圖片。它會把裏邊的全部 png 格式的圖片壓縮成一個Assets.car
文件,壓縮比率比其餘方式管理圖片要高,大大減小圖片體積。二進制包是由各類代碼文件、靜態庫和動態庫通過編譯後生成的可執行文件。
🔨工具:LinkMap
⚙開始使用: Xcode -> project -> Build Settings -> Link Map
編譯運行後,使用工具分析 Link Map File:
結果一目瞭然,根據類、庫等的大小排序,能夠進行鍼對性優化。
arm64:iPhone6s | iphone6s plus|iPhone6| iPhone6 plus|iPhone5S | iPad Air| iPad mini2(iPad mini with Retina Display)
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
模擬器32位處理器測試須要i386架構,i386是針對intel通用微處理器32位處理器
模擬器64位處理器測試須要x86_64架構,x86_64是針對x86架構的64位處理器
真機32位處理器須要armv7,或者armv7s架構,
真機64位處理器須要arm64架構
armv7
能夠兼容armv7s
,打包時Xcode
是不會將模擬器框架打進去的,因此只須要去掉armv7s
便可既達到瘦身效果,又不影響開發和生產。
lipo
能夠用來移除fat binary
中不被支持的或者多餘的可執行代碼,達到瘦身目的。
lipo
不會改變程序執行邏輯,僅僅只是文件的大小瘦身。
lipo MESDK -thin armv7 -output MESDK-armv7
lipo MESDK -thin arm64 -output MESDK-arm64
lipo -create MESDK-armv7 MESDK-arm64 -output MESDK-device
複製代碼
iOS9 發佈了 iOS Thinning,具體介紹了編譯器的三項 app 瘦身技術:App 切割(App Slicing)、位源碼(Bitcode)和按需加載資源(On Demand Resources)
Assets.xcassets
管理圖片資源iOS9
之後,確切是 iOS9.0.2
之後。(這個版本修復了 App Thinning 失效的 bug)itunes
根據用戶設備類型和屏幕分辨率的不一樣分發定製的下載包,開發者只須要把完整應用包的內容上傳到 iTunes Connect
便可(編譯器自動完成中間的處理)。Bitcode 是程序編譯過程當中的中間碼,介於 LLVM 編譯器的前端語言和後端語言(彙編或機器語言)之間。 打包時 Xcode 會將程序編譯成 Bitcode 中間碼;用戶下載時 App store 會再根據具體設備和芯片平臺優化二進制文件、減少安裝包大小,將 Bitcode 編譯成相應的彙編指令以及翻譯爲機器碼,最終成爲可執行的64位或32位程序。
Bitcode 的存在,使蘋果能夠在 LLVM 架構的上面發明新的前端語言,以及在 LLVM 架構的下面支持新的 CPU (後端)指令輸出 -> 新的前端語言寫出來的程序能夠兼容舊的設備;已經上架的 App 能夠在搭載新的 CPU 的設備運行,而避免了發佈新版本的麻煩。
不一樣設備對 Bitcode 的使用:iOS 可選的,watchOS 必須的,Mac OS 不支持的。 注意:若是咱們的工程須要支持 Bitcode,則全部引入的第三方庫都要支持 Bitcode。
功能:支持在 App 首次安裝後再下載其餘資源。
如何開啓: Xcode -> project -> Build Settings -> Enable On Demand Resources -> Yes
應用:遊戲開發中,某些遊戲關卡的資源能夠在玩家付費後再下載;在玩家經過低級關卡並再也不去玩時,能夠將對應的資源刪除以便節省空間。
因爲 obc 的動態特性,即便是那些沒有 import 使用的類,都會在 build 後被編譯進可執行文件(build 後觀察 linkmap 能看到相關文件信息);
對於第三方庫的依賴和濫用,會致使不少第三發庫利用率低或者隨着需求的改變壓根就沒用到,刪除這些不用的庫;
所以刪除這些無用的類和庫也是縮小項目大小的有效途徑之一。
71.4 -> 54.7