【问题标题】:How to debug a third-party Gradle plugin?如何调试第三方 Gradle 插件?
【发布时间】:2013-12-26 19:01:14
【问题描述】:

我正在尝试使用 gradle signing plugin 签署 Android AAR 工件。不幸的是,我在这个过程中得到了一个相当无用的NullPointerException

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':library:signArchives'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':library:signArchives'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
        [...snip...]
        at org.gradle.launcher.Main.main(Main.java:37)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32)
        at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
        at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:33)
        at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130)
        at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: java.lang.NullPointerException
        at org.bouncycastle.openpgp.PGPSignatureGenerator.initSign(Unknown Source)
        at org.bouncycastle.openpgp.PGPSignatureGenerator.initSign(Unknown Source)
        at org.bouncycastle.openpgp.PGPSignatureGenerator$initSign.call(Unknown Source)
        at org.gradle.plugins.signing.signatory.pgp.PgpSignatory.createSignatureGenerator(PgpSignatory.groovy:54)
        at org.gradle.plugins.signing.signatory.pgp.PgpSignatory.sign(PgpSignatory.groovy:64)
        [...snip...]
        ... 52 more


BUILD FAILED

调试此异常的最简单方法是什么?有没有办法将调试器附加到gradle?我可以构建签名插件,插入一些日志语句并告诉我的构建选择我的自定义版本而不是它附带的版本吗?

【问题讨论】:

  • 您是否提供了 pgp 密钥文件?
  • 是的,它似乎拿起了一把钥匙。将 keyId 更改为无效会导致实际的错误消息。
  • 从 PGPSignatureGenerator 和 PgpSignatory 的源代码和你给出的错误信息来看,sign-plugin 得到了 null 私钥。请确保您使用“gpg --gen-key”之类的命令创建了有效的签名密钥,并将其传递到 android/signingConfigs 配置中。
  • 当您调用 gpg 时,它通常会显示一个带有键类型选择的菜单。选择带有“签名”字样的类型。
  • 这是正确的键。我可以使用gpg --sign 手动签名并验证它。它也可以使用 maven 的签名插件。

标签: java android debugging gradle


【解决方案1】:

根据thread in the gradle forums,有一个有点秘密的org.gradle.debug-flag 允许您附加调试器。

gradle someTask --no-daemon -Dorg.gradle.debug=true

对于修补程序/自定义插件,将您复制和修改的插件放入rootProjectDir/buildSrc/src/main/groovy 就足够了。您可以在 Gradle site 上阅读有关编写自定义插件的更多信息。

【讨论】:

  • 谢谢,马塞尔!作为一个 Java/JVM 菜鸟,我不知道如何在设置标志后附加调试器,但 buildSrc 提示确实很有帮助。从 Gradle git 复制最新版本的插件并将其名称更改为唯一标识符(它不会隐藏内置插件)后,事实证明我的崩溃已在 master 中修复。
【解决方案2】:

这就是我使用 IntelliJ 的方式 - Android Studio 基于 IntelliJ,因此应该是相同的,其他 IDE 应该是相似的:

下载错误 Gradle 插件源代码的正确版本,或克隆/访问其版本控制存储库并检查与您正在使用的错误 Gradle 插件版本相对应的相关分支或标签。使用 File -> New project from existing sources 将代码导入 IntelliJ。然后在命令行运行:

./gradlew someTask -Dorg.gradle.debug=true --no-daemon

并使用端口 5005 创建新的远程调试连接,设置初始断点并启动它。

或者,您可以通过 ./gradlew -Dorg.gradle.jvmargs="标准 JVM 调试参数" 来使用 Gradle 守护程序,这样您就可以使用任何您喜欢的调试端口,但我没有对此进行测试.例如:

./gradlew \
  -Dorg.gradle.jvmargs="-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=y" \
  someTask

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多