3

我在“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)

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

更改后发生错误(在所有相关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 中对其进行调试,但是虽然调试器中的“暂停”按钮看起来像是暂停了进程,并且我可以恢复执行,但它不会显示任何代码(可能需要 gradle 的来源以及所有涉及的插件?)。

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


提问时间:

如何甚至调试/修复这样的东西?我已经习惯了来自大型 C++ 项目的一些重要的构建方案,这些项目涉及 make 文件和执行外部工具的各种脚本(我可以轻松地在源代码级别检查每个构建错误,并准确了解使用什么参数调用二进制文件以及为什么) ,但是这个 gradle 生态系统有这么多从一些网络存储库下载的动态部分和极慢的 Groovy 执行控制,对我来说有点太复杂了,超出了我的想象。

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

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

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

4

1 回答 1

3

你有两个选择:

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

编辑:

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

于 2016-09-20T15:44:07.903 回答