Android gradle插件(升级到2.2.0后)在dexguard任务错误“无签名方法:.... getAllLibraries()”时失败

时间:2016-09-20 15:08:01

标签: android-gradle build.gradle dexguard

我在“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插件2.2.0中不可用的东西。

提问时间:

如何调试/修复这样的东西?我已经习惯了一些非常简单的构建方案来自庞大的C ++项目,涉及make文件和各种脚本执行外部工具(我可以轻松检查)源代码级别的每个构建错误,并准确了解哪些二进制文件被调用了什么参数和原因),但这个从一些网络存储库下载了如此多动态部分的gradle生态系统和极慢的Groovy执行控制对我来说有点过于复杂,方式在我的头上。

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

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

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

1 个答案:

答案 0 :(得分:3)

您有两种选择:

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

编辑:

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