“minifyEnabled”vs“shrinkResources” – 有什么区别? 以及如何获得节省的空间?

背景

根据Andriod文档( 此处 )的“资源缩小”网页,可以通过build.gradle文件使用以下几行来最小化应用程序的大小:

android { ... buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } 

而且,他们说使用它时,它也会告诉你在这个过程中保存了多less东西:

当您启用shrinkResources时,构build应用程序应在构build过程中显示如下所示的输出:

…删除未使用的资源:二进制资源数据从2570KB减less到1711KB:删除了33%

问题

我找不到这些问题的答案:

  1. 当使用Android-Studio自己创build已签名的应用程序时,在哪里可以find已保存多less以及哪些文件被删除/修改的信息?
  2. “shrinkResources”究竟做了那个“minifyEnabled”不? 为什么“shrinkResources”依赖于“minifyEnabled”?
  3. 这些选项中的任何一个都会影响图像文件的大小和质量?
  4. Proguard不负责缩减源代码吗? 我问这个,因为它说“你必须启用minifyEnabled才能打开代码缩小”

让我们来看看

当使用Android-Studio自己创build已签名的应用程序时,在哪里可以find已保存多less以及哪些文件被删除/修改的信息?

那些将在gradle日志中。 在Android工作室里面,我相信这些显示在Messages窗口中(Android,Run,TODO窗口旁边)。

“shrinkResources”究竟做了那个“minifyEnabled”不? 为什么“shrinkResources”依赖于“minifyEnabled”?

minify运行ProGuard。 shrink删除ProGuard标记为未使用的资源。

这些选项中的任何一个都会影响图像文件的大小和质量?

没有!

Proguard不负责缩减源代码吗? 我问这个,因为它说“你必须启用minifyEnabled才能打开代码缩小”

ProGuard 收缩代码 ; shrinkResources它只是来自/res/文件夹的内容。 shrinkResources取决于ProGuard运行的日志输出。 ProGuard是真正分析代码以了解什么是未使用的人。

编辑:

我刚刚发现了一篇非常好的博客文章。 CommonsWare在其他stackOverlow问题上发布它: http ://cyrilmottier.com/2014/08/26/putting-your-apks-on-diet/

它完美地解释了你的后续问题:

为什么要依靠对方?

从post:

Proguard在Java方面工作。 不幸的是,这在资源方面不起作用。 因此,如果不使用res / drawable中的图像my_image,则Proguard仅在R类中删除它的引用,但保留关联的图像。

这意味着,仅当drawable位于文件夹中,而不是R类时, shrinkResources才会进行比较。

问题2和4的答案可以在Android Dev Summit 2015的video中find,以及其他一些有关此主题的有用信息。

讨论的要点概述如下:

  • 仅当minifyEnabled为true时才考虑minifyEnabled

  • minifyEnabled缩小代码,而shrinkResources缩小未从代码引用的资源

  • 默认情况下, shrinkResourcessafe模式运行。 如果将其切换为strict ,则可以提供以下tools:keeptools:discard手动tools:discard标志以影响资源收缩。

  • shrinkResources对于减less生成的APK的维度非常有用,剥离出任何未使用的资源。
  • minifiedEnabled只是运行Proguard,它可以帮助android插件打包APK没有未使用的代码,以缩小它