Android Studio 提供了一些工具:APK Analyser APK Analyzer 将拆解您的应用程序,并让您知道 .apk 文件中的哪个组件占用了较大的空间?让我们看看没有应用任何优化的防盗锁屏apk文件。
从 apk 分析器输出中,您可以看到应用程序原始大小约为 3.1MB。应用 Play 商店压缩后,应用程序大小约为 2.5 MB。
从屏幕截图中可以看出,有 3 个主要文件夹占用了应用程序的大部分大小。
- classes.dex — 这是包含将在 DVM 或 ART 上运行的 Java 代码的所有字节码文件的 dex 文件。
- res — 此文件夹包括 res 文件夹下的所有文件。大多数情况下,这将包含所有图像、图标和原始文件、菜单文件和布局。
- resources.arsc — 此文件包含所有价值资源。该文件包含您在不同值文件夹下的所有数据。此资源包含字符串、尺寸、样式、整数、ID 等。
所以,现在您知道 APK 是由什么组成的了。让我们看看,我们如何通过一个一个组件的优化来减小应用程序的大小。
减少 classes.dex:
正如我们所讨论的,它包含所有的 java 代码。在构建应用程序时,gradle 将合并所有模块中的所有 .class 文件,并将这些 .class 文件转换为 .dex 文件,并将它们合并到单个 classes.dex 文件中。
单个 classes.dex 文件可以容纳大约 64K 的方法。如果超过此限制,则必须在项目中启用 multidexing。这将创建另一个 classes1.dex 文件以包含所有剩余的方法。因此 classes.dex 文件的数量取决于您拥有的方法数量。
如您所见,目前“防盗锁屏”包含 4392 个类和 29897 个方法。这个结果是没有应用proguard的。您有两个可以应用的默认 proguard 文件。
- proguard-android-optimize.txt
- proguard-android.txt
顾名思义“proguard-android-optimize.txt”是更激进的progurard配置。我们使用它作为默认的 proguard 配置。您可以在 /app 目录中的 proguard-rules.pro 文件中添加自定义的 proguard 配置。
Compression Gist 1
通过将 minifyEnabled 设置为 true(在 Compression Gist 1 中),您是在告诉 proguard 删除所有未使用的方法、指令并精简 classes.dex 文件.
这是启用了 minify 的 APK 的结果,
正如您所见,通过在我们项目的每个模块中启用 proguard,我们可以将 classes.dex 文件大小减少近 50%。此外,您可以看到方法计数从 29897 减少到 15168(几乎 50%)。
大小从 3.1 MB 减少到 1.98MB。 (减少约 50%)
减少资源:
您的 apk 大小中的第二大组件是您的 res 文件夹,其中包含所有图像、原始文件和 XML。您不能添加/删除/修改您的 XML,因为它们包含您的布局。但是我们可以减少图片文件。
-
“shrinkResources” 属性将删除所有在项目中未使用的资源。通过添加以下行在您的 build.gradle 文件中启用此功能:
Compression Gist 2
-
“resConfigs” 属性将在构建应用程序时删除所有其他本地化资源。在我们的例子中,“防盗锁屏”只支持英文。虽然所有支持库都可能具有其他语言的本地化文件夹。我们不需要。因此,添加以下行以仅允许在 APK 文件中添加英文资源。
Compression Gist 3
- Android Studio 2.3,并且你的应用最低版本为18或以上,你应该使用webp而不是png。 webp 图像的大小比 png 文件小,而且它保留了原始图像质量。更重要的是,Android 原生支持 webp 图像。因此,您可以像其他光栅图像一样在 ImageView 中加载 webp 图像。因此,您不必更改布局。
你可以从你的项目中选择drawable和mipmap文件夹,右击并选择convert to webp。这将打开下面的配置对话框。
按确定,它会将所有 png 图像一一转换为 webp 格式。如果 webp 图片比 png 大,Android Studio 会自动跳过该文件。
让我们看看最终结果:
-
res 文件夹的大小从 710KB 减少到 597KB。
通过应用上述简单技巧,应用程序大小从 3.19 MB 减少到 1.89 MB。
快乐编码?