如何減小ipa包大小方法總結,減小ipa包大小

來源:互聯網
上載者:User

如何減小ipa包大小方法總結,減小ipa包大小

本文作者:錦超@阿里Mobile Security,更多技術乾貨,請訪問阿里聚安全部落格

縮減ios可執行檔包的大小是每一個ios開發人員都要經曆的問題,一般首先會對資源檔做處理,壓縮圖片/音頻,去除不必要的資源如@2x和@3x的圖片合并。這些資源最佳化做完後,我們還可以嘗試對可執行檔進行瘦身,項目越大,可執行檔佔用的體積越大,又因為AppStore會對可執行檔加密,導致可執行檔的壓縮率低,壓縮後可執行檔占整個APP安裝包的體積比例大約有80%~90%,還是挺值得最佳化的,下面說一些壓縮的地方:

1>編譯器的最佳化---即setting裡面一些配置項

Build Settings->Optimization Level有幾個編譯最佳化選項,release版應該選擇Fastest, Smalllest,這個選項會開啟那些不增加代碼大小的全部最佳化,並讓可執行檔儘可能小,當然這些編譯項早期是在工程產生時候xcode預設給工程配置好了,如果一旦xcode做了改變我們要知道這些東西。

2>去除符號資訊

Strip Linked Product / Deployment Postprocessing / Symbols Hidden by Default在release版本應該設為yes,可以去除不必要的偵錯符號。Symbols Hidden by Default會把所有符號都定義成”private extern”。這些選項目前都是XCode裡release的預設選項,但舊版XCode產生的項目可能不是,可以檢查一下

3>引用的大部分二方庫或者三方庫

a、有些庫引用進來可能只是用了其中很小的一個功能,有一些可能是只是為了方便一兩個case,針對這樣的庫我們可以自己寫代碼,或者玻璃不需要的功能(建議還是自己實現,這樣能節省一些庫的引用)。

b、其次針對一些庫ARC和MRC對庫的大小也是有影響,由於現在都是arc管理記憶體很多庫都更新成arc模式了,由於arc模式下是系統自從插入release,所以對大小也是有影響的,見:

結果是ARC大概會使程式碼片段增加10%的size,考慮程式碼片段占可執行檔大約有80%,估計對整個可執行檔的影響會是8%。

可以評估一下8%的體積下降是不是值得把項目裡某些模組改成MRC,這樣程式的維護成本上升了,一般不到特殊情況不建議這麼做。

4>無用代碼

在項目裡建立一個類,給它添加幾個方法,但不要在任何地方import它,build完項目後觀察linkmap,你會發現這個類還是被編譯進可執行檔了。

按C++的經驗,沒有被使用到的類和方法編譯器都會最佳化掉,不會編進最終的可執行檔,但object-c不一樣,因為object-c的動態特性,它可以通過類和方法名反射獲得這個類和方法進行調用,所以就算在代碼裡某個類沒被使用到,編譯器也沒法保證這個類不會在運行時通過反射去調用,所以只要是在項目裡的檔案,無論是否又被使用到都會被編譯進可執行檔。

對此我們可以通過指令碼,遍曆整個項目的檔案,找出所有沒有被引用的類檔案和沒有被調用的方法,在保證沒有其他地方動態調用的情況下把它們去掉。如果整個項目曆時很長,曆時代碼遺留較多,這個清理對可執行檔省出的空間還是挺可觀的。

5>類/方法名長度

觀察linkmap可以發現每個類和方法名都在__cstring段裡都存了相應的字串值,所以類和方法名的長短也是對可執行檔大小是有影響的,原因還是object-c的動態特性,因為需要通過類/方法名反射找到這個類/方法進行調用,object-c物件模型會把類/方法名字串都儲存下來。

對此我們可以考慮在編譯前把所有類和方法名進行混淆,跟壓縮js一樣,把長名字替換成短名字,這樣做的好處除了縮小體積外,還對安全性有很大提升,別人拿到可執行檔對它class-dump出來的結果都是混淆後的類和方法名,就無法從類和方法名中猜出某個方法是做什麼的,就難以掛鈎子進行hack。不過這樣做有個缺點,就是crash堆棧反解出來的堆棧方法名會是混淆後的,需要再加一層混淆->原名的轉換,實現和使用成本有點高。實際上這部分佔用的長度比較小,中型項目也就幾百K,對安全性要求高的情況可以試試。

6>冗餘字串

代碼上定義的所有靜態字串都會記錄在在可執行檔的__cstring段,如果項目裡Log非常多,這個空間佔用也是可觀的,也有幾百K的大小,可以考慮清理所有冗餘的字串。另外如果有特別長的字串,建議抽離儲存成靜態檔案,因為AppStore對可執行檔加密導致壓縮率低,特別長的字串抽離成靜態資源檔案後壓縮率會比在可執行檔裡高很多。

7>圖片處理:

通常針對圖片的處理我們就是壓縮或者採用webp格式圖片,其實針對大部分純色圖片也可以採用代碼實現,這樣能減少不少資源。

可能有人問工程裡面站資源的是大圖,不是小圖,那大圖怎麼辦呢?拆分,大圖拆分成多個圖,看那一部分可以使用代碼從而減少代碼小。當然盡量減少不必要得資源放到resource中。不常用的換成下載。最後把縮減iOS安裝包大小的各種方法列出來做了張CheckList圖:

 

 

本文作者:錦超@阿里Mobile Security,更多技術乾貨,請訪問阿里聚安全部落格

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.