【问题标题】:How to disable Dexguard?如何禁用 Dexguard?
【发布时间】:2014-12-16 15:52:21
【问题描述】:

我浏览了文档,寻找如何在运行 gradle 时禁用 dexguard 但保留插件:'dexguard'。

我试图修改 proguardFile getDefaultDexGuardFile('dexguard-debug.pro') 什么都不做,但不幸的是没有运气。我需要为我的功能测试套装 MonkeyTalk 设置没有 dexguard 功能,它现在无法检测 apk。

如何关闭 dexguard 功能?

【问题讨论】:

    标签: android-gradle-plugin monkeytalk dexguard


    【解决方案1】:

    根据 zatziky 对当前 Android Gradle 插件 (v1.0+) 和 Dexguard 插件 (6.1.+) 的回答进行更新

    要创建 dexguard 插件开关,您可以执行以下操作

    在您的根 build.gradle 中向您的 ext 添加一个属性(如果尚未完成,请创建它,see here why you would do that

    ext {
        enableDexGuardPlugin = false
        ....
    }
    

    在您的应用 build.gradle 中添加这样的插件:

    apply plugin: 'com.android.application'
    if(rootProject.ext.enableDexGuardPlugin) {
        apply plugin: 'dexguard'
    }
    

    如果您有图书馆项目,请这样做

    apply plugin: 'com.android.library'
    if(rootProject.ext.enableDexGuardPlugin) {
        apply plugin: 'dexguard'
    }
    

    如果您不需要它们,请从您的调试构建类型中删除所有 proguard 配置(尤其是 getDefaultDexGuardFile('dexguard-release.pro'))。不幸的是,至少对于 lib 项目,所有的构建类型都是在 assembleDebug 中构建的,所以你必须为getDefaultDexGuardFile 提供一个存根,就像 zatziky 说的那样:

    private File getDefaultDexGuardFile(String name) { new File(name) }
    

    您可以将其添加到您的根目录build.gradle,以便每个脚本都有它。

    现在,如果您期望从中获得巨大的性能优势,您可能会感到失望。关键是在调试版本中禁用所有minifyEnabled,因为如前所述,目前 gradle android 是愚蠢的并且可以构建所有构建类型(至少使用库)。您可以使用上面的属性:enableDexGuardPlugin

    release {
        ...
        minifyEnabled rootProject.ext.enableDexGuardPlugin
        ...
    }
    

    【讨论】:

      【解决方案2】:

      无法保持 dexguard 插件开启。

      这是 Eric La Fortune 发给我的解决方法,它有效(Dexguard 6.x):

      要禁用 DexGuard,您需要恢复为 Android 插件。您可以创建一个单独的 Gradle 构建文件。或者,您可以使用 Groovy 选择首选插件。例如。在

      build.gradle:
      boolean dexguard = ......
      
      apply plugin: dexguard ? 'dexguard' : 'android'
      

      你也可以用同样的方式调用实用方法getDefaultDexGuardFile:

      runProguard true
      proguardFile dexguard ?
      getDefaultDexGuardFile('dexguard-release.pro') :
      getDefaultProguardFile('proguard-android.txt')
      

      您确实需要在构建文件中定义此方法的虚拟版本,以防选择标准 Android 插件。在这两种情况下都不会调用它,但它解决了标准插件缺少的方法定义:

      private File getDefaultDexGuardFile(String name) { new File(name) }
      

      【讨论】:

      • 注意:此答案已过时,因为 dexguard 现在不扩展 android 插件,而是作为独立插件使用:apply plugin: 'com.android.application' apply plugin: 'dexguard'
      • @for3st 您好,希望您的解决方案有效,我已将其标记为已接受。
      【解决方案3】:

      在最新版本的 DexGuard 中,您可以通过不列出“proguardFile”行来禁用特定构建变体的处理。

      例如,为调试构建禁用它:

      buildTypes {
          debug {
          }
          release {
              proguardFile getDefaultDexGuardFile('dexguard-release.pro')
              proguardFile 'dexguard-project.txt'
              proguardFile 'proguard-project.txt'
          }
      }
      

      编辑 - 必须删除所有 proguardFiles 才能正常工作

      【讨论】:

      • 我现在没有时间测试它。如果其他人确认此解决方案有效,我将检查此答案是否正确。祝你有美好的一天。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多