Best Practices to Slim Down Your App Size (Google I/O ’17)

整理一下看完 Best Practices to Slim Down Your App Size(Google I/O ’17)的心得。

動機

當手機空間不夠用時,大多數的使用者會先將佔最多容量的App給刪除,要讓你的App免於被刪除的窘境,最好的方式就是降低App的大小。

兩種App Size

Download Size

使用者在Play Store上看到的檔案大小,多數使用者看到檔案太大時,會取消安裝。

當Download Size大於100MB,高達20%的取消下載率

Installed Size

在手機上實際的大小(在設定應用程式頁面看到的大小),有時候可能是 Download Size的兩到三倍大。

100MB以上的App,解除安裝率為15MB的App的8倍

我們可以從Android Studio,Build → Analyze APK查看APK詳細的使用大小


降低APK Size的方式

Proguard

Java的一套優化程式碼工具,主要提供三個功能

  • 優化程式碼
  • 混淆程式碼
  • 移除未使用的程式碼

將程式碼以更簡短的方式去編譯,大幅地減少Dex檔的大小。

只要在Gradle做以下設定

android {
buildTypes {
release {
minifyEnabled true
}
}
}

可以看到,使用之後classes.dex明顯變小了

未使用Proguard vs. 使用 Proguard比較圖

Resource Shrinking

會將用不到的Resource會自動被清除,使用方法如下:

android {
buildTypes {
release {
shrinkResources true
}
}
}

Support Only Specific Densities

  1. 將佔很少部分的裝置尺寸給移除
  2. 只提供xxhdpi尺寸,讓Android自動去縮放圖片
  3. 產生多種尺寸的APK(參照以下設定)
android {
splits {
density {
enable true
}
}
}

Use Vector Drawables

向量圖的特性是:One asset, all densities、不失真、檔案較小,向量圖會根據裝置解析度的不同,產生最佳解析度的圖片,因此會增加CPU及RAM的使用率,在小尺寸的裝置上效能可能會是一個問題。

android {
defaultConfig {
vectorDrawables.useSupportLibrary true
}
}

Resources.arsc

resConfigs可以讓我們選擇哪些資源要被Build進APK,沒有列的就不會被Build進APK了。

android {
defaultConfig {
...
resConfigs "en"
}
}

AppCompat / Google Play Services 這些常見的library,通常支援多國語系,當我們使用他們時,string resource會被引入許多用不到的字串翻譯。

其他沒用到的話,可以只留default!

Downloadable fonts

若不是使用預設字體,其他特殊字體必須包在APK中,因而增加APK的Size,在Android O提供了一個新的東西Font Provider — — 所有的字體皆由他管理,需要字體時就找他!Android3.0可以選擇Downloadable fonts。

AAPT2

  • Version collapsing:根據最低支援版本,整合Resource
  • Resource deduplication:自動刪除重複的字串

在Android3.0穩定版會預設啟用aapt功能,目前若要使用的話,只要在gradle.properties做以下設定即可啟用aapt2功能

android.enableAapt2 = true