我是如何做到在 5 分鐘之內將應用大小減少 60% 的?

移動設備的資源總是有限的。有限的電量,有限的存儲,有限的處理能力,有限的內存,有限的網絡帶寬……無論你面對的是 Android 還是 iOS,這都是真理。

在前幾個月,我在開發一個安卓應用。當有人嘗試用錯誤的密碼解鎖設備時,這個應用會通過前置攝像頭拍照並播放警示音。

今天在這篇文章教大家一些我用來減小應用體積的技巧。這些技巧都簡單且易用,會在現在或將來爲大家提供一些幫助。

越小越好

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

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

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

我是如何做到在 5 分鐘之內將應用大小減少 60% 的?

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

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

越小越好

使用 APK Analyser 分解你的 APK

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

我是如何做到在 5 分鐘之內將應用大小減少 60% 的?

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

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

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

我是如何做到在 5 分鐘之內將應用大小減少 60% 的?

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

我是如何做到在 5 分鐘之內將應用大小減少 60% 的?


所以,現在你知道 APK 是怎麼組成的了。讓我們接着看看該怎麼一塊塊的優化它以減小應用體積。

減小 classes.dex

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

單個的 classes.dex 文件可以容納大約 64K 方法。如果你達到了這個限制,你必須要在你的工程中啓用 multidexing。這將會創建另一個 classes1.dex 文件去存儲剩下的方法。所以 classes.dex 文件數目由你的方法數而定。

我是如何做到在 5 分鐘之內將應用大小減少 60% 的?

你可以看到現在的 “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。

我是如何做到在 5 分鐘之內將應用大小減少 60% 的?

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章