如何调试第三方Gradle插件?

9

我正在尝试使用 Gradle签名插件 对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 密钥文件吗? - Gabriele Mariotti
是的,它似乎捕捉到了一个键。将keyId更改为无效的值会导致实际的错误消息。 - passy
从PGPSignatureGenerator和PgpSignatory的源代码以及您提供的错误消息来看,sign-plugin获取了空的私钥。请确保您使用类似"gpg --gen-key"的命令创建了有效的签名密钥,并将其传递给android/signingConfigs配置。 - akhikhl
当您调用gpg时,通常会显示一个菜单,其中包含密钥类型的选择。选择其中带有“签名”一词的类型。 - akhikhl
这是正确的密钥。我可以使用 gpg --sign 手动签名并验证它。同时,使用 Maven 的签名插件也能够正常工作。 - passy
2个回答

15
根据Gradle论坛上的 帖子,有一个有点秘密的org.gradle.debug标志可以让您附加调试器。
gradle someTask --no-daemon -Dorg.gradle.debug=true

对于热修复/自定义插件,将您复制和修改后的插件放入rootProjectDir/buildSrc/src/main/groovy即可。您可以在Gradle网站上了解更多关于编写自定义插件的信息。


谢谢,Marcel!作为一个Java/JVM新手,我无法弄清如何在设置标志后附加调试器,但是buildSrc提示非常有帮助。从Gradle git复制最新版本的插件并将其名称更改为唯一标识符(它不会遮盖内置插件)后,结果发现我的崩溃已经在主分支中修复了。 - passy

4
这是我使用IntelliJ完成的方法 - Android Studio基于IntelliJ,因此应该相同,其他IDE类似:
下载有问题的Gradle插件的正确版本源代码,或克隆/访问其版本控制存储库并检出与您正在使用的有问题的Gradle插件版本相对应的相关分支或标签。通过使用“文件”->“从现有源导入新项目”将代码导入IntelliJ。然后,在命令行中运行:
./gradlew someTask -Dorg.gradle.debug=true --no-daemon

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

或者,您可以使用Gradle守护进程,方法是使用./gradlew -Dorg.gradle.jvmargs="标准JVM调试参数",这样您就可以使用任何调试端口,但我没有测试过。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接