- 原文地址:How you can decrease application size by 60% (In only 5 minutes)?
- 原文做者:本文已獲做者 Keval Patel 受權
- 譯文出自:掘金翻譯計劃
- 譯者:jifaxu
- 校對者:gaozp, ZiXYu
移動設備的資源老是有限的。有限的電量,有限的存儲,有限的處理能力,有限的內存,有限的網絡帶寬……不管你面對的是 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
Android Studio 提供了一個有用的工具:APK Analyser。APK Analyser 將會拆解你的應用並讓你知道 .apk 文件中的那個部分佔據了大量空間。讓咱們看一下 Anti-Theft 在沒有通過優化以前的截圖。
從 Apk Analyser 的輸出來看,應用的原大小是 3.1MB。通過 Play 商店的壓縮,大體是 2.5MB。
從截圖中能夠看出主要有 3 個文件夾佔據了應用的大多數空間。
因此,如今你知道 APK 是怎麼組成的了。讓咱們接着看看該怎麼一塊塊的優化它以減少應用體積。
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」是更積極的混淆選項。咱們將這個做爲默認的混淆配置。你能夠在 /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 文件夾,它包括了全部的圖片,raw 文件和 XML。你不能添加/刪除/修改你的 XML,由於它們包含了你的佈局。可是咱們能夠減少圖片文件。
release{
//...
//...
shrinkResources true
//...
}複製代碼
defaultConfig {
//...
//...
//...
//strip other than english resources
resConfigs "en"
}複製代碼
你能夠在工程選擇 drawable 和 mipmap 文件夾,右擊並選擇 convert to webp。這將會打開下面這樣的配置彈框。
點擊 ok,將會將全部 png 圖片轉成 webp。若是 webp 圖片比 png 更大,Android Studio 將會自動跳過這個文件。
讓咱們看下最終效果:
喔!!!res 文件夾從 710KB 降到了 597KB。
體積減少了 105KB。(下降了 16%)
你也能夠將圖片轉爲矢量圖。可是這樣你須要對它的向後兼容性進行一些處理。若是你想了解更多 vector 的相關知識,看看 Chris Banes 的這篇博客。
經過使用上面這些簡單的技巧我將應用體積從 3.19MB 降至了 1.89MB。
這些只是最簡單的方式,還有不少減少應用體積的方法。可是,你應該始終使用上面這些簡單的方法來保證已經儘量的減少了應用體積。
你能夠在這兒學習更多的技巧。
記住:越小越好。😉
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃。