僅用 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