99

I see that the Android Plugin for Gradle has a minifyEnabled property as well as a useProguard property, as follows:

android {
    buildTypes {
        debug {
            minifyEnabled true
            useProguard false
        }
        release {
            minifyEnabled true
            useProguard true
        }
    }
}

What's the difference between these two properties? Or, rather, what's the meaning of each?

Adil Hussain
  • 30,049
  • 21
  • 112
  • 147
  • 1
    You could read about it here http://tools.android.com/tech-docs/new-build-system/resource-shrinking – OneCricketeer May 03 '16 at 15:02
  • That document (at the time of writing this comment) contains nothing about the `useProguard` property @cricket_007. Unless `useProguard` is a rename of the `shrinkResources` property in recent releases of the Android Plugin for Gradle? – Adil Hussain May 03 '16 at 15:09
  • "resource shrinking only works in conjunction with code shrinking (such as ProGuard)" – OneCricketeer May 03 '16 at 15:10

4 Answers4

71

Quoting from tools.android.com:

Built-in shrinker

Version 2.0 of Android Plugin for Gradle ships with an experimental built-in code shrinker, which can be used instead of ProGuard. The built-in shrinker supports fast incremental runs and is meant to speed up iteration cycles. It can be enabled using the following code snippet:

android {
    buildTypes {
        debug {
            minifyEnabled true
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }
}

The built-in shrinker can only remove dead code, it does not obfuscate or optimize. It can be configured using the same files as ProGuard, but will ignore all flags related to obfuscation or optimization.

Unlike ProGuard, we support using the built-in shrinker together with Instant Run: depending on the project, it may significantly decrease the initial build and install time. Any methods that become reachable after a code change will appear as newly added to the program and prevent an Instant Run hotswap.

Mattia Maestrini
  • 32,270
  • 15
  • 87
  • 94
  • 1
    Thanks so much @Mattia. This explains it. So `minifyEnabled` removes dead code but does not obfuscate or optimize. – Adil Hussain May 03 '16 at 15:37
  • 2
    Seems to directly contradict this answer which is saying that minify does obfuscate a bit https://stackoverflow.com/questions/17290023/obfuscation-in-android-studio – pete Jul 10 '17 at 17:31
  • updated link to the documentation : https://developer.android.com/studio/build/shrink-code.html#gradle-shrinker – mx1up Jan 04 '18 at 17:46
  • Updated developer link, https://developer.android.com/studio/build/shrink-code.html#gradle-shrinker – Jitendar M Jan 26 '18 at 06:16
  • 1
    So it's recommended to use `minifyEnabled true` in both debug and release? It works fine with Proguard enabled? What happens when we use `useProguard false`, while setting the proguard files? Proguard rules are ignored? – android developer Jul 01 '19 at 11:48
35

You don't need useProguard true anymore.

Code shrinking with R8 is enabled by default when you set the minifyEnabled property to true.

When you build your project using Android Gradle plugin 3.4.0 or higher, the plugin no longer uses ProGuard to perform compile-time code optimization. Instead, the plugin works with the R8 compiler to handle the tasks according to the official document.

If you want to use ProGuard instead of R8. Add this line in the gradle.properties file

 android.enableR8=false
Allen
  • 2,979
  • 1
  • 29
  • 34
  • tried this, but there was no clue whether its working it or not. The mapping.txt file also not generated. – arango_86 Dec 16 '20 at 16:05
20

I set minifyEnabled true for my release buildType and it removed an entire enum which it thougt to be unused code i guess. This made my app crash due to a NoSuchFieldException. Took me 4 hours to find the reason for this crash. 0/10 can not recommend minifyEnabled.

J7bits
  • 688
  • 8
  • 14
8

Just enable minifyEnabled will have code both optimized and obfuscated. This is because useProguard true is default so no need to set it explicitly.

See also: Obfuscation in Android Studio

Stephen Kennedy
  • 20,585
  • 22
  • 95
  • 108
user8100646
  • 137
  • 1
  • 6