Gradle:DSL 元素“useProguard”已过时,将很快被删除
Posted
技术标签:
【中文标题】Gradle:DSL 元素“useProguard”已过时,将很快被删除【英文标题】:Gradle : DSL element 'useProguard' is obsolete and will be removed soon 【发布时间】:2019-12-29 08:23:39 【问题描述】:自 android Studio 3.5 更新以来,我在构建我的应用程序时收到此警告:
DSL 元素“useProguard”已过时,很快将被删除。采用 gradle.properties 中的“android.enableR8”在 R8 和 前卫..
【问题讨论】:
【参考方案1】:从 build.gradle 中删除“useProguard”:
release
minifyEnabled true
//useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
解决了问题。
【讨论】:
如果 enableR8 设置为 true 但 minifyEnabled 设置为 false,是否会发生任何类型的混淆? 如果您使用的是 Gradle 7.0.0 或更高版本,注释掉(删除)useProguard
是必须。【参考方案2】:
在项目的 gradle.properties 文件中设置以下内容
android.enableR8=true
R8 还具有与 Proguard 不直接兼容的完整模式。为了尝试一下,您可以在 gradle.properties 文件中另外设置以下内容
android.enableR8.fullMode=true
这会开启更多优化,从而进一步减小应用大小。但是,您可能需要一些额外的保留规则才能使其正常工作。
【讨论】:
【参考方案3】:一目了然,当您使用Android Gradle plugin 3.4.0 或更高版本构建项目时,该插件不再使用 ProGuard 来执行编译时代码优化。相反,该插件默认使用 R8 编译器来处理收缩、混淆和优化您的应用程序。但是,您可以通过 ProGuard 规则文件禁用某些任务或自定义 R8 的行为。
事实上,R8 可与您现有的所有 ProGuard 规则文件一起使用,因此更新 Android Gradle 插件以使用 R8 不需要您更改现有规则。
当您使用 Android Studio 3.4 或 Android Gradle 插件 3.4.0 及更高版本时,R8 是默认编译器,可将项目的 Java 字节码转换为在 Android 平台上运行的 DEX 格式。但是,当您使用 Android Studio 创建新项目时,默认情况下不会启用收缩、混淆和代码优化。您可以使用以下代码启用它们 -
android
buildTypes
release
// Enables code shrinking, obfuscation, and optimization for only
// your project's release build type.
minifyEnabled true
// Enables resource shrinking, which is performed by the
// Android Gradle plugin.
shrinkResources true
// Includes the default ProGuard rules files that are packaged with
// the Android Gradle plugin. To learn more, go to the section about
// R8 configuration files.
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'),
'proguard-rules.pro'
...
对于更喜欢冒险的玩家,R8 也有完整模式。为了尝试这一点,您可以在 gradle.properties
文件中另外设置以下内容。3
android.enableR8.fullMode=true
这会开启更多优化,从而进一步减小应用大小。但是,您可能需要一些额外的保留规则才能使其正常工作。在此处了解更多信息 - https://youtu.be/uQ_yK8kRCaA
【讨论】:
启用 android.enableR8.fullMode=true 时应用程序崩溃 -> 原因:java.lang.UnsupportedOperationException:无法实例化抽象类!类名:e.c.a.l.k0 -> 原因:java.lang.RuntimeException:无法为类 e.c.a.l.k0 调用无参数构造函数。向 Gson 注册此类型的 InstanceCreator 可能会解决此问题。使用 Android Studio 4.0【参考方案4】:R8 是 Android Studio 3.4 及更高版本中可用的默认工具。无需显式启用 R8。只需从 app/build.gradle
文件中删除 useProguard true
行。
buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
【讨论】:
以上是关于Gradle:DSL 元素“useProguard”已过时,将很快被删除的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件Gradle 构建机制 ② ( Groovy 语言 DSL 特性 | settings.gradle 配置文件解析 | 配置子模块工程目录 | 顶层配置 )