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开发指南

android中的build.gradle是干啥用的

Gradle DSL

Android Gradle 插件Gradle 构建机制 ② ( Groovy 语言 DSL 特性 | settings.gradle 配置文件解析 | 配置子模块工程目录 | 顶层配置 )

未找到 Gradle DSL 方法:android()

如何使用 gradle kotlin-dsl 添加新的源集