【问题标题】:"minifyEnabled" vs "shrinkResources" - what's the difference? and how to get the saved space?“minifyEnabled”与“shrinkResources”——有什么区别?以及如何获得节省的空间?
【发布时间】:2015-06-12 10:27:49
【问题描述】:

背景

根据 Andriod 文档 (here) 的“Resource Shrinking”网页,您可以通过 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 才能打开代码收缩”,

【问题讨论】:

  • shrinkResources 删除所有未使用的资源,因此没有质量问题或其他问题。 mimifyEnabled 不会删除它。我认为必须使用 mimifyEnabled 来获得未使用资源的列表。
  • 所以只有“minifyEnabled”没有任何作用?并且“shrinkResources”不会缩小任何东西?如何查看节省的空间?以及删除了哪些文件?
  • 我认为是的,你可以在这里阅读tools.android.com/tech-docs/new-build-system/resource-shrinking 要使用收缩,你必须将 mimifyEnabled 设置为 true。这是因为 mimifyEnabled 删除未使用的代码,而 shrinkResources 删除未使用的资源(大部分或全部在未使用的代码中调用)。
  • Proguard 不负责删除未使用的代码吗?
  • minifyEnabled 启用 proguard,它会删除未使用的类/代码,而 shrinkResources 会删除未使用的资源(png、xml,主要由您未充分利用的库引入)。

标签: android build.gradle


【解决方案1】:

让我们看看

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

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

“shrinkResources”究竟做了什么而“minifyEnabled”却没有?为什么“shrinkResources”依赖于“minifyEnabled”?

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

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

不!

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

ProGuard 缩小 CODE ONLYshrinkResources 这只是 /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 仅比较可绘制对象是否在文件夹中,而不是在 R 类中。

【讨论】:

  • 因此,“shrinkResources”根本不会收缩。应该改为“excludeUnusedResources”,不是吗?为什么“shrinkResources”依赖于“minifyEnabled”,如果一个与资源相关,一个与源代码相关?此外,对于节省的 MB 量,我在那里看不到(经过测试)。我还检查了“Gradle Console”(在右下角)。
  • 是的,也许这不是最好的命名,但我们能做些什么呢?也许在某些版本中他们会改变它。这取决于minify,因为这是对未使用资源进行分析的地方,shrink 只是删除。
  • 关于日志,我不知道。根据您指出的文档,如果您通过命令行构建,您可以获得它。
  • 关于需求,但由于一个与另一个不同(源与资源),为什么一个依赖于另一个?另外,能否请您在 Android Studio 上尝试一下,看看是否找到日志?我在那里尝试了很多东西......
  • @Shubh ProGuard 仍然做 ProGuard 所做的一切(删除未使用的 java 代码、混淆代码、opmise 类等)。
【解决方案2】:

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

讨论的要点概述如下:

  • 仅当minifyEnabled 为真时才考虑shrinkResources

  • minifyEnabled 收缩代码,而shrinkResources 收缩代码中未引用的资源

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

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • Budius 的回答很好,我宁愿提供链接作为他在 cmets 中的话的证明,但不幸的是,我没有足够的声誉在他的回答下发表评论。我将修改我的答案以提供一些细节。
【解决方案3】:
  • shrinkResources 可用于减少生成的 APK 的尺寸,去除任何未使用的资源。
  • minifiedEnabled 只是运行 Proguard,它帮助 android 插件在没有未使用代码的情况下打包 APK,以缩小它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2020-01-15
    • 2014-07-10
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多