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

Adi*_*ain 56 android gradle build.gradle android-gradle-plugin android-proguard

我看到Gradle的Android插件有一个minifyEnabled属性和useProguard属性,如下所示:

android {
    buildTypes {
        debug {
            minifyEnabled true
            useProguard false
        }
        release {
            minifyEnabled true
            useProguard true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ini 53

引自tools.android.com:

内置收缩机

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

android {
    buildTypes {
        debug {
            minifyEnabled true
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 似乎直接与这个答案相矛盾,即 minify 确实有点混淆 /sf/ask/1210301641/ (2认同)

J7b*_*its 12

minifyEnabled true为我的版本 buildType设置了它,它删除了整个枚举,我猜它认为是未使用的代码。这使我的应用程序由于NoSuchFieldException. 我花了 4 个小时才找到这次崩溃的原因。0/10 不能推荐 minifyEnabled。

  • 对于任何正在阅读本文并认为这是正确且有充分理由的人,请学习正确配置和优化。将 `minifyEnabled` 设置为 true 是一个很好的做法,而不使用它,因为您的应用程序在发布模式下无法正常工作并且无法定位问题来自何处,这已经是 Android 开发人员的一个坏习惯。请学习基础知识,通过在 proguard 规则文件中指定它,可以很容易地排除在发布版本中被删除或混淆的类。您只需添加它即可。 (2认同)

小智 7

只需启用即可minifyEnabled优化和混淆代码。这是因为它useProguard true是默认的,所以不需要显式设置它。

另请参阅: Android Studio 中的混淆


All*_*len 6

您不再需要useProguard true了。

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

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

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

 android.enableR8=false
Run Code Online (Sandbox Code Playgroud)