如何優化Android/iOS應用安裝包大小?

Android/iOS應用的安裝包大小也是一個重要的影響用戶體驗的點。

大家在開發Android/iOS應用(包括遊戲應用)的時候,如何從方方面面將應用的安裝包大小優化到極致?


樓上說的都不錯;補充兩點:

  1. 插件化,基於這樣一個原理:對於每一個用戶而言,他使用的只有你程序的一部分功能,模塊化讓他選擇的話;可以大幅減小體積。360手機衛士從19.8M精簡到8.0M就是佐證。
  2. 資源混淆;同代碼混淆。

--------------

補充一點,儘可能少的使用圖片資源;追求極致的話,除非必要全部代碼由實現。


關於Android文件的優化,主要有這麼幾點:

一、res文件夾大小優化

1,使用壓縮工具tinypng(https://tinypng.com/)對圖片進行壓縮

2,圖片使用WebP(https://developers.google.com/speed/webp/)的格式

3,只使用一套圖片,選擇高解析度的

4,使用tintcolor(android - Change drawable color programmatically)實現按鈕反選效果

二、lib文件夾大小的優化

1,so文件,可以只保留arm架構的文件

2,混淆代碼,可以減少一點classs.dex文件的大小

3,樓上有說可以對so文件進行壓縮,具體參見樓上【@唐宇辰】

三、assets文件夾大小的優化

1,音頻文件最好使用有損壓縮的格式,比如採用opus、mp3等格式,但是最好不要使用無損壓縮的音樂格式

2,對ttf字體文件壓縮,可以採用FontCreator工具只提取出你需要的文字。比如在做日期顯示時,其實只需要數字字體,但是使用原有的字體庫可能需要10MB大小,如果只是把你需要的字體提取出來生成的字體文件只有10KB。

詳情請參照這個地址:Arsenals/weight-reduction-android · GitHub,歡迎您的批評與指正,謝謝。


  1. 代碼復用,禁止拷貝代碼,共用代碼下沉為底層組件

  2. 少用多行宏,多用函數封裝

  3. 刪除無用代碼

  4. 不要隨便依賴第三方類庫,可能僅僅用到1個庫中的幾個方法,就引入巨形庫

  5. 刪除重複的圖片、資源文件,並且圖片儘可能的小、簡單,以支持resizable,如果資源過大,就放在伺服器上,按需下載

  6. Debug版本代碼不要提交到Release版本中

  7. 引導產品、交互、設計,使用同一種方式開發,以復用代碼

  8. 數據驅動,如通用的列表、詳情、表單,後台配置模板,客戶端僅開發一套通用機制即可

  9. 終極大法:砍需求

以上是iOS安裝包瘦身方法,大部分也適用Android


幾個方面:

  • 圖片素材壓縮:TinyPNG – Compress PNG images while preserving transparency TinyPNG 是一個支持壓縮png和jpg圖片格式的網站,通過其獨特的演算法(通過一種叫「量化」的技術,把原本png文件的24位真彩色壓縮為8位的索引演示,是一 種矢量壓縮方法,把顏色值用數值123等代替。)可以實現在無損壓縮的情況下圖片文件大小縮小到原來的30%-50%。

  • 無用文件清理:使用lint工具清理文件
  • 使用三方庫的時候,考慮是否值得:是否所有功能都用到了,引入庫帶來的體積增長能否接受。也可以將某些庫的功能裁剪掉,只保留需要的。我們團隊經常這樣做,能將三方庫帶來的體積影響降到最小。
  • so文件的裁剪:只保留arm結構的so文件
  • so文件的壓縮:一個比較偏門的方法,應用so文件太多太大也可以考慮這個工具,我已經試過可行的。 liyuming1978/NativeLibCompression · GitHub,可以用於so文件較大的apk大小的壓縮,其原理是將所有so文件進行壓縮,在安裝首次運行時進行解壓。據作者介紹,MoboPlayer使用了這個工具,將應用從20M壓縮到了10M。要是有興趣我可以細說一下這個工具。

上面是一些方法,此外在開發時還有一些可以注意的點,來縮小體積:

  • 某些大圖可以由小圖重複得來,能減少一定體積,跟web上的切圖一個道理
  • 能用shape來製作的效果就不用圖片,舉個例子,我們要實現一個彈窗:
    • iOS直接將整個圖拿來使用,還有圖片變形的不足:

    • 我是只使用了這兩張素材,漸變圓角背景是畫出來的。由於主體圖片不小,所以和iOS大小差距不明顯,如果主體很小呢,那體積上的差距就明顯了。而且背景可以隨著屏幕大小伸縮而主體圖片不變,不會變形:

差不多就這些,還要壓縮體積的話就考慮不要放到apk里,而是網路上吧。


Android

1.代碼方面

實現功能模塊的邏輯簡化

移除無用的依賴庫

2.proguard

代碼混淆,優化壓縮,不過 需要進行配置

3.Lint

./gradlew lint檢查無用文件

將無用的資源列在「UnusedResources: Unused resources」

4.Android 支持這麼多的屏幕密度並不意味著你需要為每一個屏幕密度提供相應的資源文件。

在 drawable-nodpi 文件夾裡面維持一個文件也能節省空間。當然前提是你覺得對這個文件進行相應地縮放之後呈現的效果你能接受或者這個文件出現的幾率很少

5.開發中,依賴的庫裡面並不是所有的資源文件你都會用到

從Android Gradle Plugin 0.7 開始,你可以配置你的app的build系統。這主要是通過配置resConfig 和 resConfigs 以及默認的配置選項

6.Aapt(Android Asset Packaging Tool)就內置了 保真圖像壓縮演算法,通過Google查找相應的優化工具,比如 pngquant, ImageAlpha 和 ImageOptim 等。你可以從中選擇一個適合你的工具。也可以使用.9 圖

還有一種只在Android平台上存在的圖片文件也可以優化,它就是 9-patches。

還有可以在一張圖上合成多個圖標,不同的圖標使用代碼截取,cliprect , clipdrawable

7.限制CPU架構

在當前的Android 生態系統中,讓你的app支持 armabi 和 x86 架構就夠了,也可以了解native 代碼

8.Android 提供了幾個工具為一個asset文件重新著色,在Android L中你可以使用 android:tint 和 android:tintMode 來達到效果,在老版本中則可以使用 ColorFilter 。翻轉圖片RotateDrawable

9.Java 代碼渲染圖像也能獲得不錯的效果。比如逐幀動畫就是一個很好的例子

以上有很多都是引用網上的,希望能夠共同學習,謝謝大家提供的內容,如果介意,可以聯繫


說一種新思路,將android中的R.class刪除掉,引用到的地方用常量替換。mogujie/ThinRPlugin


推薦閱讀:

一個Android偏底層開發人員,對發展很迷茫,我該怎麼發展?
友盟推送裡面的Alias怎麼用?可以理解成賬號嗎?
Android QQ 和釘釘冷啟動如何做到秒開的?
國內有什麼類似App Annie的網站,可以監控國內安卓渠道的排名情況?
Linux下交叉編譯出的so庫依賴libstdc++.so.6的問題?

TAG:iOS開發 | Android開發 | Apk | 安裝包 |