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

时间:2015-06-12 10:27:50

标签: android build.gradle

背景

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

android {
    ...

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

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

  

启用shrinkResources后,应显示构建应用程序   在构建过程中输出如下:

     

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

问题

我无法找到这些问题的答案:

  1. 使用Android-Studio本身创建已签名的应用程序时,在哪里可以找到已保存的内容以及删除/修改的文件的信息?
  2. “shrinkResources”究竟做了什么“minifyEnabled”不这样做?为什么“shrinkResources”依赖于“minifyEnabled”?
  3. 这些选项是否会影响图像文件的大小和/或质量?
  4. Proguard不是缩小源代码的责任吗?我问这个是因为它说“你必须启用minifyEnabled才能打开代码收缩”,

3 个答案:

答案 0 :(得分:56)

让我们看看

  

使用Android-Studio本身创建已签名的应用时,在哪里可以找到已保存的内容以及删除/修改的文件的信息?

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

  

究竟是什么" shrinkResources"做那个" minifyEnabled"别' T'为什么" shrinkResources"取决于" minifyEnabled" ?

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

  

这些选项是否会影响图像文件的大小和/或质量?

没有!

  

不是Proguard负责缩小源代码吗?我问这个是因为它说'#34;你必须启用minifyEnabled才能打开代码收缩,"

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

修改

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

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

  

为什么一个人会依赖另一个?

来自帖子:

  

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

这意味着,shrinkResources仅比较一个drawable是否在文件夹中而不在R类。

答案 1 :(得分:24)

可以找到问题2和4的答案in this video from Android Dev Summit 2015以及有关此主题的其他一些有用信息。

所讨论要点的概述是:

  
      仅当market为真时才会考虑
  • shrinkResources

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

  •   
  • 默认情况下shrinkResourcesshrinkResources模式运行。   如果您将其切换为safe,则可以手动提供stricttools:keep标记,以影响资源缩减。

  •   

答案 2 :(得分:1)

  • shrinkResources可用于减少生成的APK的维度,剥离任何未使用的资源。
  • minifiedEnabled只是运行Proguard,它可以帮助Android插件打包APK而不会使用未使用的代码,以便缩小它