“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%
问题
我找不到这些问题的答案:
- 当使用Android-Studio自己创build已签名的应用程序时,在哪里可以find已保存多less以及哪些文件被删除/修改的信息?
- “shrinkResources”究竟做了那个“minifyEnabled”不? 为什么“shrinkResources”依赖于“minifyEnabled”?
- 这些选项中的任何一个都会影响图像文件的大小和质量?
- 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
缩小未从代码引用的资源默认情况下,
shrinkResources
以safe
模式运行。 如果将其切换为strict
,则可以提供以下tools:keep
和tools:discard
手动tools:discard
标志以影响资源收缩。
- shrinkResources对于减less生成的APK的维度非常有用,剥离出任何未使用的资源。
- minifiedEnabled只是运行Proguard,它可以帮助android插件打包APK没有未使用的代码,以缩小它