天天看點

[譯] 我是如何做到在 5 分鐘之内将應用大小減少 60% 的我是如何做到在 5 分鐘之内将應用大小減少 60% 的移動裝置的資源總是有限的。有限的電量,有限的存儲,有限的處理能力,有限的記憶體,有限的網絡帶寬……無論你面對的是 Android 還是 iOS,這都是真理。

<b>本文講的是[譯] 我是如何做到在 5 分鐘之内将應用大小減少 60% 的,</b>

<a href="https://link.juejin.im/?target=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.antitheftlock" target="_blank">Anti-Theft Screen Lock - Android Apps on Google Play</a>

在這兒我會教你一些我用來減小應用體積的技巧。這些技巧都簡單且易用,會在現在或将來為你提供一些幫助。

作為一個開發者我們總是更關心應用的性能,設計和使用者體驗。但是,大多數開發者都忘了(或低估)一件事:應用體積。如果你希望你的應用能吸引大量使用者,這是非常核心的一點。

市場上大概有 11000 種安卓機型,而其中大部分都是低端機,有限的存儲(1GB 到 8GB),甚至用的還是 2G 或者 3G 網絡。這些裝置在印度,巴其爾等非洲開發中國家占有大量市場,你可以在這些地方獲得大量的使用者。

讓你的應用大小保持最佳變得尤其重要。你的應用體積越小,你的使用者就有更多的空間來存儲他們的視訊和圖檔。說實話,你肯定不希望使用者因為“存儲空間不足”的提示删除你的應用。

如果使用者的存儲空間不夠的話,他們會解除安裝你的應用。

這些開發中國家使用者使用的依然是速度有限的 2G/3G 網。是以,如果你的應用體積太大,将會需要更多的時間來下載下傳(更可能的情況時使用者根本不會去下載下傳)。同樣的,大多數使用者流量有限,使用者下載下傳的每個位元組都是在花錢。

是以,很明顯了,應用程式界的真理就是:

越小越好

從 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 包含了所有 Java 代碼。當你編譯你的應用時,gradle 會将你的所有子產品裡的 .class 檔案轉換成 .dex 檔案并将這些檔案合成一個 classes.dex 檔案。

你可以看到現在的 “Anti-Theft Screen Lock” 包含 4392 個類和 29897 個方法。這個結果是沒有經過混淆的。你有兩個預設的混淆檔案。

proguard-android-optimize.txt

proguard-android.txt

就像檔案名寫的那樣,“proguard-android-optimize.txt”是更積極的混淆選項。我們将這個作為預設的混淆配置。你可以在 /app 目錄下的 proguard-rules.pro 裡添加自定義的混淆配置。

通過設定 minifyEnabled 為 true,混淆将會移除所有未使用的方法、指令以減小 classes.dex 檔案。

這是啟用了 minify 之後的 APK。

你可以看到在為每個子產品啟用了混淆之後我們的 classes.dex 大小減小了幾乎 50%。同時你可以看到方法數從 29897 降到了 15168(幾乎 50%)。恭喜……

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

下一大塊就是 res 檔案夾,它包括了所有的圖檔,raw 檔案和 XML。你不能添加/删除/修改你的 XML,因為它們包含了你的布局。但是我們可以減小圖檔檔案。

“shrinkResources” 屬性将會移除所有在工程中沒有用到的資源。在 build.gradle 中像下面這樣啟用它:

“resConfigs” 屬性将會在建構過程中移除所有本地化資源。app “Anti-Theft Screen Lock” 隻需要支援英語。而很多的支援庫都可能有其它語言的本地化檔案夾。這些是我不需要的。是以,添加下面的這些代碼讓應用隻支援英語。

你可以在工程選擇 drawable 和 mipmap 檔案夾,右擊并選擇 convert to webp。這将會打開下面這樣的配置彈框。

點選 ok,将會将所有 png 圖檔轉成 webp。如果 webp 圖檔比 png 更大,Android Studio 将會自動跳過這個檔案。

讓我們看下最終效果:

喔!!!res 檔案夾從 710KB 降到了 597KB。

體積減小了 105KB。(降低了 16%)

通過在你的 release build type 中加上下面這些代碼啟用混淆。

啟用 shrinkResources。

通過在 “resConfigs” 裡添加需要的資源名移除所有不需要的本地化資源。

将所有圖檔轉為 webp 或者矢量圖。

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

這些隻是最簡單的方式,還有很多減小應用體積的方法。但是,你應該始終使用上面這些簡單的方法來保證已經盡可能的減小了應用體積。

記住:越小越好。

<b></b>

<b>原文釋出時間為:2017年3月28日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>

繼續閱讀