[譯] 我是如何作到在 5 分鐘以內將應用大小減小 60% 的

我是如何作到在 5 分鐘以內將應用大小減小 60% 的

移動設備的資源老是有限的。有限的電量,有限的存儲,有限的處理能力,有限的內存,有限的網絡帶寬……不管你面對的是 Android 仍是 iOS,這都是真理。javascript

在前幾個月,我在開發一個安卓應用 Anti-Theft Screen Lock。當有人嘗試用錯誤的密碼解鎖設備時,這個應用會經過前置攝像頭拍照並播放警示音。若是你想了解更多,這裏有 Play 商店的頁面:html

Anti-Theft Screen Lock - Android Apps on Google Play前端

在這兒我會教你一些我用來減少應用體積的技巧。這些技巧都簡單且易用,會在如今或未來爲你提供一些幫助。java


越小越好

做爲一個開發者咱們老是更關心應用的性能,設計和用戶體驗。可是,大多數開發者都忘了(或低估)一件事:應用體積。若是你但願你的應用能吸引大量用戶,這是很是核心的一點。react

市場上大概有 11000 種安卓機型,而其中大部分都是低端機,有限的存儲(1GB 到 8GB),甚至用的仍是 2G 或者 3G 網絡。這些設備在印度,巴其爾等非洲發展中國家佔有大量市場,你能夠在這些地方得到大量的用戶。android

讓你的應用大小保持最佳變得尤爲重要。你的應用體積越小,你的用戶就有更多的空間來存儲他們的視頻和圖片。說實話,你確定不但願用戶由於「存儲空間不足」的提示刪除你的應用。ios

若是用戶的存儲空間不夠的話,他們會卸載你的應用。
這些發展中國家用戶使用的依然是速度有限的 2G/3G 網。因此,若是你的應用體積太大,將會須要更多的時間來下載(更可能的狀況時用戶根本不會去下載)。一樣的,大多數用戶流量有限,用戶下載的每一個字節都是在花錢。git

因此,很明顯了,應用程序界的真理就是:github

越小越好web


使用 APK Analyser 分解你的 APK

Android Studio 提供了一個有用的工具:APK Analyser。APK Analyser 將會拆解你的應用並讓你知道 .apk 文件中的那個部分佔據了大量空間。讓咱們看一下 Anti-Theft 在沒有通過優化以前的截圖。

從 Apk Analyser 的輸出來看,應用的原大小是 3.1MB。通過 Play 商店的壓縮,大體是 2.5MB。

從截圖中能夠看出主要有 3 個文件夾佔據了應用的大多數空間。

  • classes.dex —— 這是 dex 文件,包含了全部會運行在你的 DVM 或 ART 裏的字節碼文件。
  • res —— 這個文件夾包含了全部在 res 文件夾下的文件。大部分狀況下它包含全部圖片,圖標和源文件,菜單文件和佈局。

  • resources.arsc —— 這個文件包含了全部 value 資源。這個文件包含了你 value 目錄下的全部數據。包括 strings、dimensions、styles、intergers、ids 等等。


因此,如今你知道 APK 是怎麼組成的了。讓咱們接着看看該怎麼一塊塊的優化它以減少應用體積。

減少 classes.dex

classes.dex 包含了全部 Java 代碼。當你編譯你的應用時,gradle 會將你的全部模塊裏的 .class 文件轉換成 .dex 文件並將這些文件合成一個 classes.dex 文件。

若是你很好奇,編譯的過程是怎樣的,看個人另外一篇博客:The Jack and Jill: Should you use in your next Android Application?

單個的 classes.dex 文件能夠容納大約 64K 方法。若是你達到了這個限制,你必需要在你的工程中啓用 multidexing。這將會建立另外一個 classes1.dex 文件去存儲剩下的方法。因此 classes.dex 文件數目由你的方法數而定。

你能夠看到如今的 「Anti-Theft Screen Lock」 包含 4392 個類和 29897 個方法。這個結果是沒有通過混淆的。你有兩個默認的混淆文件。

  • proguard-android-optimize.txt
  • proguard-android.txt

就像文件名寫的那樣,「proguard-android-optimize.txt」是更積極的混淆選項。咱們將這個做爲默認的混淆配置。你能夠在 /app 目錄下的 proguard-rules.pro 裏添加自定義的混淆配置。

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
}複製代碼

經過設置 minifyEnabled 爲 true,混淆將會移除全部未使用的方法、指令以減少 classes.dex 文件。

這是啓用了 minify 以後的 APK。

你能夠看到在爲每一個模塊啓用了混淆以後咱們的 classes.dex 大小減少了幾乎 50%。同時你能夠看到方法數從 29897 降到了 15168(幾乎 50%)。恭喜……🎊🎉

體積從 3.1MB 降到了 1.98MB。(縮小約 50%)


減少 res:

下一大塊就是 res 文件夾,它包括了全部的圖片,raw 文件和 XML。你不能添加/刪除/修改你的 XML,由於它們包含了你的佈局。可是咱們能夠減少圖片文件。

  • shrinkResources」 屬性將會移除全部在工程中沒有用到的資源。在 build.gradle 中像下面這樣啓用它:
release{
  //...
  //...
  shrinkResources true
  //...
}複製代碼
  • resConfigs」 屬性將會在構建過程當中移除全部本地化資源。app 「Anti-Theft Screen Lock」 只須要支持英語。而不少的支持庫均可能有其它語言的本地化文件夾。這些是我不須要的。因此,添加下面的這些代碼讓應用只支持英語。
defaultConfig {
    //...
    //...
    //...

    //strip other than english resources
    resConfigs "en"
}複製代碼
  • 若是你在用 Android Studio 2.3,而且你的應用的最低支持版本大於 18,你可使用 webp 替代 png。webp 圖片比 png 體積更小但質量同樣。並且 Android 支持 webp。因此你能夠在 ImageView 中像加載其它光柵圖片同樣加載 webp 圖片。這不須要改變你的佈局。

你能夠在工程選擇 drawable 和 mipmap 文件夾,右擊並選擇 convert to webp。這將會打開下面這樣的配置彈框。

點擊 ok,將會將全部 png 圖片轉成 webp。若是 webp 圖片比 png 更大,Android Studio 將會自動跳過這個文件。

讓咱們看下最終效果:

喔!!!res 文件夾從 710KB 降到了 597KB。

體積減少了 105KB。(下降了 16%)

你也能夠將圖片轉爲矢量圖。可是這樣你須要對它的向後兼容性進行一些處理。若是你想了解更多 vector 的相關知識,看看 Chris Banes 的這篇博客


TL;DR:

  • 經過在你的 release build type 中加上下面這些代碼啓用混淆。
  • 啓用 shrinkResources。
  • 經過在 「resConfigs」 裏添加須要的資源名移除全部不須要的本地化資源。
  • 將全部圖片轉爲 webp 或者矢量圖。

總結:

經過使用上面這些簡單的技巧我將應用體積從 3.19MB 降至了 1.89MB。

這些只是最簡單的方式,還有不少減少應用體積的方法。可是,你應該始終使用上面這些簡單的方法來保證已經儘量的減少了應用體積。

你能夠在這兒學習更多的技巧。

記住:越小越好。😉


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃

相關文章
相關標籤/搜索