iOS 底層 - 性能優(yōu)化之安裝包瘦身(App Thinning)

本文源自本人的學(xué)習(xí)記錄整理與理解,其中參考閱讀了部分優(yōu)秀的博客和書籍辕近,盡量以通俗簡單的語句轉(zhuǎn)述。引用到的地方如有遺漏或未能一一列舉原文出處還望見諒與指出,另文章內(nèi)容如有不妥之處還望指教逾礁,萬分感謝 !

安裝包:程序編譯打包后的文件访惜;比如:iOS平臺的IPA文件, 主要由可執(zhí)行文件資源文件組成嘹履,資源文件包括圖片音頻债热、視頻等固定資源

安裝包過大的會有什么缺點 植捎?

  1. 下載時耗費多余的流量,占用更大的手機內(nèi)存空間
  2. 超過一定限制會被禁止安裝
  3. 4G網(wǎng)絡(luò)不支持下載超過200MB的APP !

關(guān)于構(gòu)建版本文件大小蘋果小哥哥是這么說的 Q羧帷Q媸唷!舌剂!

對于 iOS 和 Apple tvOS App济锄,請驗證您的 App 在支持的操作系統(tǒng)中不超過文件大小的上限。您 App 的完整未壓縮大小不得超過 4GB霍转。Apple Watch App 不得超過 75MB荐绝。此外,每個 Mach-O 可執(zhí)行文件(例如避消,app_name.app/app_name)不得超過這些文件大小的上限低滩。

要了解如何計算內(nèi)存用量,請參閱 Memory Usage Performance Guidelines(《內(nèi)存使用性能準(zhǔn)則》)中的“Viewing Virtual Memory Usage(查看虛擬內(nèi)存使用情況)”岩喷。

可執(zhí)行文件大小.png

Architecture Slice(架構(gòu)片段)是針對特定架構(gòu)的胖二進制布局文件的一部分恕沫。例如,一個胖二進制文件可能會包含針對 32 位和 64 位架構(gòu)的片段纱意。

優(yōu)化思路:

  • 采取無損壓縮
    ImageOptim是一款優(yōu)秀的無損圖片壓縮工具婶溯,它通過優(yōu)化壓縮參數(shù),移除無用的文件元數(shù)據(jù)和不必要的顏色配置來實現(xiàn)圖片的無損壓縮偷霉。
    壓縮完之后效果還是很明顯的迄委,可能是美術(shù)提供之前沒壓縮過(哭臉狀),Assets.xcassets文件夾壓縮效果
    如下:
image

但發(fā)現(xiàn)實際生產(chǎn)的安裝包體積沒有變小类少,因為COMPRESS_PNG_FILESSTRIP_PNG_TEXT設(shè)置成了YES叙身,Xcode會重新壓縮一次圖片,但是壓縮之后的圖反而比ImageOptim處理之后的圖更大。改成NO就能讓項目中的PNG保持不變。

  • 圖片管理用 Assets.xcassets
    主要有兩個方式管理圖片,一種是在項目中添加文件夾存放甲喝,另一種是放在Assets.xcassets管理虏两。推薦使用Assets.xcassets管理愧旦,因為它會把里邊的所有 png 格式的圖片壓縮成一個Assets.car文件,壓縮比率比其他方式管理圖片要高定罢,大大減少圖片體積笤虫。

  • 去除沒有用到的資源 LSUnusedResources

  • 把所需資源存儲在服務(wù)端,安裝成功后祖凫;通過網(wǎng)絡(luò)下載緩存到本地

可執(zhí)行文件瘦身思路:

  • 編譯器優(yōu)化

    1. Strip Linked Product琼蚯、Make Strings Read-OnlySymbols Hidden by Default 設(shè)置為YES 惠况;目前Xcode已經(jīng)默認打開了遭庶,老項目需注意
    2. 去掉異常支持,Enable C++ Exceptions稠屠、Enable Objective-C Exceptions設(shè)置為NO峦睡, Other C Flags添加-fno-exceptions
  • 利用AppCode https://www.jetbrains.com/objc/
    檢測未使用的代碼: 菜單欄 -> Code - > Inspect Code
    AppCode是 jetbrains 公司開發(fā)的,也可以用來開發(fā)iOS項目权埠;不過是付費的榨了,只有30天的試用期

  • 編寫LLVM插件檢測出重復(fù)代碼、未被調(diào)用的代碼

  • Xcode自帶LinkMap配置


    LinkMap.png

LinkMap文件是Xcode產(chǎn)生可執(zhí)行文件的同時生成的鏈接信息攘蔽,用來描述可執(zhí)行文件的構(gòu)造成分龙屉,包括代碼段(__TEXT)和數(shù)據(jù)段(__DATA)的分布情況。只要設(shè)置Project->Build Settings->Write Link Map FileYES满俗,build完后就可以在設(shè)置的路徑看到LinkMap文件了转捕。

修改文件路徑就可以拿到檢測后的文件;找到比較大的文件后唆垃,針對它進行相應(yīng)的優(yōu)化

我們可以用腳本從linkmap中統(tǒng)計出每個.o目標(biāo)文件占用的體積和每個.a靜態(tài)庫占用的體積腳本鏈接

項目中多少都會引入一些第三方靜態(tài)庫五芝,比如交友項目中引入了第三方分享庫,通過lipo工具可以查看支持的指令集降盹,比如查看微信SDK

lipo -info libWeChatSDK.a          
Architectures in the fat file: libWeChatSDK.a are: armv7 armv7s i386 x86_64 arm64 

i386,x86_64,這不是模擬器的指令集么与柑?去掉看能不能減少體積谤辜?armv7可以兼容armv7s蓄坏,armv7s也可以刪了,只保留armv7和arm64

lipo libWeChatSDK.a -thin armv7 -output libWeChatSDK-armv7.a
lipo libWeChatSDK.a -thin arm64 -output libWeChatSDK-arm64.a
lipo create libWeChatSDK-armv7.a libWeChatSDK-arm64.a -output libWeChatSDK-device.a

ls -ll
-rw-r--r--  1 Vic  staff   5957080 Jan  6 14:40 libWeChatSDK-device.a
-rw-r--r--  1 Vic  staff  14410376 Nov 25 11:53 libWeChatSDK.a

由原來的14.4M降低到6M丑念!少了一半多涡戳。如果把所有的靜態(tài)庫都只保留armv7和arm64安裝包體檢豈不是大大減少了~!

解決模擬器無法使用

刪掉了i386x86_64后模擬器將可能無法正常運行脯倚,目前想到的解決方法渔彰,有更好的方案請告訴我嵌屎!

如果是手工添加靜態(tài)庫的話可以在發(fā)布前將靜態(tài)庫替換

如果用 Cocoapods管理可以使用兩份podfile文件,一份包含模擬器指令集一份不包括恍涂,發(fā)布的時候更換podfile文件即可宝惰;或者用同一份podfile,分別配置環(huán)境設(shè)置庫

pod libWeChatSDK:configurations => ['Debug']
pod libWeChatSDK-device:configurations => ['Release']

protocolbuf精簡

由于歷史原因項目中用的protocolbuf還是C++版本了再沧,在3.0版本官方已經(jīng)出了OC版本并提供了生成工具尼夺,官方生成的文件大小只有現(xiàn)在的1/4,代碼行數(shù)大概是現(xiàn)在的1/10炒瘸。

總結(jié):

安裝包瘦身.png

iOS 底層 - 性能優(yōu)化之CPU淤堵、GPU
iOS 底層 - 性能優(yōu)化之啟動和電池能耗

也可以參考官方給出的方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顷扩,隨后出現(xiàn)的幾起案子拐邪,更是在濱河造成了極大的恐慌,老刑警劉巖隘截,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扎阶,死亡現(xiàn)場離奇詭異,居然都是意外死亡婶芭,警方通過查閱死者的電腦和手機乘陪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕擂,“玉大人啡邑,你說我怎么就攤上這事【模” “怎么了谤逼?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仇穗。 經(jīng)常有香客問我流部,道長,這世上最難降的妖魔是什么纹坐? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任枝冀,我火速辦了婚禮,結(jié)果婚禮上耘子,老公的妹妹穿的比我還像新娘果漾。我一直安慰自己,他們只是感情好谷誓,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布绒障。 她就那樣靜靜地躺著,像睡著了一般捍歪。 火紅的嫁衣襯著肌膚如雪户辱。 梳的紋絲不亂的頭發(fā)上鸵钝,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音庐镐,去河邊找鬼恩商。 笑死,一個胖子當(dāng)著我的面吹牛必逆,可吹牛的內(nèi)容都是我干的痕届。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼末患,長吁一口氣:“原來是場噩夢啊……” “哼研叫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起璧针,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嚷炉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后探橱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體申屹,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年隧膏,在試婚紗的時候發(fā)現(xiàn)自己被綠了哗讥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡胞枕,死狀恐怖杆煞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腐泻,我是刑警寧澤决乎,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站派桩,受9級特大地震影響构诚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铆惑,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一范嘱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧员魏,春花似錦丑蛤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闻书,卻和暖如春名斟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魄眉。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工砰盐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坑律。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓岩梳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晃择。 傳聞我的和親對象是個殘疾皇子冀值,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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

  • App安裝包是由資源和可執(zhí)行文件兩部分組成,安裝包瘦身也是從這兩部分進行宫屠。 資源瘦身 1. 刪除無用的資源 工具:...
    Vinecnt閱讀 18,328評論 13 84
  • 1. 耗電優(yōu)化 iOS的APP的耗電的性能也是一部分需要的優(yōu)化的部分.我們可以使用xcode看出一個App的使用性...
    周灬閱讀 1,613評論 0 7
  • App安裝包是由資源和可執(zhí)行文件兩部分組成浪蹂,安裝包瘦身也是從這兩部分進行抵栈。資源瘦身 刪除無用的資源工具:LSUnu...
    RobinYu閱讀 578評論 0 0
  • 對iOS安裝包瘦身是很多App都必須要做的事,一般首先會對資源文件下手坤次,壓縮圖片/音頻古劲,去除不必要的資源。這些資源...
    二斤寂寞閱讀 780評論 0 2
  • 目錄一:摘要二:安裝包組成三:系統(tǒng)優(yōu)化四:資源優(yōu)化五:可執(zhí)行文件優(yōu)化六:編譯器優(yōu)化七:拓展 一缰猴,摘要 眾所周知蘋果...
    你好小老虎閱讀 403評論 0 1