Android gradle 插件(升级到 2.2.0 后)因 dexguard 任务错误而失败 "No signature of method: ....getAllLibraries()"

Android gradle plugin (after upgrade to 2.2.0) fails at dexguard task error "No signature of method: ....getAllLibraries()"

我在 "dexguard" 任务期间得到了这个堆栈跟踪(所有行都以时间戳和 [ERROR] [org.gradle.BuildExceptionReporter] 开头):

Caused by: groovy.lang.MissingMethodException: No signature of method: com.android.build.gradle.internal.core.GradleVariantConfiguration.getAllLibraries() is applicable for argument types: () values: []
at com.guardsquare.dexguard.h.getProguardFiles(DexGuard7.1.23:1090)
at com.guardsquare.dexguard.ao.doCall(DexGuard7.1.23:784)
at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:590)

我正在使用 DexGuard v7.1.23,Android Studio 2.2,默认 gradle 2.14.1,Windows 7 64b。

错误发生在我更改后(在所有相关的 build.gradle 脚本中):

     dependencies {
-        classpath 'com.android.tools.build:gradle:2.1.3'
+        classpath 'com.android.tools.build:gradle:2.2.0'

使用 gradle 插件 2.1.3 构建工作。

我尝试通过远程连接到 gradle 在 Android Studio 中调试它,但是虽然调试器中的 "pause" 按钮看起来像是暂停了进程,但我可以继续执行时,它不会显示任何代码(可能需要 gradle 和所有相关插件的来源?)。

我认为错误最有可能出现在 dexguard gradle 插件代码中,它访问了一些在 android gradle 插件 2.2.0 中不再可用的内容。


提问时间:

如何甚至 debug/fix 这样的事情? 我已经习惯了一些来自大型 C++ 项目的重要构建方案,这些项目涉及 make 文件和执行外部的各种脚本工具(我可以在其中轻松检查源代码级别的每个构建错误,并准确了解使用什么参数调用了哪个二进制文件以及为什么),但是这个 gradle 生态系统有很多从某些网络存储库下载的动态部分,而且速度非常慢 Groovy 执行控制对我来说有点太复杂了,让我难以理解。

是否有(不是很困难)调试构建过程的方法(我不是在谈论本机调试器和调试 VM 本身,虽然可能,但结果听起来毫无用处)?也许一些简单的方法也可以从存储库中获取源包,类似于 linux 的 -src.pkg,只需添加依赖项?

或者我可以在某处找到缓存的 dexGuard gradle 插件二进制文件,反汇编它,检查它调用的是什么,然后在我自己的脚本中手动重写它吗?

关于如何获得更多关于那个 gradle blackbox 的信息的任何建议表示赞赏,即。它是如何工作的,为什么它失败了,等等......(虽然我不考虑正确地学习整个 Groovy ,特别是因为即使对于核心语言我也没有那种心态(我是一个简单的人,用 ASM 和 C++ 思考),如果我理解得很好,gradle 会以非常特定领域的方式扩展它,所以纯粹的 Groovy 甚至不足以流利地理解那些脚本?)。

你有两个选择:

  • 继续使用 Android gradle 插件 2.1.0 或更早版本
  • 将 DexGuard 更新到支持 2.2.0+ 的更新版本(最新版本是 7.2.12)

编辑:

为了更好地理解为什么会发生这些事情:DexGuard 插件使用 Android gradle 插件中的 API。如果 API 在新版本中发生变化,DexGuard 插件必须适应较新的 API,同时仍然保持对旧版本的向后兼容性。