Android App 瘦身总结 第一章 图片资源的优化处理
目錄
一、去除無用的資源
二、忽略占比極少的分辨率
三、優化圖片
四、使用更先進的圖片格式
(1)使用矢量圖
(2)使用webp圖片格式
五、總結
當一款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 trueshrinkResources trueproguardFiles 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中使用主要注意低版本兼容問題。
對于Android來說,4.2.1以上版本完全支持WebP,4.0到4.2.1版本只支持不透明的WebP,而更低版本則不支持WebP。 參考:https://developer.android.com/guide/appendix/media-formats.html
可以引入官方的兼容庫來兼容低版本,具體解決方案有興趣的可以自行搜索。
五、總結
資源問題是應用迭代過程中一定會產生的問題,但是不能任由其隨意擴張。
在開發小組內部甚至與設計人員一起制定一套規則來避免超大圖片的存在。同時在迭代過程中定期審查過期資源,就會形成一個良性循環。
實際上只要制定一套切實可行且具有有效監督的規則,在養成良好的習慣后,可以有效的避免上述問題的出現。即使業務迭代頻繁無法顧及,這部分也不會迅速增長。
總結
以上是生活随笔為你收集整理的Android App 瘦身总结 第一章 图片资源的优化处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android更新平台架构方案
- 下一篇: Android App 瘦身总结 第二章