我是如何做到在 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%)。恭喜……

猜你喜欢

转载自blog.51cto.com/14332859/2447751
60