App 瘦身 項目實踐

隨着屢次改版和時間的積累,工程愈來愈大,而這次接入某行SDK後,工程劇增幾十M,讓我意識到是時候給 app 瘦身了!
通過兩天的實踐,ipa 從 70+M 縮減到了 50+M前端

1、🚮 資源瘦身

1. 🗑刪除未使用的資源

  • 🔨工具 LSUnusedResourcesgit

  • ⚠️注意1:對於使用 imageName_%d 這種方式使用的圖片,爲了防止誤刪,建議勾上github

忽略類似名稱

使用時我對比了下勾選和不勾選 Ignore similar name 時的搜索結果,對可能會誤刪的圖片進行逐個肯定,意外的防止了一次誤刪!
圖片的名稱是這樣的,符合 tag_%d 格式:後端

tag_%d 格式舉例

然鵝,圖片的引用方式是這樣的: [self.bg_Ima setImage:[UIImage imageNamed:type]]; type動態獲取。
誤打誤撞防止了一次誤刪,哈哈。緩存


  • ⚠️注意2:不要誤刪某些SDK裏的資源文件,咱們的項目中可能未使用過,但誰知道他們呢! 以下圖,還很多咧,差點就誤刪了!

SDK內的資源文件

  • 👨‍💻‍搜索結果: 因爲產品經理常常換,致使積壓了不少不適用的圖片。。。正好此次一鍋端了吧!

刪除未使用的資源結果

  • 🥇結果:工程文件夾小了12.4M

🗑 2.刪除重複的資源

  • 🔨 工具:fdupesbash

  • ⏳使用 HomeBrew 下載:brew install fdupes服務器

  • ⚙ 開始使用:fdupes -r .../Assets.xcassets架構

  • ⚠️注意:防止 AppIcon 誤刪app

一個用於 40 3x 一個用於 60 2x 結果同樣,用的是同一張圖,這種狀況不該該刪框架

AppIcon 防止誤刪

  • 🥉結果:在這個項目中效果不顯著,只刪除了一張圖片。 因爲第一步已經刪除挺多文件相同、但名字不一樣、而又不用的圖片,在這一步中只刪除了一張文件不一樣、名字相同的圖片。

3. 🏞圖片無損壓縮

  • 🔨工具:ImageOptim

  • ⚙開始使用: 直接把 工程文件夾 或 Assets.xcassets 文件夾拖進去,工具會自動提取圖片,進行無損壓縮,最後覆蓋原圖片。

  • 🥇結果: 🎉恭喜你節省了 20.86% 的空間,超越了 80% 的玩家~

圖片無損壓縮結果

4. 📦圖片管理方式

  • 在項目中添加文件夾存放,適合比較大,但不常使用的圖片,經過-imageWithContentsOfFile:加載
  • 使用 Assets.xcassets 管理,適合較小且頻繁使用的圖片。它會把裏邊的全部 png 格式的圖片壓縮成一個Assets.car文件,壓縮比率比其餘方式管理圖片要高,大大減小圖片體積。

5. 📌其餘

  • 音視頻壓縮
  • 非必要資源從服務器下載再緩存

二. 🔨利用 linkmap 篩選須要優化的二進制包(可執行文件)

二進制包是由各類代碼文件、靜態庫和動態庫通過編譯後生成的可執行文件。

  • 🔨工具:LinkMap

  • ⚙開始使用: Xcode -> project -> Build Settings -> Link Map

Link Map File Setting

編譯運行後,使用工具分析 Link Map File:

Link Map File 分析結果

結果一目瞭然,根據類、庫等的大小排序,能夠進行鍼對性優化。

3、💼第三方靜態庫瘦身

1.👨‍💻‍基礎知識瞭解

  • 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 便可既達到瘦身效果,又不影響開發和生產。

2. 🔨瘦身的工具:lipo

lipo 能夠用來移除 fat binary 中不被支持的或者多餘的可執行代碼,達到瘦身目的。
lipo 不會改變程序執行邏輯,僅僅只是文件的大小瘦身。

3. ⚙開始使用

  • 無需優化的靜態庫:

無需優化的靜態庫信息

  • 須要優化的靜態庫:

須要優化的靜態庫信息

  • 去掉 armv7s 的指令:
lipo MESDK -thin armv7 -output MESDK-armv7
lipo MESDK -thin arm64 -output MESDK-arm64
lipo -create MESDK-armv7 MESDK-arm64 -output MESDK-device
複製代碼
  • 🥇結果:

第三方靜態庫瘦身結果

四. 📰iOS Thinning

iOS9 發佈了 iOS Thinning,具體介紹了編譯器的三項 app 瘦身技術:App 切割(App Slicing)、位源碼(Bitcode)和按需加載資源(On Demand Resources)

1. 🔪App Slicing 切割

  • 使用 Assets.xcassets 管理圖片資源
  • 適用於 iOS9 之後,確切是 iOS9.0.2 之後。(這個版本修復了 App Thinning 失效的 bug)
  • itunes 根據用戶設備類型和屏幕分辨率的不一樣分發定製的下載包,開發者只須要把完整應用包的內容上傳到 iTunes Connect 便可(編譯器自動完成中間的處理)。

二、🔩 Bitcode 位源碼

  • ⚙使用 Bitcode: Xcode -> project -> Build Settings -> Enable Bitcode -> Yes

Bitcode 是程序編譯過程當中的中間碼,介於 LLVM 編譯器的前端語言和後端語言(彙編或機器語言)之間。 打包時 Xcode 會將程序編譯成 Bitcode 中間碼;用戶下載時 App store 會再根據具體設備和芯片平臺優化二進制文件、減少安裝包大小,將 Bitcode 編譯成相應的彙編指令以及翻譯爲機器碼,最終成爲可執行的64位或32位程序。

Bitcode 的存在,使蘋果能夠在 LLVM 架構的上面發明新的前端語言,以及在 LLVM 架構的下面支持新的 CPU (後端)指令輸出 -> 新的前端語言寫出來的程序能夠兼容舊的設備;已經上架的 App 能夠在搭載新的 CPU 的設備運行,而避免了發佈新版本的麻煩。

不一樣設備對 Bitcode 的使用:iOS 可選的,watchOS 必須的,Mac OS 不支持的。 注意:若是咱們的工程須要支持 Bitcode,則全部引入的第三方庫都要支持 Bitcode。

三、 🔨按需加載資源 On Demand Resources

功能:支持在 App 首次安裝後再下載其餘資源。

如何開啓: Xcode -> project -> Build Settings -> Enable On Demand Resources -> Yes

應用:遊戲開發中,某些遊戲關卡的資源能夠在玩家付費後再下載;在玩家經過低級關卡並再也不去玩時,能夠將對應的資源刪除以便節省空間。

5、🗑 刪除無用代碼和第三方庫

因爲 obc 的動態特性,即便是那些沒有 import 使用的類,都會在 build 後被編譯進可執行文件(build 後觀察 linkmap 能看到相關文件信息);

對於第三方庫的依賴和濫用,會致使不少第三發庫利用率低或者隨着需求的改變壓根就沒用到,刪除這些不用的庫;

所以刪除這些無用的類和庫也是縮小項目大小的有效途徑之一。

6、⚙ 編譯選項設置

  • 見思惟導圖總結

最終瘦身結果:71.4 -> 54.7

瘦身結果

總結:

思惟導圖總結
相關文章
相關標籤/搜索