移動設備的資源總是有限的。有限的電量,有限的存儲,有限的處理能力,有限的內存,有限的網絡帶寬……無論你面對的是 Android 還是 iOS,這都是真理。
在前幾個月,我在開發一個安卓應用。當有人嘗試用錯誤的密碼解鎖設備時,這個應用會通過前置攝像頭拍照並播放警示音。
今天在這篇文章教大家一些我用來減小應用體積的技巧。這些技巧都簡單且易用,會在現在或將來爲大家提供一些幫助。
越小越好
作爲一個開發者我們總是更關心應用的性能,設計和用戶體驗。但是,大多數開發者都忘了(或低估)一件事:應用體積。如果你希望你的應用能吸引大量用戶,這是非常核心的一點。
市場上大概有 11000 種安卓機型,而其中大部分都是低端機,有限的存儲(1GB 到 8GB),甚至用的還是 2G 或者 3G 網絡。這些設備在印度,巴其爾等非洲發展中國家佔有大量市場,你可以在這些地方獲得大量的用戶。
讓你的應用大小保持最佳變得尤其重要。你的應用體積越小,你的用戶就有更多的空間來存儲他們的視頻和圖片。說實話,你肯定不希望用戶因爲“存儲空間不足”的提示刪除你的應用。
如果用戶的存儲空間不夠的話,他們會卸載你的應用。
這些發展中國家用戶使用的依然是速度有限的 2G/3G 網。所以,如果你的應用體積太大,將會需要更多的時間來下載(更可能的情況時用戶根本不會去下載)。同樣的,大多數用戶流量有限,用戶下載的每個字節都是在花錢。
所以,很明顯了,應用程序界的真理就是:
越小越好
使用 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 文件。
單個的 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%)。恭喜……