nashcft's blog

時々何か書く。

Android project を Gradle 7.0 にしたら JitPack で publish できなくなった

tl;dr

発見

私が作ってる cast-sdk-ktx は JitPack を使ってるのだけど、数日前の Cast SDK のバージョン更新に対応して、ついでに色々依存をアップデートしたのをリリースしようとしたら publish でこけてしまった。
ローカルで build する分には問題なかったので何でだろーって build log を見たところ以下のような log が出てた:

> Configure project :
Gradle version Gradle 7.0

FAILURE: Build failed with an exception.

* Where:
Script '/script/maven-plugin.gradle' line: 2

* What went wrong:
A problem occurred evaluating script.
> Failed to apply plugin 'com.github.dcendents.android-maven'.
   > Could not create plugin of type 'AndroidMavenPlugin'.
      > Could not generate a decorated class for type AndroidMavenPlugin.
         > org/gradle/api/publication/maven/internal/MavenPomMetaInfoProvider

com.github.dcendents.android-maven が原因とのこと。

調査

JitPack では publish のための build の際、project の gradle tasks を調べ、 publish に必要な task が存在しなかった場合にそれを追加するために plugin を導入する。
例として cast-sdk-ktx:0.1.0 の build log を見てみると、以下のような出力が見られる:

...

Getting tasks: ./gradlew tasks --all
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 -Dhttps.protocols=TLSv1.2
Tasks: 

WARNING:
Gradle 'install' task not found. Please add the 'maven' or 'android-maven' plugin.
See the documentation and examples: https://jitpack.io/docs/

Adding android plugin
Adding maven plugin
Found android library build file in cast-ktx
Found android library build file in cast-framework-ktx
Found android library build file in cast-tv-ktx
Running: ./gradlew clean -Pgroup=com.github.nashcft -Pversion=0.1.0 install
...

https://jitpack.io/com/github/nashcft/cast-sdk-ktx/0.1.0/build.log

上の抜粋では install task が見つからないことを理由に plugin を導入すると言われている。この際に /script/maven-plugin.gradle の apply が追記されて、その中に com.github.dcendents.android-maven を使った publication の設定が記述されているのだろう。

今回はこの plugin の apply 中にエラーが発生しているので、原因は android-maven plugin 中の実装と考えられる。Build script の実行時に plugin のエラーが起こったという状況なので関連するこちら側の変更は Gradle のバージョンだろう。Build が成功している 0.1.0 と今回エラーが発生した commit では Gradle が 6.8.3 から 7.0 に上がっている。

ところでこの com.github.dcendents.android-maven だが、既に役割を終えているためにメンテナンスが止まっており、 repository も archive されている。

github.com

というわけで今回の問題が修正されることはないし、じゃあこれ以上は詮無しということで原因を追いかけるのも終わり。きっと "Could not generate a decorated class for type" でググれば出てくるだろう。

対処

上述のように publication のための plugin が project に入ってないと com.github.dcendents.android-maven を使われてしまうので、project に publication のための設定を追加することでこの問題を回避できる。
Android Maven Plugin の README でも言及があるが、 AGP 3.6.0 以上では Gradle の Maven Publish Plugin が使えるので、それを apply して設定を追記すれば publication ができるようになる。

developer.android.com

JitPack の GitHub organization にある Android の sample repo を見た感じ最低限の設定だけ書けば動きそう。

https://github.com/jitpack/android-example/blob/19d4ad07071b410dce8bccde0727fd159327db93/library/build.gradle

というわけで cast-sdk-ktx にも Maven Publish Plugin を導入する pull request を作った。Publication の設定にどんなのがあるか色々眺めながら書いてたので JitPack の example より記述量が多くなっている。

github.com

これを書くことになると JitPack のいいところだったお手軽 publish の度合いが下がるので、もうちょっと頑張って Maven Central に移行してしまってもいいのでは...? と思わないこともない。