簡評: 應(yīng)用的大小也是用戶體驗的一個重要方面真椿,而減少 Android 應(yīng)用安裝包大小其實一點也不復(fù)雜。
對于移動應(yīng)用來說乎澄,應(yīng)用安裝包的大小當(dāng)然是越小越好突硝。特別是對于一些欠發(fā)達(dá)地區(qū),你不希望用戶因為手機(jī)「存儲空間不足」而卸載你的應(yīng)用置济。
本文就介紹了幾個小技巧來有效減少 apk 的大薪馇 :
首先,我們先用 Android Studio 提供的 APK Analyser 工具來分析下我們的 apk 文件:
可以看到占空間最多的主要是三個部分:classes.dex, res 和 resources.arsc浙于。
- classes.dex:包含有 Java 代碼的字節(jié)碼文件护盈。
- res:包含了資源文件,比如圖片羞酗、布局文件等等腐宋。
- resources.arsc:包含所有的值資源文件,如 strings, dimensions, styles, integers 等等檀轨。
classes.dex
classes.dex 文件的大小完全取決于程序中方法數(shù)的多少胸竞。在上面展示的例子中,包含了 4392 個類和 29897 個方法参萄。這個結(jié)果是默認(rèn)沒有使用 proguard 的卫枝。我們有兩個默認(rèn)的 proguard 文件可以使用:
從名字上就可以看出,proguard-android-optimize.txt 是更加激進(jìn)的 proguard 配置拧揽,包括和 proguard-android.txt 相同的 ProGuard 規(guī)則剃盾,但還包括其他在字節(jié)碼一級(方法內(nèi)和方法間)執(zhí)行分析的優(yōu)化腺占,以進(jìn)一步減小 APK 大小和幫助提高其運行速度淤袜。
可以像這樣來使用:
release {
//Enable the proguard
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), "proguard-rules.pro"
//Other parameters
debuggable false
jniDebuggable false
renderscriptDebuggable false
signingConfig playStoreConfig //Add your own signing config
pseudoLocalesEnabled false
zipAlignEnabled true
}
通過設(shè)置 minifyEnabled 屬性為 true,會告訴 proguard 刪除所有未使用的方法和指令衰伯,進(jìn)一步的減少 .dex 文件的大小铡羡。
方法數(shù)從 29897 減少到了 15168,大小從 3.1MB 減少到了 1.98 MB意鲸。
res
對于 res 文件夾烦周,通常占空間最大的就是圖片了。如果你的 Android Studio 為 2.3怎顾,并且項目的 minimum version 為 18 或以上读慎,應(yīng)該使用 webp 而不是 png 圖片。webp 圖片有更小的體積槐雾,圖片質(zhì)量還沒有什么損失夭委。
我們可以選中 drawable 和 mipmap 文件夾,右鍵后選擇 convert to webp募强,將圖片轉(zhuǎn)為 webp 格式株灸。
轉(zhuǎn)換的結(jié)果:
我們還可以在 build.gradle 中設(shè)置 shrinkResources 屬性為 true崇摄,這會在打包時刪除未使用的資源:
release{
//...
//...
shrinkResources true
//...
}
另外如果你的應(yīng)用不需要支持國際化,那么可以設(shè)置 resConfigs 為 "zh","en"慌烧,即只支持中英文:
defaultConfig {
//...
//...
//...
resConfigs "zh","en"
}
這么做是因為對于官方的 support library逐抑,默認(rèn)是支持國際化的,也就是包含了很多不同語言的資源文件屹蚊,我們就可以通過這樣設(shè)置來移除用不到的語言資源文件厕氨。
通過上面的設(shè)置,這個 App 的安裝包大小從 3.19MB 減少到了 1.89MB淑翼。當(dāng)然還有很多其他的減少 apk 大小的技巧腐巢,但這里介紹的技巧是完全可以作為你項目的默認(rèn)設(shè)置。
原文鏈接: How you can decrease application size by 60% (In only 5 minutes)?
推薦閱讀: Android Package Name vs. Application ID