iOS應用瘦身

原文地址web

隨着業務的不斷迭代,APP安裝包會愈來愈大。包過大既影響用戶體驗、影響升級率、致使沒法提交App Store和非WiFi環境下沒法下載的問題。怎樣對App進行瘦身成了重中之重。swift

APP Thinning

App Thinning是由蘋果公司推出的一項能夠改善App下載進程的技術,它只適用於iOS9及以上系統。主要解決了用戶下載App耗費太高流量問題,同時還能夠節省用戶iOS設備的存儲空間。架構

如今,市面上的iOS設備多種多樣,若是想在多種屏幕上都能視覺效果良好,就須要大量的優化資源來匹配不一樣分辨率的屏幕。同時,APP還包含針對arm6四、arm7s、arm7等多種架構的優化,3D圖形技術(OpenGL, Metal等),還有音頻以及其餘不一樣的文件。若是這些資源都在一個包裏,勢必會使用戶的安裝包變大。app

App Thinning 會自動檢測用戶的設備類型,而且只下載當前設備所適用的內容。。如:iPhone 6只會下載 2x分辨率的圖片資源,iPhone 6plus則只會下載3x分辨率的圖片資源。用戶僅需下載本身當前使用的特定設備所需的內容,這不只加快了下載速度,還節約了設備的存儲空間。工具

App Thinning類型

App Thinning由三個方面構成:App Slicing、On Demand Resources以及Bitcode。性能

App Slicing

向iTunes Connect上傳App後,會對App進行切割,建立不一樣的變體,一個變體只包含針對某個目標設備的可執行架構與資源等,這樣就能夠適應到不一樣的設備。優化

On Demand Resources

按需加載資源是在app第一次安裝後可下載的文件。舉例說明,當玩家解鎖遊戲的特定關卡後能夠下載新關卡相關的內容。此外,玩家已經經過的關卡能夠被移除以便節約設備上的存儲空間。ui

經過設置Xcode中的Build Settings設置,能夠開啓按需加載。ssr

Bitcode

Bitcode有些抽象,但在本質上它也是蘋果在用戶下載前優化app的新方式。Bitcode使得app不管在何設備上都能快速高效地運行。Bitcode使用最新的編譯器自動編譯app而且針對特定架構進行優化(ps:優化效果並不明顯)。code

Bitcode不會下載應用針對不一樣架構的優化,而僅下載與特定設備相關的優化,使得下載量更小。

能夠經過Build Settings下的選項進行設置,將bitcode設爲YES來完成。

如何使用App Thinning?

雖然Xcode和App Store幫你完成了App Thinning的主要流程,可是你須要確保你的app支持這項新技術。首先,你必須啓用資產目錄。

而後添加xcassets目錄,將圖片添加進來便可。

按照Asset Catalog的模板添加圖片資源便可,添加的2x分辨率的圖片和3x分辨率的圖片,會在上傳到 App Store後被建立成不一樣的變體以減少App安裝包的大小。架構文件只須要按照默認的設置, App Store就會根據設備建立不一樣的變體,每一個變體裏只有當前設備須要的那個架構文件。

圖片資源優化

圖片資源的優化,主要體如今刪除無用圖片和圖片資源壓縮這兩方面。

清除無用圖片資源

刪除無用圖片的過程,能夠歸納爲下面這幾步:

  • 找到全部的圖片資源文件名(後綴爲.imageset、.jpg、.png、.gif、 .pdf類型的文件名)。
  • 在項目中的全部代碼文件及資源配置文件(後綴爲.m、.mm、 .swift、 .xib, .storyboard、 .plist的文件)中,查找第一步中找到的文件名。
  • 獲得全部未使用的圖片資源名。
  • 確認無用資源後,就能夠對這些無用資源執行刪除操做了。

**注意:**對於"image_%d"這種方式的圖片不要誤刪。

若是你不想本身從新寫一個工具的話,能夠選擇開源的工具直接使用。我建議的有2個開源的工具比較好用:FengNiao和LSUnusedResources。關於這個兩個工具的對比,你們能夠參考:www.avanderlee.com/optimizatio… 這篇文章。

清除重複圖片資源

重複資源不是指命名重複而是內容相同。

fdupes 是Linux下的一個工具,能夠在指定的目錄及子目錄中查找重複的文件。fdupes經過對比文件的MD5簽名,以及逐字節比較文件來識別重複內容。

圖片壓縮

目前比較好的壓縮方案是,將圖片轉成WebP。WebP是Google公司的一個開源項目。關於WebP的原理及好處已經在iOS啓動優化之首屏圖片加載優化這篇文章中寫過了,感興趣的同窗能夠查閱這篇文章。

Google公司在開源WebP時,提供了一個圖片壓縮工具cwebp來將其餘圖片轉成WebP

值得注意的是:WebP在CPU消耗和解碼時間上會比PNG高一些。因此,咱們有時候還須要在性能和體積上作取捨。

因此要具體狀況具體分析,若是圖片較大,能夠考慮使用WebP;而較小時,可使用網頁工具TinyPng或GUI工具ImageOptim進行圖片壓縮。這兩個工具的壓縮率沒有WebP那麼高,不會改變圖片壓縮方式,解析時對性能損耗也不會增長。

代碼優化

對代碼進行瘦身,就是找到並刪除無用的代碼,查找無用代碼的過程歸納以下:

  • 找出全部的類和方法。
  • 找到使用的類和方法。
  • 取兩者的差集獲得無用代碼。
  • 人工確認無用代碼後,可進行刪除。

使用AppCode找出無用代碼

經過AppCode能夠檢查未使用的文件,拼寫問題,類型檢查等多種潛在疑難雜症。 經過Code->Inspect Code進行靜態分析:

使用App Code查找無用代碼會存在一些弊端:

  • 若是子類調用了父類的方法,父類的這個方法不會被認爲使用了;
  • 經過點的方式使用屬性,該屬性會被認爲沒有使用;
  • 沒法識別經過字符串拼接方式來建立的類和調用的方法。

LinkMap結合Mach-O找無用代碼

能夠經過分析LinkMap來得到全部的類和方法的信息。獲取LinkMap能夠經過將Build Setting裏的 Write Link Map File設置爲Yes,而後指定Path to Link Map File的路徑,就能夠獲得每次編譯後的 LinkMap 文件了,設置選項以下所示:

LinkMap包含三部分:Object File、Section 和 Symbols。

Object File:包含了代碼工程的全部文件; Section:描述了代碼段在生成的Mach-O裏的偏移位置和大小; Symbols:列出每一個方法、類、block、以及它們的大小;

經過LinkMap ,不但能夠統計出全部的方法和類,還可以清晰地看到代碼所佔包大小的具體,進而能夠針對性地進行代碼優化。

獲得了代碼的全集信息之後,還須要找到已使用的類和方法,獲取到差集,從而找出無用代碼。Mach-O文件中包含了全部使用過的類和方法。

iOS中的方法都是經過objc_msgSend來調用的,而objc_msgSend在Mach-O文件裏是經過__objc_selrefs這個section來獲取selector這個參數的,因此__objc_selrefs裏的方法必定是被調用了的。__objc_classrefs裏是被調用過的類,__objc_superrefs是調用過super的類。經過__objc_classrefs和__objc_superrefs,咱們就能夠找出使用過的類和子類。

可使用MachOView這個軟件來查看Mach-O文件裏的信息。


掃一掃關注咱們,get更多iOS技能

相關文章
相關標籤/搜索