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

前言

應用的包體積大小會影響用戶的點擊下載率衫仑、安裝成功率和卸載率醉鳖,是衡量APP性能的一項重要指標郎嫁。為了更好的用戶體驗秉继,減少用戶下載等待時長、減少手機存儲空間占用泽铛,對包體積大小的優(yōu)化也是尤為重要的尚辑。

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

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

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

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


Header.png
  • Header愕够,存放了二進制文件的基本信息走贪,包括文件是32位還是64位佛猛、運行該文件對應的處理器架構是什么、文件類型(比如可執(zhí)行文件)厉斟、Load Commands的個數(shù)和大小等等挚躯。
  • Load Commands,是一個struct結(jié)構擦秽,用來告訴內(nèi)核和dyld,如何將APP運行所需資源加載到內(nèi)存漩勤。比如main的加載地址感挥,動態(tài)鏈接器dyld的文件路徑,相關依賴庫的文件路徑越败,以及Data中的Segment如何加載到內(nèi)存触幼。
  • Data數(shù)據(jù)區(qū),存放著代碼究飞、字符常量置谦、類、方法等數(shù)據(jù)亿傅,由多個segment組成媒峡。而segment是由多個section組成的。

segment包括如下5種:

  • _PAGEZERO: 占用APP最開始的一段內(nèi)存空間葵擎,用來處理空指針;
  • _TEXT : 只讀谅阿,用于存放代碼、字符串常量酬滤,const修飾常量等;
  • _DATA : 可讀寫签餐,用于存儲程序中所定義的數(shù)據(jù);
  • __OBJC: Objective-C runtime 段;
  • _LINKEDIT: 包含需要被動態(tài)鏈接器使用的符號和其他表盯串,包括符號表氯檐、字符串表等。

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

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

1 資源瘦身

1.1 移除無用資源

  • 可以使用LSUnusedResources這類工具,查找應用沒有使用的圖片資源译打。
  • 內(nèi)容相同耗拓,但是尺寸不同的圖片;同樣的圖片奏司,在不同業(yè)務模塊使用了不同的命名(可以通過fdupes工具掃描出重復的文件)乔询。這兩類圖片可以考慮合并處理。

1.2 資源壓縮

  • 使用 RGB with palette 壓縮圖片韵洋。
    通過ImageOptim竿刁、tinypng等工具進行無損壓縮黄锤,是通過變換圖片的編碼壓縮算法減少文件的大小,圖片解碼后的Bitmap數(shù)據(jù)不變食拜,構建Asset Catalog的工具actool以Bitmap為數(shù)據(jù)源鸵熟,所以無損壓縮無法優(yōu)化Assets.car的大小
    ImageOptim可以改變圖片的編碼方式為RGB with palette负甸,需要在ImageOptim的設置頁面勾選有損壓縮流强,指定相應的壓縮質(zhì)量即可。
  • 使用webp格式的圖片呻待,有損壓縮模式下圖片體積只有 jpeg 格式的 1/3打月,無損壓縮也能減小 1/4。
  • Assets.car合并蚕捉,可以在Build Phases中加入腳本奏篙,將多個庫中Asset Catalog合并到一個Asset Catalog中。
    Assets.car 文件本質(zhì)上是BOM文件迫淹,actool構建Assets.car文件時會自帶一些優(yōu)化操作秘通。所以,將若干個 Assets.car 合并敛熬,可以減少重復的 BOM Block肺稀,最大化的享受actool優(yōu)化效果。
  • 文本文件壓縮荸型,壓縮部分json盹靴、html等文本文件,在應用啟動后解壓放到沙盒中瑞妇,也可以優(yōu)化一部分的包體積大小稿静。

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

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

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

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

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


Apple Clang Code Generation.png

2.3 屬性動態(tài)化

一個屬性可以分為三個部分:

  • 成員變量部分: 成員變量本質(zhì)是一個大小 32B 的結(jié)構體,結(jié)構體中三個指針(Offset聚谁、Name母剥、Type)指向的內(nèi)容的大小分別為8B、10B、10B环疼,其中Name习霹、Type指針指向的內(nèi)容的大小和成員變量的類型、名字長度相關炫隶×芤叮總大小大約60B。
  • 自動生成的 set/get 方法部分: set/get 方法本質(zhì)是一個大小 24B的結(jié)構體伪阶,結(jié)構體包含三個指針Name煞檩、Type、Implementation望门,指向的內(nèi)容大小大概為10B形娇、10B、20B筹误。一個方法大小大概是 64B,set癣缅、get 兩個方法就是 128B厨剪。
  • property 部分: property 的本質(zhì)仍然是個結(jié)構體,大小是 16B友存,結(jié)構體中兩個指針指向內(nèi)容的大小分別大概是10B祷膳、10B,和屬性的名字和類型相關屡立≈背浚總大小大概 36B。
    因此膨俐,一個屬性占用的包大小大約為 224B勇皇。如果指定屬性@dynamic,就不生成成員變量焚刺、get/set 方法敛摘,則一個屬性可以由 224B 減少到 36B。所以乳愉,應用內(nèi)Model的屬性可以考慮指定@dynamic兄淫。

參考文章

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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔓姚,一起剝皮案震驚了整個濱河市捕虽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坡脐,老刑警劉巖泄私,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡挖滤,警方通過查閱死者的電腦和手機崩溪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩松,“玉大人伶唯,你說我怎么就攤上這事【屙铮” “怎么了乳幸?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钧椰。 經(jīng)常有香客問我粹断,道長,這世上最難降的妖魔是什么嫡霞? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任瓶埋,我火速辦了婚禮,結(jié)果婚禮上诊沪,老公的妹妹穿的比我還像新娘养筒。我一直安慰自己,他們只是感情好端姚,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布晕粪。 她就那樣靜靜地躺著,像睡著了一般渐裸。 火紅的嫁衣襯著肌膚如雪巫湘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天昏鹃,我揣著相機與錄音尚氛,去河邊找鬼。 笑死盆顾,一個胖子當著我的面吹牛怠褐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播您宪,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼奈懒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宪巨?” 一聲冷哼從身側(cè)響起磷杏,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捏卓,沒想到半個月后极祸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慈格,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年遥金,在試婚紗的時候發(fā)現(xiàn)自己被綠了浴捆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡稿械,死狀恐怖选泻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情美莫,我是刑警寧澤页眯,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站厢呵,受9級特大地震影響窝撵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟铭,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一碌奉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寒砖,春花似錦道批、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椭岩。三九已至茅逮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間判哥,已是汗流浹背献雅。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塌计,地道東北人挺身。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像锌仅,于是被迫代替她去往敵國和親章钾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容