Android APK瘦身經(jīng)驗總結(jié)
寫在前面:
無論手機的內(nèi)存有多大, 我們自然都希望一個應(yīng)用的安裝包能越小越好,更小的APK標(biāo)示著更多地用戶愿意去下載和體驗。本文借鑒張明云、胡凱等老師的博客,對常規(guī)的APK瘦身方法進(jìn)行歸納和總結(jié)并附上資料的鏈接。如果能對你有所幫助,那真的再好不過了。
零:瘦身的指標(biāo)
是什么造成了APK越來越大呢? 先來看一張解壓之后的APK的目錄圖:
應(yīng)該從哪些方面入手對APK進(jìn)行瘦身呢?
冗余的代碼,不必要的jar包;
未使用的靜態(tài)資源,libs;
屏幕適配時,資源的重復(fù)使用;
錯誤地預(yù)置數(shù)據(jù)
native code
未進(jìn)行圖片資源的優(yōu)化與壓縮(重點)
如果看到這里感覺還沒形成相應(yīng)的概念,沒關(guān)系,接下來對這些指標(biāo)進(jìn)行逐個分析,相信你很快就能明了。
一:剔除冗余代碼
-
Proguard
Proguard是編譯時對java代碼進(jìn)行壓縮,混淆,優(yōu)化,預(yù)編譯等操作的集成化工具。Proguard
會遍歷你的所有代碼然后找出無用處的代碼。所有這些不可達(dá)(或者不需要)的代碼都會在生成最終的apk文件之前被清除掉。Proguard
也會重命名你的類屬性,類和接口,然整個代碼盡可能地保持輕量級水平。有關(guān)Proguard的配置和使用,網(wǎng)上有很多資料,以上兩個是我認(rèn)為還不錯的,通過Proguard工具通常能使你的APK減小200K左右。
-
AndResGuard
AndResGuard是微信客戶端高級工程師 shwen 的開源項目,可以做到直接處理安裝包.
不依賴源碼,不依賴編譯過程,僅僅輸入一個安裝包,得到一個混淆包。AndResGuard的功能還是非常強大,騰訊多個產(chǎn)品都使用到了它,具體的源碼和使用方法移步到Github上學(xué)習(xí),已開源。
二:剔除無用的資源
-
Lint
Proguard它只會對代碼進(jìn)行分析,對比如圖片之類的資源就束手無策了,不過這個時候Lint就可以發(fā)揮非常大的作用了。
Lint 一個靜態(tài)的代碼分析器,你只需通過調(diào)用 ./gradlew
lint這個簡單地命令它就能幫你檢查所有無用的資源文件。它在檢測完之后會提供一份詳細(xì)的資源文件清單,并將無用的資源列在“UnusedResources:Unused resources” 區(qū)域之下。只要你不通過反射來反問這些無用資源,你就可以放心地移除這些文件了。
值得注意的是,Lint 會分析資源文件(比如 /res 文件夾下面的文件) ,但是會跳過 assets 文件 ( /assets 文件夾下面的文件)。事實上 assets 文件是可以通過它們的文件名直接訪問的,而不需要通過Java引用或者XML引用。因此,Lint 也不能判定某個 asset 文件在項目中是否有用。這全取決于開發(fā)者對這個文件夾的維護(hù)了。所以你要去人工排查一下assets文件夾下有沒有無用的資源,如果有就移除它。
三:對資源文件進(jìn)行取舍
其實這步操作更多的針對是屏幕適配的知識,曾經(jīng)聽說一個開發(fā)者對Android所有屏幕密度下的文件夾都提供了一套圖片資源(ldpi, mdpi, tvdpi, hdpi, xhdpi, xxhdpi and xxxhdpi),這是非常不理智的行為,雖然Android支持這么多的屏幕密度,但是不代表你需要為每一個都提供一套資源,下面對資源取舍的一些建議:
盡量使用一套圖片資源,對于一些圖片在不同分辨率手機上變現(xiàn)差異過大的情況,再考慮去相應(yīng)文件夾下放入這個特定的圖片
使用一套圖、一套布局,多套dimens.xml文件,在使用最小資源的情況下搞定多分辨率適配
盡量重用圖片,例如對稱的圖片,只需要提供一張,另外一張圖片可以通過代碼旋轉(zhuǎn)的方式實現(xiàn)
去除無用的庫,功能上重復(fù)的庫,使用更輕量級的庫,比如你僅僅是想做一些網(wǎng)絡(luò)請求,使用volley即可,沒必要去引入xutils,這就要根據(jù)你項目的情況去具體分析了。
錯誤的預(yù)置一些圖片資源,有一些沒必要跟隨程序展示的圖片就在需要加載它的時候再加載它,將程序與資源盡可能的分離。
四:對圖片資源進(jìn)行優(yōu)化
好了終于來到本篇博客的重頭戲,其實上對一個APK大小的優(yōu)化更多的就是對圖片資源的一些處理技巧,我們應(yīng)該在不降低圖片的顯示效果、保證APK顯示效果的前提下壓縮圖片文件的大小。
-
tinypng
據(jù)官網(wǎng)介紹,它的原理是通過合并圖片中相似的顏色,通過將 24 位的 PNG 圖片壓縮成小得多的 8 位色值的圖片,并且去掉了圖片中不必要的
metadata(元數(shù)據(jù),從 Photoshop 等工具中導(dǎo)出的圖片都會帶有此類信息),這種方式幾乎能完美支持原圖片的透明度。拖拽圖片即可使用,壓縮率甚至達(dá)到了70%,感嘆它強大的同時,有精力的同學(xué)可以去研究研究它的算法
壓縮率達(dá)到了70%
webP
WEBP 是google推出的意圖改變web圖片JPG、PNG、GIF三分天下局勢的一種圖片格式。它不僅支持無損或有損壓縮、alpha通道,還支持動畫演示。在同畫質(zhì)的情況下,webp格式圖片占用體積相較于jpg圖片大約減少40%,相較于無損png圖片大約減少30%。具不完全統(tǒng)計,互聯(lián)網(wǎng)流量中60%都產(chǎn)生于圖片,如果能用上webp格式,網(wǎng)站的訪問速度將會大大提升。
不過android 4.0+才原生支持webp, 但是我們的app是兼容2.3+,所以4.0以下的設(shè)備將無法看到圖片。但是引入兼容的SO文件,APK也會變大,這時候自己做個取舍吧!
寫在最后:
其實還有一些給APK瘦身的技巧和細(xì)節(jié),并沒有一一列舉出,而且有些新的優(yōu)化技巧涉及到一些兼容性的問題,大家多查閱資料就能明白了。