Android Apk体积优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w627947015/article/details/65634188

Android Apk体积优化


原文地址:How you can decrease application size by 60% (In only 5 minutes)?

看到这个标题,你可能很感兴趣,当我看到这个标题的时候,我也很感兴趣。其实也就是减小应用体积的一些技巧,网络上也有不少体积优化的相关文章,这里的这些技巧简单易用,可能你会用到。

1. 越小越好


当App应用做得比较大的时候,应用大小这个事情大家都会关注,毕竟移动设备的资源有限,有限的存储,有限的内存…

你希望你的应用能吸引大量用户,你会考虑应用的性能、设计和用户体验。市场上大概上万种安卓机型,而其中大部分都是低端机,有限的存储(1GB 到 8GB),甚至用的还是 2G 或者 3G 网络。这些设备在印度,巴其尔等非洲发展中国家占有大量市场,你可以在这些地方获得大量的用户。

让你的应用大小保持最佳变得尤其重要。你的应用体积越小,你的用户就有更多的空间来存储他们的视频和图片。说实话,你肯定不希望用户因为“存储空间不足”的提示删除你的应用。

2. 使用APK Analyser 分解你的 APK


Android Studio 提供了一个有用的工具:APK Analyser。APK Analyser 将会拆解你的应用并让你知道 .apk 文件中的那个部分占据了大量空间。让我们看一下在没有经过优化之前的截图:

这里写图片描述

从 Apk Analyser 的输出来看,应用的原大小是 24.4MB。经过 Play 商店的压缩,大致是 23.3MB。

从截图中可以看出主要有 3 个文件夹占据了应用的大多数空间。

  • lib — 用来存放一些用到第三方的jar包和so文件
  • classes.dex — 这是 dex 文件,包含了所有会运行在你的 DVM 或 ART 里的字节码文件。
  • res — 这个文件夹包含了所有在 res 文件夹下的文件。大部分情况下它包含所有图片,图标和源文件,菜单文件和布局。

这里写图片描述

3. 减小 classes.dex


classes.dex 包含了所有 Java 代码。当你编译你的应用时,gradle 会将你的所有模块里的 .class 文件转换成 .dex 文件并将这些文件合成一个 classes.dex 文件。

单个的 classes.dex 文件可以容纳大约 64K 方法。如果你达到了这个限制,你必须要在你的工程中启用 multidexing。这将会创建另一个 classes1.dex 文件去存储剩下的方法。所以 classes.dex 文件数目由你的方法数而定。

这里写图片描述

你可以看到现在的我的应用包含 7548 个类和 52763 个方法。这个结果是没有经过混淆的。你有两个默认的混淆文件。

  • proguard-android.txt
  • proguard-rules.pro
release {
    //Enable the proguard
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro"

    //...
}

就像文件名写的那样,“proguard-android.txt”是更积极的混淆选项。我们将这个作为默认的混淆配置。你可以在 /app 目录下的 proguard-rules.pro 里添加自定义的混淆配置。

proguard-android.txt这个默认混淆配置位置是在:sdk目录下 ~sdk\tools\proguard\proguard-android.txt

通过设置 minifyEnabled 为 true,混淆将会移除所有未使用的方法、指令以减小 classes.dex 文件。

这是启用了 minify 之后的 APK:
这里写图片描述

可以看到混淆之后的classes.dex的方法数从52763降低到了44895;体积从3.4M降低到了2.3M;

4. 减小 res


下一大块就是 res 文件夹,它包括了所有的图片,raw 文件和 XML。你不能添加/删除/修改你的 XML,因为它们包含了你的布局。但是我们可以减小图片文件。

  • “shrinkResources” 属性将会移除所有在工程中没有用到的资源。在 build.gradle 中像下面这样启用它:
release{
  //...
  //...
  shrinkResources true
  //...
}
  • “resConfigs” 属性将会在构建过程中移除所有本地化资源。添加下面的这些代码让应用只支持中文。

defaultConfig {
    //...
    //...
    //...

    //strip other than english resources
    resConfigs "zh"
}
  • 你可以使用 webp 替代 png

如果你在用 Android Studio 2.3,并且你的应用的最低支持版本大于 18,你可以使用 webp 替代 png。webp 图片比 png 体积更小但质量一样。而且 Android 支持 webp。所以你可以在 ImageView 中像加载其它光栅图片一样加载 webp 图片。这不需要改变你的布局。

你可以在工程选择 drawable 和 mipmap 文件夹,右击并选择 convert to webp。这将会打开下面这样的配置弹框。

这里写图片描述

点击 ok,将会将所有 png 图片转成 webp。如果 webp 图片比 png 更大,Android Studio 将会自动跳过这个文件。

这里写图片描述

最终res体积大小从4.3M降低到了3.8

总结


  • 通过在你的 release build type 中加上下面这些代码启用混淆。
  • 启用 shrinkResources。
  • 通过在 “resConfigs” 里添加需要的资源名移除所有不需要的本地化资源。
  • 将所有图片转为 webp 或者矢量图

最终应用从24.4M降低到了22.5M。看上去想过不明显,主要是使用了环信sdk,我这里没有做libs的优化和没有png转webp。这些只是最简单的方式,还有很多减小应用体积的方法。但是,你应该始终使用上面这些简单的方法来保证已经尽可能的减小了应用体积。

猜你喜欢

转载自blog.csdn.net/w627947015/article/details/65634188