iOS包體積大小優(yōu)化

前言

應(yīng)用的包體積大小會(huì)影響用戶(hù)的點(diǎn)擊下載率、安裝成功率和卸載率,是衡量APP性能的一項(xiàng)重要指標(biāo)。為了更好的用戶(hù)體驗(yàn),減少用戶(hù)下載等待時(shí)長(zhǎng)、減少手機(jī)存儲(chǔ)空間占用,對(duì)包體積大小的優(yōu)化也是尤為重要的。

安裝包ipa的內(nèi)容

iOS打包出來(lái)的ipa,本質(zhì)上是一個(gè)壓縮包,可以將.ipa的后綴改為.zip,然后進(jìn)行解壓縮后會(huì)得到一個(gè)Payload文件夾,里面又一個(gè)xxx.app的文件,右鍵顯示包內(nèi)容可以看到具體內(nèi)容:

  • _CodeSignature: ipa包簽名文件
  • .lproj: 語(yǔ)言文件
  • Frameworks: 第三庫(kù)、SwiftSupport庫(kù)
  • Plugins: App創(chuàng)建的擴(kuò)展,比如Widget、Push、分享
  • Assets.car: 由Assets.xcassets生成的資源文件,里面包含各種分辨率的圖片
  • embedded.mobileprovision: 證書(shū)配置文件
  • Info.plist: 項(xiàng)目配置
  • exec格式的xxx: Mach-O格式的可執(zhí)行文件
  • 其它資源文件
    .mp3格式的文件
    .html的文件
    .json的文件
    .png或者.jpg的文件

Mach-o文件的具體內(nèi)容:


Header.png
  • Header,存放了二進(jìn)制文件的基本信息,包括文件是32位還是64位、運(yùn)行該文件對(duì)應(yīng)的處理器架構(gòu)是什么、文件類(lèi)型(比如可執(zhí)行文件)、Load Commands的個(gè)數(shù)和大小等等。
  • Load Commands,是一個(gè)struct結(jié)構(gòu),用來(lái)告訴內(nèi)核和dyld,如何將APP運(yùn)行所需資源加載到內(nèi)存。比如main的加載地址,動(dòng)態(tài)鏈接器dyld的文件路徑,相關(guān)依賴(lài)庫(kù)的文件路徑,以及Data中的Segment如何加載到內(nèi)存。
  • Data數(shù)據(jù)區(qū),存放著代碼、字符常量、類(lèi)、方法等數(shù)據(jù),由多個(gè)segment組成。而segment是由多個(gè)section組成的。

segment包括如下5種:

  • _PAGEZERO: 占用APP最開(kāi)始的一段內(nèi)存空間,用來(lái)處理空指針;
  • _TEXT : 只讀,用于存放代碼、字符串常量,const修飾常量等;
  • _DATA : 可讀寫(xiě),用于存儲(chǔ)程序中所定義的數(shù)據(jù);
  • __OBJC: Objective-C runtime 段;
  • _LINKEDIT: 包含需要被動(dòng)態(tài)鏈接器使用的符號(hào)和其他表,包括符號(hào)表、字符串表等。

包體積大小優(yōu)化

通過(guò)ipa安裝包的具體內(nèi)容,可以分析出應(yīng)用包體積大小的具體優(yōu)化方案。

1 資源瘦身

1.1 移除無(wú)用資源

  • 可以使用LSUnusedResources這類(lèi)工具,查找應(yīng)用沒(méi)有使用的圖片資源。
  • 內(nèi)容相同,但是尺寸不同的圖片;同樣的圖片,在不同業(yè)務(wù)模塊使用了不同的命名(可以通過(guò)fdupes工具掃描出重復(fù)的文件)。這兩類(lèi)圖片可以考慮合并處理。

1.2 資源壓縮

  • 使用 RGB with palette 壓縮圖片。
    通過(guò)ImageOptim、tinypng等工具進(jìn)行無(wú)損壓縮,是通過(guò)變換圖片的編碼壓縮算法減少文件的大小,圖片解碼后的Bitmap數(shù)據(jù)不變,構(gòu)建Asset Catalog的工具actool以Bitmap為數(shù)據(jù)源,所以無(wú)損壓縮無(wú)法優(yōu)化Assets.car的大小。
    ImageOptim可以改變圖片的編碼方式為RGB with palette,需要在ImageOptim的設(shè)置頁(yè)面勾選有損壓縮,指定相應(yīng)的壓縮質(zhì)量即可。
  • 使用webp格式的圖片,有損壓縮模式下圖片體積只有 jpeg 格式的 1/3,無(wú)損壓縮也能減小 1/4。
  • Assets.car合并,可以在Build Phases中加入腳本,將多個(gè)庫(kù)中Asset Catalog合并到一個(gè)Asset Catalog中。
    Assets.car 文件本質(zhì)上是BOM文件,actool構(gòu)建Assets.car文件時(shí)會(huì)自帶一些優(yōu)化操作。所以,將若干個(gè) Assets.car 合并,可以減少重復(fù)的 BOM Block,最大化的享受actool優(yōu)化效果。
  • 文本文件壓縮,壓縮部分json、html等文本文件,在應(yīng)用啟動(dòng)后解壓放到沙盒中,也可以?xún)?yōu)化一部分的包體積大小。

2 Mach-o文件優(yōu)化

2.1 Optimization Level使用-Oz編譯參數(shù)

Xcode 11新增了Oz編譯優(yōu)化選項(xiàng),核心原理是對(duì)重復(fù)的連續(xù)機(jī)器指令外聯(lián)成函數(shù)進(jìn)行復(fù)用,和“內(nèi)聯(lián)函數(shù)”的原理正好相反。因此,開(kāi)啟Oz可以減小二進(jìn)制文件的大小,但也會(huì)帶來(lái)執(zhí)行效率的額外消耗,需要慎用(記一起 clang 開(kāi)啟 -Oz 選項(xiàng)引發(fā)的血案)。

2.2 Link-Time Optimization鏈接時(shí)優(yōu)化

Link-Time Optimization鏈接時(shí)優(yōu)化是Xcode自帶的一個(gè)編譯/鏈接參數(shù),對(duì)包大小和運(yùn)行效率都有正向影響。


Apple Clang Code Generation.png

2.3 屬性動(dòng)態(tài)化

一個(gè)屬性可以分為三個(gè)部分:

  • 成員變量部分: 成員變量本質(zhì)是一個(gè)大小 32B 的結(jié)構(gòu)體,結(jié)構(gòu)體中三個(gè)指針(Offset、Name、Type)指向的內(nèi)容的大小分別為8B、10B、10B,其中Name、Type指針指向的內(nèi)容的大小和成員變量的類(lèi)型、名字長(zhǎng)度相關(guān)??偞笮〈蠹s60B。
  • 自動(dòng)生成的 set/get 方法部分: set/get 方法本質(zhì)是一個(gè)大小 24B的結(jié)構(gòu)體,結(jié)構(gòu)體包含三個(gè)指針Name、Type、Implementation,指向的內(nèi)容大小大概為10B、10B、20B。一個(gè)方法大小大概是 64B,set、get 兩個(gè)方法就是 128B。
  • property 部分: property 的本質(zhì)仍然是個(gè)結(jié)構(gòu)體,大小是 16B,結(jié)構(gòu)體中兩個(gè)指針指向內(nèi)容的大小分別大概是10B、10B,和屬性的名字和類(lèi)型相關(guān)。總大小大概 36B。
    因此,一個(gè)屬性占用的包大小大約為 224B。如果指定屬性@dynamic,就不生成成員變量、get/set 方法,則一個(gè)屬性可以由 224B 減少到 36B。所以,應(yīng)用內(nèi)Model的屬性可以考慮指定@dynamic。

參考文章

詳解 Mach-O 文件結(jié)構(gòu)
iOS進(jìn)階 - Mach-O文件解析
Xcode編譯相關(guān)
記一起 clang 開(kāi)啟 -Oz 選項(xiàng)引發(fā)的血案
今日頭條 iOS 安裝包大小優(yōu)化—— 新階段、新實(shí)踐
Alibaba.com瘦包40MB——業(yè)界最全的iOS包大小技術(shù)總結(jié)
深入探索 iOS 包體積優(yōu)化
正經(jīng)分析iOS包大小優(yōu)化
ipa包大小優(yōu)化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容