在Gradle的Android插件中,“minifyEnabled”和“useProguard”有什么区别?

时间:2016-05-03 14:53:21

标签: android gradle android-gradle build.gradle android-proguard

我看到Gradle的Android插件有minifyEnabled属性以及useProguard属性,如下所示:

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

这两个属性有什么区别?或者更确切地说,每个人的意义是什么?

4 个答案:

答案 0 :(得分:44)

引自tools.android.com

  

内置收缩器

     

Gradle的Android插件2.0版附带了一个实验性的   内置代码缩减器,可以代替ProGuard使用。该   内置式收缩机支持快速增量运行,旨在提高速度   迭代周期。可以使用以下代码启用它   片段:

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

内置的收缩器只能删除死代码,不会混淆或优化。它可以使用与之相同的文件进行配置   ProGuard,但会忽略与混淆或混淆相关的所有标志   优化

     

与ProGuard不同,我们支持使用内置的收缩机   即时运行:根据项目,它可能会显着减少   初始构建和安装时间。任何可以访问的方法   代码更改后将显示为新添加到程序和   防止Instant Run热交换。

答案 1 :(得分:3)

只需启用minifyEnabled,代码就会优化和混淆。 这是因为useProguard true是默认值,因此无需明确设置它。

另见: Obfuscation in Android Studio

答案 2 :(得分:1)

您不再需要useProguard true

minifyEnabled属性设置为true时,默认情况下启用R8代码收缩。

当您使用Android Gradle插件 3.4.0或更高版本构建项目时,该插件不再使用ProGuard来执行编译时代码优化。相反,该插件可与R8编译器一起使用,以根据official document处理任务。

如果要使用ProGuard而不是R8。在gradle.properties文件中添加这一行

 android.enableR8=false

答案 3 :(得分:1)

我为发布的buildType设置了minifyEnabled true,它删除了整个枚举,我想它应该是未使用的代码。由于NoSuchFieldException,这使我的应用程序崩溃了。花了我4个小时来找出这次当机的原因。 0/10不推荐minifyEnabled。