給iOS App減肥

Hsusue發表於2019-01-09

前言

筆者的專案中,成員變更快,且都是學生開發,無用的東西堆積如山。一堆檔案沒引用,一堆方法不會呼叫也沒有刪掉。且UI時有改動,舊UI也不刪。打包出來31.1M。剛接手的時候只是10多M的孩子,咋突然就變胖了。而且筆者有點潔癖,看起來好累。最後大小25.8M,減肥了5.3M,關鍵是無用程式碼量少了舒服。

給iOS App減肥

筆者上網找到以下工具,親自嘗試一遍,並把過程記錄下來。不過這些工具並不100%準確,只起輔助作用,最終還是由我們判斷能不能刪。所以要做好備份,並且對專案有一定的熟悉度。

LSUnusedResources

  • 作用

查詢無用圖片並刪除。

  • 使用

勾選的選項中,如果程式碼有出現字串和xcassets中圖片名字一樣,這工具就認為該圖片是有用到的。該工具預設全部都勾選上了。

image.png

image.png

圖二中圈住部分,可以識別拼接的字串,然而,表情包名字沒有其他字首,所以這個工具識別不出來它們實際上是有用到的。

所以名字有數字的圖(例如上面的000,001),不同圖片有重複子字串(如homework_語文作業,homework_美術作業),如果不確定,保險起見,還是需要手動搜尋一下。

同理,如果圖片名稱是全中文,基本可以確定是沒有引用的。

果不其然,筆者搜尋homework_,發現有這麼一段程式碼。

        NSString *string = [NSString stringWithFormat:@"homework_%@",self.subjectLabel.text];
        [self.subjectImageView setImage:[UIImage imageNamed:string]];
複製程式碼
  • 效果

經過一番折騰,筆者刪掉了將近100張沒用的圖片。打包測試,這時候包大小變為26.8M,較原始包減小了4.3M,作用還是很明顯的。

imageoptim

  • 作用 通過刪除圖片部分無用的EXIF等資訊來減小PNG、JPEG和GIF圖片的大小。

從Xcode編譯時自帶的“圖片壓縮”說起提到,壓縮過的圖片帶來更高的應用執行速度。又能減少包大小,何樂而不為呢。

  • 使用

選中專案路徑就行。

  • 效果

經筆者測試,可能是專案圖片太多,加上電腦效能不怎麼樣,這工具執行了超久!而且底部UI(節省了多少)重新整理不同步,要點選一下才能重新整理有點不舒服;又沒有進度UI看。

而且Xcode也會對圖片進行壓縮處理,但不一定意味著小上加小,所以該工具對包大小效果可能不怎麼樣。

所以,筆者認為這一工具用不用都差不多。

最終執行結果截圖如下:

給iOS App減肥

打包測試,大小為26.1M,較上一步縮小了0.7M。

fui

fui(Find Unused Imports)是開源專案能很好的分析出不再使用的類,準確率非常高,唯一的問題是它處理不了動態庫和靜態庫裡提供的類,也處理不了C++的類别範本。

  • 作用

刪除不用的類。

  • 安裝

執行sudo gem install fui -n /usr/local/bin,筆者出現了下面的情況,說明gem sources中沒有資源。網上搜不到怎麼解決,折騰了筆者好久。

給iOS App減肥

執行gem sources能檢視已有source。

筆者之前裝Cocopods,只剩下一個https://gems.ruby-china.org/,國內連結沒有fui資源。

給iOS App減肥

gem sources -a https://rubygems.org/,新增進去。(順便提一句,安裝完想刪執行- gem sources -r https://rubygems.org/)

這時候執行gem sources應該能看到兩個。

給iOS App減肥

最後再次執行sudo gem install fui -n /usr/local/bin,終於搞定了。

給iOS App減肥

  • 使用

cd 到工程目錄下,執行fui find,筆者建議忽略pod檔案引用,執行fui -i $(pod路徑)。(可惜好像不能同時忽略多個路徑,筆者專案中還有手動拉的第三方庫)

然後等上一段時間,會列印出一個列表。由於不是100%靠譜,還得我們自己辨別,然後在Xcode中把檔案刪掉。(心大的可以執行fui delete,但筆者專案中有交換方法的類,是沒有被其他類引用的,所以還是自己辨別吧)

該圖就因為沒有忽略,顯示了一堆Pods,影響檢視。

給iOS App減肥

如果你發現列表中有些檔案找不到,說明在Finder中沒刪。

  • 效果

刪掉一點程式碼檔案,對包大小沒多大影響。但筆者認為這一步還是值得的,程式碼沒有之前那麼噁心了。

打包測試,大小為25.8M,較上一步縮小了0.3M。

靜態庫瘦身

原理:第三方靜態庫 支援的指令集 有交雜部分,刪掉多餘部分。

其可能導致模擬器無法使用,筆者就不折騰了,怕專案被玩壞了其他人砍我。解決方法可以看方法看iOS APP安裝包瘦身實踐。文章作者解決方法是生成兩個.a,精簡版用來發布,原版用來執行在模擬器上。

下面寫點註釋看看就算了。大家注意,這裡git回退都沒用。。。筆者要折騰一下了。不打算弄的就別測試了。

  • 過程

cd到專案目錄。

找到專案中的某個.a檔案。執行以下命令。

    lipo -info ***.a
複製程式碼

給iOS App減肥

i386,x86_64,是模擬器的指令集。armv7可以相容armv7s,armv7s也可以刪了,只保留armv7和arm64。

  // 分離出armv7.a
  lipo ***.a -thin armv7 -output ***-armv7.a
  // 分離出arm64.a
  lipo ***.a -thin arm64 -output ***-arm64.a
  // 將前二者合併為第三者
  lipo -create ***-armv7.a ***-arm64.a -output ***-device.a

複製程式碼
  • 效果

筆者止步了,但那篇文章的作者測試如是說。

給iOS App減肥

AppCode

付費工具。

  • 作用

找到沒使用的方法。事實上這個工具還有很多其他功能。

  • 使用

emmm...這個工具也不是100%可靠,筆者對專案中的方法不是特別熟悉,所以就不用了(還不是沒錢買)。


參考

相關文章