Android Apk廋身完整版

Android Apk廋身完整總結(jié)

一.目的

  1. APK在安裝和更新之前都需要經(jīng)過網(wǎng)絡(luò)將其下載到手機(jī),如果APK越大消耗的流量就會越多,特別是對于使用移動網(wǎng)絡(luò)的用戶來講,消耗流量越多就代表需要花更多的錢去購買流量。同時(shí)一些第三方應(yīng)用商城也會對上傳的APK大小有限制,所以為了能夠讓產(chǎn)品能夠更受商城和用戶歡迎,APK瘦身是第一步,更小的APK標(biāo)示著更多地用戶愿意去下載和體驗(yàn)。
    二.問題排查

安裝包的組成

要對安裝包做瘦身,首先需要了解安裝包的組成結(jié)構(gòu),這里簡單的梳理了一下組成各個(gè)部分及其作用:


這里寫圖片描述

其中,在安裝包中占比較大的包括:dex文件、res文件夾、assets文件夾、lib文件夾以及resource.arsc文件。所以,接下來的瘦身優(yōu)化就是讓這些文件變小,以此達(dá)到瘦身的目的。

在 Android Studio 2.2.3 開始,就加入了瀏覽 APK 結(jié)構(gòu)的功能,我們直接把安裝包拖入 IDE ,就可以直接瀏覽其組成和對應(yīng)大小,這樣能夠很方便的對比分析出每一步優(yōu)化后的結(jié)果。


這里寫圖片描述

1.分析so庫49.2M打包成APK占用22.6M,占比67.6

2.dex11M打包占用4.3M,占比12.9

3.資源文件7M打包6M,占比17.9

上圖分析出so、dex、資源文件總占比98.4,著手從這三點(diǎn)進(jìn)行優(yōu)化。

三.優(yōu)化建議

  1. 資源瘦身

a) 盡量只保存一份圖片資源。開發(fā)目錄下會有個(gè)mipmap 目錄用于適配不同 dpi 的屏幕,下面是不同命名目錄所適配的 dpi 范圍


這里寫圖片描述

目前市面上絕大部分機(jī)型都處于 xxhdpi 的適配范圍,所以可以考慮只保留 xxhdpi 目錄下一份圖片資源,具體保留哪個(gè)目錄下的資源和保留幾份資源還得依照應(yīng)用自身的實(shí)際機(jī)型分布決定。

b) 使用 Drawable XML、Color、.9 PNG 代替 PNG

  • 一些情況下,我們可以考慮使用 Drawable XML 來代替 PNG,如:漸變的背景圖,用幾行 XML
    就可以描繪出來,何必使用幾十到上百K的 PNG 文件;
  • 用 Color 代替 PNG,如:純色的背景;
  • 從性能上看,比起使用圖片資源需要先將其生成 Bitmap 再傳到底層交由 GPU 渲染,用 Drawable XML 和 Color 則更加高效,它是直接將 Shape 信息傳到底層由 GPU 進(jìn)行渲染,CPU 和 內(nèi)存的占用會更少;
  • 用 .9 PNG 代替 PNG,場景很多,不舉例了;

c) 使用 JPG 代替 PNG

  • 用 JPG 代替 PNG,由于 JPG 沒有 Alpha 通道,所以文件更小,適用于不需要透明度的圖片可以考慮。

d) 可以使用shape作為背景

  • 很多點(diǎn)擊效果可能會使用到圖片,可以換成shape是實(shí)現(xiàn)。

e) 使用vector

  • 每個(gè)drawable都有相應(yīng)尺寸的圖標(biāo),占了不少大小,后來部分用vector代替了圖片。注意一點(diǎn),Button在xml里設(shè)置app:srcCompat居然無效,只能在代碼里設(shè)置。
button.setImageResource(R.drawable.ic_favorite_border_black_24dp)。

f) 謹(jǐn)慎使用 WebP 代替 PNG

由于 WebP 效果好,且相同效果下, WebP 文件比 PNG 文件要小得多。

  • WebP 在 Android 端,最低只支持 4.0 ,要兼容 4.0 以下的環(huán)境需要額外引入兼容庫,反而增大安裝包體積;

  • 解壓了 BAT 們的應(yīng)用,以及同類競品,基本沒有發(fā)現(xiàn)在資源文件中用 WebP 的;

g) 有損編碼格式的音頻文件代替無損格式的音頻文件

從下面這篇官方文檔
https://developer.android.com/guide/topics/media/media-formats.html

可以看到 Android 平臺支持的音視頻格式,下面列出有損和無損常用的格式(不要認(rèn)為有損編碼就是音質(zhì)很差):

  • 無損格式:WAV,PCM,ALS,ALAC,TAK,F(xiàn)LAC,APE,WavPack(WV)

  • 有損格式:MP3,AAC,WMA,Ogg Vorbis

實(shí)際開發(fā)中需要使用音頻文件盡量采用 MP3、Ogg 這種有損格式,盡量不要用 WAV、PCM 這種無損音頻。

h) 移除無用的資源

這里的移除無用資源文件主要分為兩個(gè)部分:不打包沒有使用的資源和刪除沒有使用的資源。

  • 不打包沒有使用的資源,在項(xiàng)目的 build.gradle 中配置 shrinkResources true 即可。
  • 開啟minifyEnabled混淆代碼,在app/build.gradle打開minifyEnabled為true
    這里寫圖片描述
  • 如果APP支持中文,可以配置resConfigs,只支持中文
    這里寫圖片描述
  • 刪除沒有使用的資源,通過 Android Studio 選中項(xiàng)目右鍵 => Analyze => Run Inspection by Name => 輸入 Unused resuroces


    這里寫圖片描述

i) 工具

  • TinyPNG:https://tinypng.com/ ,支持對 PNG/JPEG 文件做壓縮處理,效果不錯(cuò)。

  • pngquant:https://pngquant.org/ , 支持 PNG 壓縮,有時(shí)候 TinyPNG 處理過的圖片噪點(diǎn)會稍多,可以考慮用 pngquant 來處理。

  • ImageOptim:https://imageoptim.com/mac ,支持壓縮 PNG/JPEG/GIF ,而且效果顯著,可以看看這里 https://www.diycode.cc/topics/496 ,遺憾的是它只支持 Mac ,Windows 黨很難過。

  • mozjpeg:https://imageoptim.com/mozjpeg , 用于 PNG 轉(zhuǎn) JPEG、JPEG 壓縮,效果很好。

  • Adobe Audition CC:http://www.adobe.com/cn/products/audition.html ,Adobe 出品,支持對音頻的采樣率,分辨率和聲道數(shù)目做更改,以此達(dá)到裁剪音頻的目的(采樣率,分辨率和聲道數(shù)目是音頻文件格式的關(guān)鍵參數(shù),決定著音頻文件的大?。?。

  • 使用微信Android資源混淆工具(https://github.com/shwenzhang/AndResGuard
    AndResGuard打包命令行:gradlew resguardRelease,最終的混淆APK會生成在{App}/build/output/apk/AndResGuard目錄下。

j) 基于dex廋身

  • Facebook出品dex優(yōu)化框架ReDex,啟動速度提升 20% 以上,Dex 大小減小 25%,對于內(nèi)存較小的機(jī)型啟動速度的優(yōu)化效果尤其明顯,目前只支持Mac平臺、Linux平臺。

k) Native庫瘦身

  • Native 庫瘦身主要是減小對 CPU 架構(gòu)的支持,配置起來很簡單,在 build.gradle 使用 abiFilters 配置需要用到的 CPU 架構(gòu),并將不需要兼容的 so 文件從項(xiàng)目中移除即可。我這邊最終只保留了對 armeabi-v7a 支持。
    這里寫圖片描述
  • 綜上所述,就可以有效的精簡我們安裝包中的 lib 文件夾大小,從而達(dá)到瘦身目的。也有一種做法是通過在 build.gradle 配置 include 來針對每個(gè) CPU 架構(gòu)生成單獨(dú)的安裝包,雖然看起來很不錯(cuò),但是很多國內(nèi)應(yīng)用市場上架的時(shí)候并不支持這種每個(gè) CPU 配置一個(gè)包的做法,所以此做法較為雞肋,不太建議去做,如果應(yīng)用只上 Google Play ,那確實(shí)要比配置 abiFilters 好得多。

l) 代碼瘦身

這里可以做的事情也是很多,主要如下:

  • 移除廢棄功能的代碼,反正有AS ,刪了代碼隨時(shí)可以找回;

  • 移除重復(fù)的代碼,如:已經(jīng)有了的功能代碼,團(tuán)隊(duì)成員不知道自己又寫了一套,只能靠代碼 Review 解決了;

  • 移除功能重疊的框架,如:項(xiàng)目中有幾套網(wǎng)絡(luò)訪問框架 Volley、Retrofit 等,同樣只能靠代碼 Review 解決;

  • 移除無用的 dependencies 或者 jar 包;

  • 減小對 Support 兼容包的依賴,Support-V4 包非常大,項(xiàng)目引入無疑會增大 dex 文件的大小,Google 已經(jīng)意識到這個(gè)問題,所以 Support-V7 一開始就做了拆分,并且開始對 Support-V4 做拆分,雖然目前成果還不明顯,不過還是蠻值得期待的,特別是發(fā)現(xiàn)你少了 Support-V4 包后,可能就從2個(gè) dex 變成1個(gè) dex 了呢;

  • 插件化,一種懶加載思想的體現(xiàn),先讓用戶能夠安裝宿主包,對于一些功能模塊做插件化,在特定的時(shí)機(jī)再下載安裝;

參考:


 1. http://wuxiaolong.me/2017/03/19/ReduceAPKSize/?nsukey=52PBvRoPKrEz6vkSDHnnP1%2B%2FW5qJfm%2FOnA%2B1hvysYEEaCVd0IEgOQaWcv4Dc3HzKWh92wlOskWJ3ZXDPnHqhvsPU2d8ALMkpaJ54l5StPASm8bFZejhB80UIBcedUDia7GMYSEbOPnJ4FVE3OPCiVK5LinXoZRAR%2BsWA2J%2F04ipHrD5rVr1QLes9kY4snbaZ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文來自尚妝Android團(tuán)隊(duì)青峰發(fā)表于尚妝博客 APK瘦身探索 最近幾周一直在研究如何為APK瘦身,折騰了很久,...
    尚妝產(chǎn)品技術(shù)刊讀閱讀 1,887評論 1 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,802評論 25 709
  • 最近幾周一直在研究如何為APK瘦身,折騰了很久,是時(shí)候?qū)懫┛涂偨Y(jié)一下了,雖然已經(jīng)準(zhǔn)備了下周一要在客戶端周會分享用...
    風(fēng)清袖一閱讀 1,203評論 1 10
  • 本文會不定期更新,推薦watch下項(xiàng)目。如果喜歡請star,如果覺得有紕漏請?zhí)峤籭ssue,如果你有更好的點(diǎn)子可以...
    天之界線2010閱讀 18,841評論 19 153
  • 2017年還沒卸任 你看2018賊頭賊腦的的樣子 就要逼走它 差點(diǎn)忘記了 這年的春節(jié)我曾醉在紹興 . 小時(shí)候 一直...
    周延龍閱讀 280評論 0 2

友情鏈接更多精彩內(nèi)容