Android APK瘦身實踐

現在APK動不動就是幾十兆,當用戶連接到2G和3G網路,或者按流量收費的設備是多麼的浪費,這篇文章介紹了如何對APK進行瘦身,幫助更多用戶毫不猶顧忌地下載你們的APP。

以我的個人APP【 微言 】實踐,未做任何處理,APK大小 11712 KB= 11.43 MB。

開啟minifyEnabled混淆代碼

在app/build.gradle打開minifyEnabled:

android {n buildTypes {n release {n minifyEnabled truen }n }n}n

在app/proguard-rules.pro編寫混淆規則,根據自己項目依賴的庫一一混淆,這裡就不提供具體混淆代碼了。

經過混淆,APK大小 10906 KB,效果很明顯,一下子瘦了0.78 MB。

開啟shrinkResources去除無用資源

在app/build.gradle打開shrinkResources:

android {n buildTypes {n release {n minifyEnabled truen shrinkResources truen }n }n}n

shrinkResources依賴於minifyEnabled,必須和minifyEnabled一起用,就是打開shrinkResources也必須打開minifyEnabled。

APK大小 10903 KB。

刪除未使用到xml和圖片

如何知道哪些xml和圖片未被使用到?使用Android Studio的Lint,步驟:點擊菜單欄 Analyze -> Run Inspection by Name -> unused resources -> Moudule 『app』 -> OK,這樣會搜出來哪些未被使用到未使用到xml和圖片,如下:

經過刪除,APK大小 10891 KB。

刪除未使用到代碼

同樣使用Android Studio的Lint,步驟:點擊菜單欄 Analyze -> Run Inspection by Name -> unused declaration -> Moudule 『app』 -> OK

經過一番清理,APK大小 10880 KB,才瘦了11KB,我以為能瘦很多,不過,平時必須保持良好的編碼習慣,哪些沒有使用到的代碼還是刪刪掉吧,不要想著以後還會用到。

重複操作上一步和這一步,會有意外的發現哦。

png圖片格式轉成jpg

將一些大圖的格式轉成jpg格式,將會有效減小圖片的體積,我的APP大圖不是很多。

更改格式後,APK大小 10762 KB。

使用vector

微言是我很早就已經做得app,一開始圖標都是圖片,且每個drawable都有相應尺寸的圖標,佔了不少大小,後來部分用vector代替了圖片。注意一點,Button在xml里設置app:srcCompat居然無效,只能在代碼里設置:

button.setImageResource(R.drawable.ic_favorite_border_black_24dp)。n

APK大小 10754 KB。

使用shape作為背景

很多點擊效果可能會使用到圖片,可以換成shape是實現,我查看了下,微言APP都是shape實現的,Good。

使用TinyPng

如果對png圖片格式轉成jpg,減小效果還不滿意,直接使用TinyPng智能有損壓縮技術,網址:TinyPNG – Compress PNG images while preserving transparency ,壓縮效果:

對於圖片資源很多的APP,APK瘦身效果不要太好。

APK大小 10341 KB。

配置resConfigs

如果APP支持中文,可以配置resConfigs,只支持中文

android {n defaultConfig {n ...n //語言資源,只支持中文n resConfigs "zh"n }n}n

APK大小 10243 KB。

使用微信Android資源混淆工具

微信AndResGuard是一個幫助你縮小APK大小的工具,詳情:Android資源混淆工具使用說明。

使用方法:

Project/build.gradle

buildscript {n repositories {n jcenter()n }n dependencies {n classpath com.tencent.mm:AndResGuard-gradle-plugin:1.2.0n }n}n

app/build.gradle

apply plugin: AndResGuardndef supportVersion = "25.0.0"nandroid {n ...n signingConfigs {n release {n storeFile file(keystore/android.keystore)n storePassword 123456n keyAlias android.keystoren keyPassword 123456n }n debug {n storeFile file(keystore/android.keystore)n storePassword 123456n keyAlias android.keystoren keyPassword 123456n }n }n buildTypes {n release {n ...n signingConfig signingConfigs.releasen }n }n}nnrepositories {n flatDir {n dirs aarsn }n}nnandResGuard {n // mappingFile = file("./resource_mapping.txt")n //mappingFile用於增量更新,保持本次混淆與上次混淆結果一致;n mappingFile = nulln //uss7zip為true時,useSign必須為true;n use7zip = truen //useSign為true時,需要配置signConfig;n useSign = truen //打開這個開關,會keep住所有資源的原始路徑,只混淆資源的名字;n keepRoot = falsen //whiteList添加在代碼內部需要動態獲取的資源id,不混淆這部分;n whiteList = [n // for your iconn "R.drawable.icon",n // for fabricn "R.string.com.crashlytics.*",n // for umeng updaten "R.string.umeng*",n "R.string.UM*",n "R.string.tb_*",n "R.layout.umeng*",n "R.layout.tb_*",n "R.drawable.umeng*",n "R.drawable.tb_*",n "R.anim.umeng*",n "R.color.umeng*",n "R.color.tb_*",n "R.style.*UM*",n "R.style.umeng*",n "R.id.umeng*",n // umeng share for sinan "R.drawable.sina*",n // for google-services.jsonn "R.string.google_app_id",n "R.string.gcm_defaultSenderId",n "R.string.default_web_client_id",n "R.string.ga_trackingId",n "R.string.firebase_database_url",n "R.string.google_api_key",n "R.string.google_crash_reporting_api_key",n // umeng share for facebookn "R.layout.*facebook*",n "R.id.*facebook*",n // umeng share for messagern "R.layout.*messager*",n "R.id.*messager*",n // umeng share commondn "R.id.progress_bar_parent",n "R.id.webView"n ]n //用來指定文件重打包時是否壓縮指定文件;n compressFilePattern = [n "*.png",n "*.jpg",n "*.jpeg",n "*.gif",n "resources.arsc"n ]n //sevenzip可使用artifacr或path,path指本地安裝的7za(7zip命令行工具)。n sevenzip {n artifact = com.tencent.mm:SevenZip:1.2.0n //path = "/usr/local/bin/7za"n }n}n

AndResGuard打包命令行:gradlew resguardRelease,最終的混淆APK會生成在{App}/build/output/apk/AndResGuard目錄下。

APK大小 10035 KB= 9.79 MB。

結尾

最終APK瘦身 11.43 - 9.79 = 1.63 MB,瘦身效果不是很明顯,說明:

1、我的這個APP畢竟不是商業項目,本身就不大;

2、我的編碼習慣可以,沒有多少冗餘代碼和無用資源,哈哈。

大家可以將你們的APK按照這些方法過一遍,看能瘦多少。

瘦身還有其他方法,生命不息,折騰不止。

參考

官方文檔Reduce APK Size

Reduce APK Size | Android Developers

Android APP終極瘦身指南

Android APP終極瘦身指南

AndResGuard資源混淆

AndResGuard資源混淆

推薦閱讀:

是否有可能欺騙Android識別一個apk包名的機制?
如何清除 Apk 中無用的資源文件?
如何判斷 Android 應用的 Apk 簽名是否一致?

TAG:Android | Android开发 | Apk |