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


73

背景

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

android {
    ...

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

而且,他们说,使用它时,它还会告诉您在此过程中节省了多少:

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

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

问题

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

  1. 使用Android-Studio本身创建签名的应用程序时,在哪里可以找到有关保存了多少以及删除/修改了哪些文件的信息?
  2. “ shrinkResources”和“ minifyEnabled”到底没有什么作用?为什么“ shrinkResources”依赖于“ minifyEnabled”?
  3. 这些选项是否会影响图像文件的大小和/或质量?
  4. Proguard是否不负责缩小源代码?我之所以这样问是因为它说:“您必须启用minifyEnabled才能打开代码收缩功能,”

rinkResources删除所有未使用的资源,因此不会出现质量问题或其他问题。mimifyEnabled不会将其删除。我认为必须使用mimifyEnabled来拥有未使用资源的列表。
伊万

那么,单独拥有“ minifyEnabled”并不能做什么?和“ shrinkResources”不会缩小任何内容吗?如何查看节省的空间?哪些文件被删除了?
Android开发人员

我认为是的,因为您可以在此处阅读tools.android.com/tech-docs/new-build-system/resource-shrinking才能使用缩小功能,因此您必须具有true的mimifyEnabled。这是因为mimifyEnabled删除了未使用的代码,而rinkeResources删除了未使用的资源(大多数或全部在未使用的代码中调用)。
伊万2015年

Proguard是否不负责删除未使用的代码?
Android开发人员

1
minifyEnabled启用了proguard,它可以删除未使用的类/代码,shrinkResources可以删除未使用的资源(png,xml,主要由您没有充分利用的库引入)。
Eugen Pechanec

Answers:


66

让我们来看看

使用Android-Studio本身创建签名的应用程序时,在哪里可以找到有关保存了多少以及删除/修改了哪些文件的信息?

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

“ shrinkResources”和“ minifyEnabled”到底没有什么作用?为什么“ shrinkResources”依赖于“ minifyEnabled”?

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

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

没有!

Proguard是否不负责缩小源代码?我之所以这样问是因为它说:“您必须启用minifyEnabled才能打开代码收缩功能,”

ProGuard收缩CODE ; shrinkResources只是/res/文件夹中的东西。shrinkResources取决于要运行的ProGuard的日志输出。ProGuard是实际分析代码以了解未使用内容的人。

编辑:

我刚刚找到了一个非常不错的博客文章。CommonsWare将其发布在其他堆栈上较低的问题:http ://cyrilmottier.com/2014/08/26/putting-your-apks-on-diet/

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

为什么一个要依靠另一个?

从帖子:

Proguard在Java方面起作用。不幸的是,它在资源方面不起作用。因此,如果未使用res / drawable中的图像my_image,则Proguard只会在R类中删除其引用,但会将关联的图像保留在适当的位置。

这意味着,shrinkResources只有在文件夹中有drawable而不是R 类中时才进行比较。


因此,“ shrinkResources”根本不会收缩。应该被称为“ excludeUnusedResources”,不是吗?为什么“ shrinkResources”依赖于“ minifyEnabled”,如果其中之一与资源相关,而另一个与源代码相关?另外,对于已保存的MB数量,我在那里看不到(已测试)。我还检查了“ Gradle Console”(在右下方)。
Android开发人员

是的,也许这不是最好的命名,但是我们该怎么办?也许在某些版本中,他们对其进行了更改。这取决于minify因为那是对未使用资源进行分析的地方,因此shrink只是删除了。
Budius

关于日志,那我不知道。根据您指出的文档,如果您是通过命令行构建的,则可以获取。
Budius

关于需求,但是由于一个与另一个(源与资源)不同,为什么一个要依赖另一个?另外,您可以在Android Studio上试用一下,看看是否找到日志吗?我在那里尝试了很多事情……
android开发人员

1
@Shubh ProGuard仍会执行ProGuard所做的一切(删除未使用的Java代码,混淆代码,优化类等)。
布迪乌斯

30

关于问题2和4的答案,可以在来自Android Dev Summit 2015的视频中找到以及有关此主题的其他一些有用信息。

讨论的要点概述为:

  • shrinkResources仅在minifyEnabled为true时才考虑在内

  • minifyEnabled缩小代码,同时shrinkResources缩小未从代码中引用的资源

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


1
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。-评分
尤索林

Budius的回答很好,我希望提供链接作为他在评论中的话的证明,但不幸的是,我没有足够的声誉在他的回答下发表评论。我将修改我的答案以提供一些细节。
Florin

2
  • rinkingResources可用于减小生成的APK的尺寸,从而去除所有未使用的资源。
  • minifiedEnabled只需运行Proguard,它可以帮助android插件将APK打包(不包含未使用的代码),以便缩小
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.