【iOS】APP的優化---IPA大小的壓縮

衆所周知,在App Store中超過必定大小的文件只能使用WiFi下載(近期提高到了150M,以前是100M)。雖然提高了一點,可是咱們仍須要注意安裝包的大小。畢竟除了遊戲不多有人喜歡下很大的應用。網絡

那麼如何知道是哪些文件佔得空間比較大呢?有一個比較簡單的方法就是找到IPA包,解壓獲得.app文件,顯示包內容,就能夠查看到裏面的東西了。架構

*注意:.app bundle是通過壓縮的,而且有些文件的壓縮效果要比別的文件好,因此壓縮後的效果纔是纔是最重要的。不過通常狀況下在壓縮前最大的文件,在壓縮後依舊是最大的文件。咱們能夠將某個文件刪除,而後在Finder中右鍵單擊,選擇壓縮,這樣能夠更加精確的測量文件壓縮效果。app

bundle若是你不懂的話能夠查看這篇文章。參考ide

看到這裏咱們就知道一個ipa裏面大文件都有哪些了,而後就能夠針對性的修改。工具

 

說了上面一些,下面開始說一些乾貨吧。優化

首先是Xcode編譯選項優化。通過下面這些設置,你的APP就會小不少。網站

 Xcode編譯選項優化方法:ui

1.捨棄架構armv7spa

armv7用於支持4s和4,4s是2011年11月正式上線,雖然還有小部分人在使用,可是追求包體大小的徹底能夠捨棄了。.net

 

2.冗餘代碼剝離

build setting 裏 DEAD_CODE_STRIPPING = YES(好像默認就是YES)。 肯定 dead code(代碼被定義但從未被調用)被剝離,去掉冗餘的代碼,即便一點冗餘代碼,編譯後體積也是很可觀的。

 3.編譯器優化級別

Build Settings->Optimization Level有幾個編譯優化選項,release版應該選擇Fastest, Smalllest[-Os],這個選項會開啓那些不增長代碼大小的所有優化,並讓可執行文件儘量小。

 

 4.配置編譯選項

(Levels選項內)Generate Debug Symbols 設置爲NO,這個配置選項應該會讓你減去小半的體積。注意這個若是設置成NO就不會在斷點處停下

 

 5.去除符號信息

Strip Debug Symbols During Copy 和 Symbols Hidden by Default 在release版本應該設爲yes,能夠去除沒必要要的調試符號。Symbols Hidden by Default會把全部符號都定義成」private extern」,設了後會減少體積。

 

6.Strip Linked Product:DEBUG下設爲NO,RELEASE下設爲YES,用於RELEASE模式下縮減app的大小;

7.編譯器優化,去掉異常支持。Enable C++ Exceptions、Enable Objective-C Exceptions設置爲NO,Other C Flags添加-fno-exceptions

接下來就是資源文件了,這些都是佔大頭的。

在開發中咱們會使用一些本地圖片,本地資源,三方SDK之類的。這些東西會佔用很大的內存。下面我會一一解決。

1.本地資源文件

一些大圖片或者音視頻咱們不會設置成網絡,而是存儲在本地,這就致使的IPA包的加大。

精簡本地資源文件方法:
(1)壓縮資源文件,如使用 ImageOptim 或者 TinyPng 來壓縮圖片,還能夠在調整一下音視頻的碼率,減少體積;
(2)把一些資源放在網絡上,如一些非第一時間加載須要的資源文件(須要根據不一樣業務邏輯進行判斷)放置在網絡上,在加載完成後靜默下載存儲在本地。留存以後使用。
(3)簡單的圖片可使用代碼自動生成。很相似的圖片,僅僅只有顏色不一樣,能夠經過代碼處理圖片的顏色。
(4)Xcode 中也會有一些圖片相關設置,Compress PNG Files 和 Remove Text Medadata From PNG Files。前者打包的時候自動對圖片進行無損壓縮,後者會移除 PNG 圖像名稱、做者、版權、創做時間、註釋等信息。

 1 -(UIImage*)imageChangeColor:(UIColor*)color{
 2   UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);//獲取畫布
 3   [color setFill];//畫筆沾取顏色
 4   CGRect bounds = CGRectMake(0, 0, self.size.width, self.size.height);
 5   UIRectFill(bounds);
 6   [self drawInRect:bounds blendMode:kCGBlendModeOverlay alpha:1.0f];//繪製一次
 7   [self drawInRect:bounds blendMode:kCGBlendModeDestinationIn alpha:1.0f];//再繪製一次
 8   UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
 9   UIGraphicsEndImageContext();//獲取圖片
10   return img;
11 }
12 
13 + (UIImage *)getLaunchImage{
14   CGSize viewSize = [UIScreen mainScreen].bounds.size;
15   NSString *viewOr = @"Portrait";//垂直
16   NSString *launchImage = nil;
17   NSArray *launchImages = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
18   for (NSDictionary *dict in launchImages) {
19     CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
20     if (CGSizeEqualToSize(viewSize, imageSize) && [viewOr isEqualToString:dict[@"UILaunchImageOrientation"]]) {
21       launchImage = dict[@"UILaunchImageName"];
22     }
23   }
24   return [UIImage imageNamed:launchImage];
25  }

補充:
音頻的壓縮參考WWDC中的Audio Development for Games,裏面介紹瞭如何有效的處理音頻。常規來講,咱們要使用AAC或MP3來壓縮音頻,而且能夠嘗試下降一下音頻的比特率。有時候44.1khz的採樣是沒有必要的,稍微低一點的比特率也不會下降音頻的質量。
圖片方面儘可能使用8-bit圖片(使用8-bit的PNG圖片會比32-bit的圖片能減小4倍的壓縮率。可是8-bit的圖片支持最多256種不一樣的顏色,因此8-bit的圖片通常只應該用於一小部分的顏色圖片。例如灰度圖片最好使用8-bit。)針對32-bitt的圖片儘可能使用高壓縮的比率:利用Adobe Photoshop的Save For Web能夠減少JPEG和PNG的圖片大小。在Xcode中,默認狀況下,會自動的使用pngcrush來壓縮.png圖片。

2.Assets.xcassets裏的圖片

在版本迭代中咱們也會遇到一下界面調整,圖片更換的狀況,尤爲是在一些活動或者主題色變化時,常常會往裏面添加新圖片,一些老圖片可能就不會刪除,長此以往,圖片大小就愈來愈大。

精簡圖片的方法:
(1)使用在線壓縮png圖片網站來壓縮圖片:compresspngtinypng
(2)一些比較大致積的背景圖片壓縮成.jpg格式的。
(3)刪除無用圖片
用LSUnusedResource這個軟件查找項目中沒有用到的圖片,而後刪除,固然不必定特別準確,有一些[UIImage imageNamed:[NSString stringWithFormat:@"icon_%d",index]]這樣使用的圖片也會被列在未使用圖片中。
也可使用這個腳本工具能夠大範圍檢測程序中沒有用到的圖片http://blog.csdn.net/songhongri/article/details/21833069
使用方法:1.將.sh文件放到所檢測工程的目錄下,
     2.cd到該目錄下,
     3.執行腳本:sh unusedImage.sh
注意:這裏在刪除未應用的圖片時注意第三方庫裏的不能刪除,保險起見相同文件夾下的最好在工程裏手動再搜索一次,肯定沒有使用到,就能夠刪除了。

3.SDK

我以前開發中遇到的一個APP,內容較多功能比較複雜,SDK就有將近200m,雖然知道App Store會有壓縮,但是仍是很大,這是咱們就須要精簡SDK了。

精簡SDK方法:
(1)最基本的就是去除無用的SDK
(2)儘可能使用同一個公司下的SDK,我以前就見過一個開發分享用shareSDK,統計用的友盟,bug分析用的buggly。還有其餘的SDK,基本就是一個功能用一套,這不就是很大的問題嗎?在國內公司基本上都是往全的方向作,一個完整的SDK基本上就能包含大部分功能了,因此使用同一個公司的內容,缺失再補充SDK就是一個很好的方法
(3)在使用SDK的時候,咱們不須要下載所有的功能,咱們能夠選擇性下載功能,用不到的功能咱們不須要下載。

 4.代碼

代碼方面也有不少須要注意的地方,如一些readme文件和一些迭代中產生的無效代碼等。

精簡代碼的方法: 

(1)將數據從代碼中剝離出來將全部的資源(例如很長的字符串)從代碼中剝離出來,並存入外部文件,這樣會減少最終文件下載的大小,由於這些文件的壓縮效果更好。(參考iOS App Store Specific Considerations中的完整介紹。)(2)無用代碼的刪除經過 AppCode 打開對應的工程文件 選擇 Code -> inspect Code 分析代碼,去掉無用的引用及代碼。查找內部使用到的第三方庫,一方面能夠進行刪減代碼,用不到的類,能夠直接刪除,還有把第三方庫中的圖片資源刪除掉。(3)一些文檔的替換在開發中咱們可能會有一些文檔之類的在代碼中,可是在迭代後可能會沒有用,咱們能夠刪除這些東西來減少體積。 

相關文章
相關標籤/搜索