從目的導向來看,咱們是不會平白無故去作一件事情的,那咱們對應用瘦身的目的是爲了什麼?答案是:提升下載轉化率。什麼是下載轉化率?舉個栗子:你的應用大小是 18MB ,有100個潛在用戶想要去下載嘗試使用,結果有20個用戶嫌棄安裝包太大直接揚長而去,有20個用戶在等待下載的過程當中取消下載,最終只有60個用戶真正下載安裝,那麼應用的下載轉化率就是 60/100 = 60% 。html
簡單的小結即是:安裝包越小,用戶下載等待的時間越短,對手機存儲配置小的設備體驗愈佳,應用的下載轉化率也就越高。記得之前在騰訊大講堂聽微信大牛說過,微信第一個版本只有差很少 400KB ,瞬間膜拜。android
要對安裝包作瘦身,首先須要瞭解安裝包的組成結構,這裏簡單的梳理了一下組成各個部分及其做用:微信
其中,在安裝包中佔比較大的包括:dex文件、res文件夾、assets文件夾、lib文件夾以及resource.arsc文件。因此,接下來的瘦身優化就是讓這些文件變小,以此達到瘦身的目的。網絡
在 Android Studio 2.2.3 開始,就加入了瀏覽 APK 結構的功能,咱們直接把安裝包拖入 IDE ,就能夠直接瀏覽其組成和對應大小,這樣可以很方便的對比分析出每一步優化後的結果。架構
瞭解完 APK 的組成,咱們能夠開始着手優化的工做了,由於資源文件在 APK 中的佔比最高,因此優先從資源瘦身開始着手。框架
儘可能只保存一份圖片資源ide
開發目錄下會有個 drawable 或者 mipmap 目錄用於適配不一樣 dpi 的屏幕,下面是不一樣命名目錄所適配的 dpi 範圍工具
目前市面上絕大部分機型都處於 xxhdpi 的適配範圍,因此能夠考慮只保留 xxhdpi 目錄下一份圖片資源,具體保留哪一個目錄下的資源和保留幾份資源還得依照應用自身的實際機型分佈決定。佈局
使用 Drawable XML、Color、.9 PNG 代替 PNG性能
使用 JPG 代替 PNG
用 JPG 代替 PNG,因爲 JPG 沒有 Alpha 通道,因此文件更小,適用於不須要透明度的圖片能夠考慮。
謹慎使用 WebP 代替 PNG
因爲 WebP 效果好,且相同效果下, WebP 文件比 PNG 文件要小得多 ,因此,網上不少人說使用 WebP 代替 PNG,對此,我保持異議。理由以下:
有損編碼格式的音頻文件代替無損格式的音頻文件
從下面這篇官方文檔
https://developer.android.com/guide/topics/media/media-formats.html
能夠看到 Android 平臺支持的音視頻格式,下面列出有損和無損經常使用的格式(不要認爲有損編碼就是音質不好):
實際開發中須要使用音頻文件儘可能採用 MP三、Ogg 這種有損格式,儘可能不要用 WAV、PCM 這種無損音頻。
移除無用的資源
這裏的移除無用資源文件主要分爲兩個部分:不打包沒有使用的資源和刪除沒有使用的資源。
便可看到全部未使用的資源文件,建議按期清理掉這些沒用的文件,一方面能夠減少工程的大小,另外一方面太多的資源文件會致使打包後 resources.arsc 文件變得愈來愈大,公司有一項目 resources.arsc 文件已經達到 2-3 MB 的程度,有點驚人。
綜合以上幾點,就能夠有效的精簡咱們安裝包中的res文件夾、assets文件夾、resource.arsc文件大小,從而達到瘦身目的。
上一章節提到的是優化的思路,本章節整理在優化過程當中使用到的工具。
以上是我優化過程當中用到的以爲不錯的工具,有更好的推薦,歡迎補充。
另外,在對圖片作壓縮的時候,不要貪圖方便直接將整個資源目錄下的圖片一次性壓縮一趟。不少時候,前面作這個項目的人可能已經對一些資源文件作過壓縮處理,很容易致使二次壓縮而引發一些圖片失真。這裏我建議是,去到應用的資源目錄下將資源文件從大到小排序,定一個標準,如超過 20KB 的圖片要作壓縮處理,則將這些符合條件的圖片 Copy 一份出來作壓縮處理,處理後確保沒出現失真的狀況下再替換對應優化前的圖片資源。 音頻文件的處理,同理。
Native 庫瘦身主要是減少對 CPU 架構的支持,配置起來很簡單,在 build.gradle 使用 abiFilters 配置須要用到的 CPU 架構,並將不須要兼容的 so 文件從項目中移除便可。
根據咱們用戶的機型分佈,最終只保留了對 armeabi-v7a 支持。注意,這裏須要根據自家產品的實際狀況來決定。因爲以前對 CPU 的架構分佈不是很熟悉,感謝微信的張紹文、滬江的徐宜生以及虎牙的鄭曉濱幾位老司機給我科普了一發。
綜上所述,就能夠有效的精簡咱們安裝包中的 lib 文件夾大小,從而達到瘦身目的。也有一種作法是經過在 build.gradle 配置 include 來針對每一個 CPU 架構生成單獨的安裝包,雖然看起來很不錯,可是不少國內應用市場上架的時候並不支持這種每一個 CPU 配置一個包的作法,因此此作法較爲雞肋,不太建議去作,若是應用只上 Google Play ,那確實要比配置 abiFilters 好得多。
這裏能夠作的事情也是不少,主要以下:
綜上所述,就能夠有效的精簡咱們安裝包中的 dex 文件大小,從而達到瘦身目的。