天天看點

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

豐色 發自 凹非寺

量子位 | 公衆号 QbitAI

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

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

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

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

而就在最近,國外一位程式員也遇到了同樣的困惑。

他乘的一班飛機由于沒有機上小電視,隻能下載下傳一個叫做“美聯航”的App來看視訊打發時間。

小哥一邊感歎現在航空公司越來越雞賊:把成本都加到顧客頭上,一邊打開了應用商店,結果就很詫異:

不就用來看個電影啥的嗎,一個Netflix都隻有101.5MB,這App怎麼是它的四倍?

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

原來可以省掉187MB

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

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

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

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

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

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

接下來進入該目錄:

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

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

而視訊播放相關的架構相反其實占記憶體并不多:

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

接着進入占空間最大的UALAppCore.framework。

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

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

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

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

很快他就想起來,Swift的符号需要剝離(strip,iOS架構中的術語),Objective-C則不需要。

那就查Swift的,結果還真就發現:

沒有一個Swift架構的符号被剝離過。

而這些都沒有用,白白耗記憶體:

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

那接下來就簡單了,寫一個bash腳本運作一下該架構就可以OK:

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

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

程式員用5分鐘,把一個400多MB的蘋果安裝包削掉了187MB

小哥表示,這一頓操作隻花了不到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

繼續閱讀