1. 程式人生 > >Android App 瘦身總結 第一章 圖片資源的優化處理

Android App 瘦身總結 第一章 圖片資源的優化處理


當一款App經歷了大量的迭代後,apk包會越來越臃腫,這裡面會存在大量的情況。比如冗餘的程式碼、無用的資源、未合理化處理的圖片等等。

在經歷了瘋狂的迭代後,我和我的團隊發現再也不能忽視apk大小的問題了,apk的大小已經逼近70M,然而承載的業務量卻似乎沒有這麼多,於是我開始集中精力進行apk瘦身的工作。在一系列調查和研究後,成功讓我們兩款app瘦身回20M。

在給App瘦身過程中的有一些總結和體會,我會整理成幾個章節分別給大家介紹一下。文章主要是介紹問題的探索方向和解決思路,會介紹一些工具,但是工具的詳細使用需要大家自己去搜索(部分會給出連結),基本上很容易找到大量的部落格。

本篇部落格重點講解圖片資源相關問題

首先介紹一個Android studio自帶的工具Analyze Apk,選擇build -> analyze apk就可以很方便的看到apk各個部分的大小,同時還提供了比較的功能,可以比較兩個apk各個部分大小的不同。

大多數情況下,這部分是在一款app中佔用空間最多的地方。如果一直沒有關注這部分,資源非常混亂的話資原始檔甚至會佔去app一半以上的空間。主要從以下幾個方面著手:

一、去除無用的資源

在經歷了大量的迭代後,尤其頁面經過了大規模的修改,或者依賴了一些的開源專案,會導致apk中存在很多過時的、已經不再被使用的資源。

處理這些資源有很多方法, 比如使用lint,還可以在gradle中啟用shrinkResources來自動去除無用的資源,如下

android {
    ...

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

關於shrinkResources還有很多高階用法,有興趣的同學可以自行搜尋相關文件學習。

但是在使用shrinkResources時一定要注意,如果我們在程式碼中以路徑、檔名或者url的形式來使用資源,可能會導致有用的資源也被清除掉。這時我們可以用shrinkResources的keeping功能來手動保留這部分資源,防止被自動清除,但是前提是我們要非常熟悉專案的所有程式碼。

二、忽略佔比極少的解析度

由於Android裝置過於碎片話,所以google規範了一套規則,將不同解析度的圖片放在對於資料夾下,如drawable-xhdpi、drawable-hdpizhe等。

但是實際上我們不需要每種解析度型別都放一套資源,而且資源在不同解析度下可以自適應。比如只在xhdpi下有一張圖片,如果是480x860的解析度,會按比例自動壓縮這張圖片並使用。所以大部分圖片使用一到兩套就可以了。

目前主流的裝置的解析度是1k-2k的解析度,我們只需要xhdpi或xxhdpi版本的圖片即可。有特殊要求的圖片再新增不同的解析度版本

尤其注意xxxhdpi,這個解析度是4k級別的,所以這個解析度的圖片都很大。目前很少有手機達到這樣的解析度,而且由於畫素密度的問題,2K級別的圖片在4K螢幕上顯示也不會有特別明顯的差別。所以不建議使用這一解析度的圖片。

關於這部分也有一些工具可以使用,比如resConfigs,使用如下:

android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
        }
}

可以只打包某些解析度版本或某些語言版本的資源,前提是保證這些版本的資源包含了app所用到的所有資源,詳細使用可查閱相關文件。

三、優化圖片

有兩個原則:需要透明度的圖片使用PNG格式,不需要的一律使用JPG格式;使用JPG格式的圖片在保證質量的前提下進行壓縮。

這是因為JPG格式會損失透明度,如果是icon這種需要透明度的圖片轉成JPG格式背景色就會變成白色或者黑色。所以需要透明度的圖片我們需要使用PNG格式。

不需要透明度要使用JPG格式的原因是壓縮率會更大。

網上有很多工具可以壓縮圖片,比如tinypng,利用這些工具可以很輕鬆的壓縮圖片。

這裡還有另外兩個原則:儘量不要使用原圖;在保證質量的前提下壓縮。

現在有很多優秀的壓縮演算法可以極大的壓縮圖片大小,但是顯示的時候肉眼幾乎看不到差別,對於app來說絕大多數場景都沒有必要使用原圖。

不論什麼演算法,都會對圖片質量有一定的損失,一定要在保證圖片質量沒有太多損失的情況下進行壓縮。

四、使用更先進的圖片格式

對於圖片的壓縮和優化,工程師們一直再追求極致,各種更先進有效的演算法不停的出現。

(1)使用向量圖

在Android 5.0版本google加入來向量圖的支援Vector Asset。向量圖適用於簡單的圖示,不適用於複雜的圖片。

向量圖主要解決不同解析度下縮放導致圖示不清晰,使用向量圖就只需要一個檔案,不再需要不同解析度版本的圖片,而且向量圖檔案一般會比較小。

使用向量圖主要注意兩點:一是由於向量圖適用於簡單的圖示,二這些圖示本身也不會太大,所以使用向量圖對應用整體大小的減少比較有限;二是如果要相容低於5.0版本,需要引入support包。

(2)使用webp圖片格式

google推出的新的圖片格式—— WebP,可以獲得更大的壓縮率,使我們的圖片資源更小。在前端尤其是web上得到了很好的應用,在Android中使用主要注意低版本相容問題。

可以引入官方的相容庫來相容低版本,具體解決方案有興趣的可以自行搜尋。

五、總結

資源問題是應用迭代過程中一定會產生的問題,但是不能任由其隨意擴張。

在開發小組內部甚至與設計人員一起制定一套規則來避免超大圖片的存在。同時在迭代過程中定期審查過期資源,就會形成一個良性迴圈。

實際上只要制定一套切實可行且具有有效監督的規則,在養成良好的習慣後,可以有效的避免上述問題的出現。即使業務迭代頻繁無法顧及,這部分也不會迅速增長。