1. 程式人生 > 資訊 >僅用 5 分鐘,程式設計師把一個超 400MB 的蘋果 iOS 應用安裝包削掉了 187MB

僅用 5 分鐘,程式設計師把一個超 400MB 的蘋果 iOS 應用安裝包削掉了 187MB

前些日子,一個手機 QQ 安裝包就要快 900MB 的事兒在網上吵得沸沸揚揚。

△最新安裝包又大了,已經 924MB

雖然最後大家發現它主要為了視訊通話特效多了一個虛幻引擎,但網友還是感嘆:

現在的 App 真的是越來越大了。

而就在最近,國外一位程式設計師也遇到了同樣的困惑。他乘的一班飛機由於沒有機上小電視,只能下載一個叫做“美聯航”的 App 來看視訊打發時間。

小哥一邊感嘆現在航空公司越來越雞賊:把成本都加到顧客頭上,一邊打開了應用商店,結果就很詫異:不就用來看個電影啥的嗎,一個 Netflix 都只有 101.5MB,這 App 怎麼是它的四倍

作為一名 iOS / Android 開發工程師,小哥決定不“坐以待斃”,看看它是否真的需要這麼大的空間。

原來可以省掉 187MB

說幹就幹,還在飛機上的小哥立刻用 ipatool 下載了這個 App 的二進位制檔案。

ipatool 是 GitHub 上標星 1.4k 的開源專案,是一個命令列工具,可以從 iOS 應用商店搜尋和下載應用程式的 ipa 檔案包,用這個包可以進行開發內容的一些檢查等功能。

下好以後需要把 ipa 副檔名改為 zip,解壓之後可以看到下面這樣的目錄:

可以發現 Frameworks 就佔了 414.8MB,小哥解釋:應用程式的主要記憶體來源就是 Frameworks,現在的最佳實踐都是把程式碼 push 到這裡面,還是挺正常的。

接下來進入該目錄:

以 UAL 開頭的框架是核心架構、NodeMobile 框架跟 NodeJS 功能有關、LocusLabsSDK 和 Mapbox 是供應地圖的,還有一些是負責身份驗證、客戶反饋的……

而視訊播放相關的框架相反其實佔記憶體並不多:

接著進入佔空間最大的 UALAppCore.framework。

經過層層探索,小哥終於在這裡鎖定了最大佔存的 UALAppCore

按照他的工作經驗,77MB 這個數字還是有點反常的,他打算用 nm 命令深入看看這個框架的符號表(symbol)檔案(nm 用於顯示二進位制目標檔案的符號表,格式如下)。

很快他就想起來,Swift 的符號需要剝離(strip,iOS 框架中的術語),Objective-C 則不需要。那就查 Swift 的,結果還真就發現:沒有一個 Swift 框架的符號被剝離過。而這些都沒有用,白白耗記憶體:

那接下來就簡單了,寫一個 bash 指令碼執行一下該框架就可以 OK:

最後,可以看到原始框架從 350MB 減到了 163M!

小哥表示,這一頓操作只花了不到 5 分鐘,沒想到可削減空間這麼大,整整省掉了 187MB。等於現在的安裝包只有原來的不到 60% 了。他猜測該安裝包仍有削減空間,不過這個結果他已經很滿意了。你,學廢了嗎?

“開發商才不關心呢”

就在小哥發出這個部落格之後,有網友評論道,還有很多安裝包其實都可以再縮減 15% 到 30% 甚至更高的空間,就比如 Gmail、Outlook 這些很常見的應用。

但似乎現在很多開發商不是很關心這個問題,他們只想趕緊不停更新應用:給不給使用者省掉這幾百 M 的流量都一樣賺錢,為啥還要費功夫呢?

有一位嵌入式工程師就表示:當我跟同事提起要注意這方面的優化時,他們總是給我一個茫然的眼神。

有網友認為:除非各應用商店開始管這事兒,開發商是不會做出改變的。就單說手機廠商就很樂意看到這一場面,記憶體不夠就可以去他們那買新手機了。

他還發現谷歌 Play Store 好像就不顯示應用程式大小。而一些銀行 App 在這個問題上尤其嚴重,因為他們知道你不會輕易換銀行。你怎麼看?

原博連結:

https://telkins.dev/posts/how-i-shaved-187mb-off-uniteds-airlines-439mb-ios-app/

評論來自:

https://news.ycombinator.com/item?id=30442529&p=2