“minifyEnabled” vs “shrinkResources” - what's the difference? and how to get the saved space?

后端 未结 3 413
悲&欢浪女
悲&欢浪女 2020-12-12 20:04

Background

According to the \"Resource Shrinking\" webpage of Andriod documentations (here), you can minimize the app\'s size via the build.gradle file, by using t

相关标签:
3条回答
  • 2020-12-12 20:44
    • shrinkResources is useful to reduce the dimension of your generated APK, stripping out any unused resource.
    • minifiedEnabled simply runs Proguard which helps android plugin to package the APK without unused code, in order to shrink it
    0 讨论(0)
  • 2020-12-12 20:46

    The answers to the questions 2 and 4 can be found in this video from Android Dev Summit 2015 along with some other useful information on this topic.

    An overview of the points discussed were:

    • shrinkResources is taken into account only if minifyEnabled is true

    • minifyEnabled shrinks code, while shrinkResources shrinks resources that are not referenced from the code

    • By default shrinkResources runs in safe mode. If you switch it to strict you can provide tools:keep and tools:discard flags manually to influence the resource shrinking.

    0 讨论(0)
  • 2020-12-12 21:01

    Let's see

    When using Android-Studio itself to create the signed app, where can I find the information of how much was saved and which files were removed/modified?

    Those are gonna be in the gradle log. Inside Android studio I believe those are shown in the Messages window (next to Android, Run, TODO windows).

    What exactly does "shrinkResources" do that "minifyEnabled" don't? And why do "shrinkResources" depend on "minifyEnabled" ?

    minify runs ProGuard. shrink remove resources that ProGuard flagged as unused.

    Do any of those options affect the size and/or quality of image files?

    No!

    Isn't Proguard responsible of shrinking source code? I ask this because it says "you have to enable minifyEnabled in order to turn on code shrinking,"

    ProGuard shrinks CODE ONLY; shrinkResources it's just the stuff from the /res/ folder. shrinkResources depends on the log output from ProGuard to run. ProGuard is the one who actually analyses the code to know what is unused.

    edit:

    I've just found a very nice blog post. CommonsWare posted it on some other stackOverlow question: http://cyrilmottier.com/2014/08/26/putting-your-apks-on-diet/

    it explains it perfectly your follow up question:

    why would one depend on the other?

    from the post:

    Proguard works on the Java side. Unfortunately, it doesn’t work on the resources side. As a consequence, if an image my_image in res/drawable is not used, Proguard only strips it’s reference in the R class but keeps the associated image in place.

    that means, that shrinkResources only compares if a drawable is in the folder but not on the R class.

    0 讨论(0)
提交回复
热议问题