こんにちはこんばんは。STORES のn-sekiです。
STORSE 決済 というサービスのAndroidアプリ/SDKを開発しています。
本記事ではアプリではなく、SDKでの開発トピックを取り上げようと思います!
このSDKは決済 SDKと呼んでいて、モノとしてはAndroidライブラリ(aar)になっており、アプリに組み込んでいただくことでクレジットカードなどのキャッシュレス決済手段をかんたんに導入できます。
ライブラリなので開発者向けにAPIドキュメントも公開しているのですが、もともとJavaで実装されていたこともあり、javadoc
コマンドを使って生成したドキュメントを公開していました。
少し前にライブラリインタフェースのフルKotlin移行を実施した*1のに併せ、ドキュメント生成ツールをDokka
に移行しました。
今回はこのときの話を書いてみます。
Javadoc
まずJavadocをかんたんに紹介します。
/** * Javaのサンプルクラスです * * @author n-seki * @since 1.0.0 */ public class JavaSample { /** * サンプルメソッド<br> * {@link JavaSample#newFunction()}も参照してください * * @return 計算結果 */ public int sample() { return 0; } public void newFunction() {} }
上記のように/*
で囲った部分にクラス/メソッドの説明文や、@
から始まるタグを利用することで形式的なコメントを記述することができます。
そして統一されたルールでコメントを書けるだけではなく、javadoc
コマンドを使うことでHTML形式のAPIドキュメントを生成できます。
試しに上記サンプルコードに対してjavadoc
を使うとこのようなドキュメントが生成されます。
今回はこのような単純なコマンドを実行しました。
javadoc -public JavaSample.java
生成されたファイル一式をWeb上で公開すればAPIドキュメントの完成です。
Dokka
Dokka
はKotlin向けのAPIドキュメント生成ツールです。
Kotlin向けと謳っておりKDoc
コメントを解釈できるのはもちろん、上述のJavadoc
も解釈できるようです。
KDoc
まずKDoc
を紹介します。KDoc
はKotlinのドキュメント用言語です。Javadoc
と同じ立ち位置ですね。
KDoc
の例をみてみましょう。
/** * Kotlinのサンプルクラスです * * @author n-seki * @since 1.0.0 */ class KotlinSample { /** * サンプルメソッド<br> * [newFunction]も参照してください * * @return 計算結果 */ fun sample(): Int { return 0 } fun newFunction() {} }
Javadoc
と同様@
から始まるタグを使うことができます。
全体的にJavadocと似ていますが、記法など異なる部分もあるので詳しくはKDoc
のドキュメントを参照ください。
Dokkaの導入
AndroidなどのGradle
なプロジェクトの場合、gradleファイルで設定を行って、dokkaHtml
などの定義ずみGradleタスクを実行することでドキュメントが生成できます。
./gradlew dokkaHtml
このタスクだとHTML形式のドキュメントが生成されますが、Dokka
では他のフォーマットの生成もサポートしています。たとえば、まだAlphaなステータスのようですが、Markdown形式もサポートしているようです。
サポートされているすべての形式やGradleプロジェクトへの導入方法については公式ドキュメントを参照してください(丸投げ)。
Dokkaへ移行!
上述したとおり、決済 SDKはJavaからKotlinへの移行実施中だったので、だいたい以下のような流れで対応しました。
- ライブラリをJavaからKotlinに書き換えるときに、一緒に
Javadoc
をKDoc
に書き換える- Android Studioの
Convert to Kotlin from Java
によってほぼほぼKDoc
に書き換わるので、必要があれば人の手で微調整
- Android Studioの
Dokka
をプロジェクトに導入して検証- 決済 SDKのリリースに合わせて
Dokka
で生成したドキュメントを公開!
公式ドキュメントが丁寧だったのでDokka
の導入は悩むこともなく、とてもスムーズでした!
......と言いたいところですが、何事にも予想外のことはあるわけで、2点ほど頭を使うポイントがありました。
つまずいたこと
設定が適用できない
Dokka
ではドキュメントにロゴを表示したり、フッターに任意の文字列(コピーライトなど)を表示したりとさまざまなカスタマイズができます。
設定方法は公式ドキュメントに記載されているとおりです。
https://kotlinlang.org/docs/dokka-gradle.html
が、このとおりに実装しても設定が適用されずに困ったぞ......となりました。
tasks.withType<DokkaTask>().configureEach { dokkaSourceSets.configureEach { // 設定 } }
改めてドキュメントにあたってみたところSource Set Configuration
という章があり、Gradleのソースセットごとに設定が行えるよ、ということが書いてありました。
これを参考に次のように実装したところ、無事に設定が適用されました。
tasks.withType<DokkaTask>().configureEach { dokkaSourceSets.configureEach { named("main") { // 設定 } } }
プロジェクト構成によって異なる部分にはなりますが、同じように設定がうまく適用できない場合にはSource Set Configuration
を見直してみると良いかもしれません。
KDocにはDeprecatedタグがない
Javadoc
には非推奨を表すDeprecatedタグがあり、これが付いていると生成したドキュメントに「非推奨」と表示されます。
しかしKDoc
には非推奨を表現するタグはなくドキュメントにこのような記述があります。
KDoc does not support the @deprecated tag. Instead, please use the @Deprecated annotation.
というわけで、Deprecatedアノテーションを使う必要があります。
Dokka
はDeprecatedアノテーションも見てくれて、これが付いているメソッドやプロパティは「非推奨」とマークされます。アノテーションに渡すmessage
もドキュメントに取り込んでくれるため、Javadoc
のDeprecateタグと同等の情報をドキュメント化できます。
また@Deprecated
アノテーションでReplaceWith
も渡してあげると、より親切なドキュメントが生成できます。
@Deprecated( message = "v1.1.0から非推奨になりました", replaceWith = ReplaceWith( expression = "newFunction", imports = ["com.example.blogmigrationdokka.KotlinSample"], ), ) fun oldFunction() {}
@Deprecated
アノテーションが付いていると開発時にもAndroid Studioで警告やreplace提案をしてくれるので積極的に利用していきたいですね。
まとめ
ちょっとはまったところもありつつ、ドキュメントが充実していることもあってサッとDokka
に移行できました。
Dokka
で生成したドキュメントはライトモード/ダークモードの切り替え機能が標準でついていたりと、javadoc
でドキュメント生成していたころと比べると全体的にリッチなUIになるのも嬉しいポイントでした。
以上、移行でちょっとだけつまずいたけどDokka
はいいぞ!というお話でした。