kaptでHelloWorld

おはようございます。毎度おなじみsaikiです。

タイトル通り、kaptでHelloWorld的な事をしていこうと思います。

サンプルリポジトリ:https://github.com/sasasaiki/my-kapt-sample/commits/master

kaptとは?

kotlin-annotation-processing tools の略(多分)でjavaのPluggable Annotation Processing API をkotlinでも使えるようにするためのpluginです。

要するとkotlinでアノテーション(@Hogeみたいなやつ)を使ってコードを生成するための仕組みです。

こいつを使うことで、コンパイル時にアノテーションをつけたクラスや関数の情報を元にコードを生成することができます。

AndroidだとDagger2やLifeCycleに使われています。

こんな感じで@OnLifecycleEventをつけるとそれをライフサイクルに従って実行するようなコードが生成されるわけです。

いままで@ってそういうもんなんだろうなあという程度の認識で深く考えていませんでしたがこういうことだったんですね。
(ただし@がついているからといってannotationProcessingとは限らないです)

使ってみる

ということで使ってみましょう。
AndroidStudioでやります。

プロジェクトを作る

普通にプロジェクトを作りましょう。
Kotlinであれば他はなんでもいいです。

モジュールを作る

今回実装するモジュールを作ります。
Kotlinで書きますがjavaモジュールとして作ります。
アノテーションを実装するannotationとコード生成部分を実装するgeneraterを作成します。
一般的のライブラリもメインのモジュールとなんたら-compilerみたいに別れてることが多いようです。
私もなんたら-compilerみたいな名前にすればよかったなあと思いつつ本筋とは関係ないのでそのまま進みます。

build.gradleを書く(鬼門)

なんか知らないけどものすごく苦労しました。
AndroidStudioが急に自動生成してくれたりしますがコンパイル通らないことが多々あるので気を付けましょう。
モジュール2つとappのbuild.gradleをいじります。

まずはapp/build.gradle

kotlin-kaptと二つのモジュールへの依存を追加します。

generatorの方はkaptであることに注意しましょう。

コメントにもありますがsrcDirはなんかコマンドで実行するときに必要みたいな記述をどこかで見た気がして追加したのですが忘れました。

次はgenerator/build.gradle

先ほどと同じくkotlin-kaptをapplyします。

いくつか必要なライブラリがあるので追加します。

まずkotlinpoet。これはクラスを生成するときにあると便利。

次にauto-service。これはaptを使う際に必要なフォルダをいい感じに勝手にやってくれるそうです。META-INF/servicesとかそこらへんを。あんまり詳しくは調べてないですがとりあえず必要なので入れましょう。kaptとimplementation両方必要です。

最後にannotaionも追加します。コード生成時にアノテーションを読む必要があるからですね。

コメントアウトされている冒頭三行はAndroidStudioが勝手に入れてくれたのに存在しているとコンパイルが通らなかったのでコメントアウトした残骸です。

annotation/build.gradle

特筆することはありませんが一応貼っておきます。

最後にルートにある/setting.gradleにmoduleを追記しましょう。

(自動で入れてくれたような気もしますが)

一旦ビルドしてみて通れば多分OK。
ここまで終われば全部終わったようなものです。
嘘です。

アノテーションを定義

annotationモジュールに適当なファイルを作ってアノテーションを定義します。

今回はapp/saiki/annotation/Greeting.ktとします。

簡単ですね。
@Targetを使うことでクラス用なのかファンクション用なのか指定することができます。

アノテーションをつける

先ほど定義したアノテーションを使ってみましょう。
今回はmainActivityにつけます。

これだけ。

processer書く

さあ本日のメインコンテンツprocesserを書いていきます。
1ファイルなのでとりあえず全部はります。

だいたいコメントに書いたんで見てもらえればと思います。
AbstractProcessorもしくはBasicAnnotationProcessorを継承すると書いてありますがBasicAnnotationProcessorの方がシンプルでいいよ!みたいなことが下記参考ページに書いてありましたのでBasicAnnotationProcessorを使うのが良さそうです。

View story at Medium.com

ビルド

ここまでやってビルドするとパス/ファイルにコードが生成されます。
今回生成されたコードは下記になります。
app.saiki.generated.MainActivity_Greeter

シンプル。

使ってみる

最後に使ってみましょう。
すでにコード生成済みなので補完も普通に効きます。
逆に言うとコードが生成されていないと補完もコンパイルもうまくいかないのでご注意ください。

こんな感じで書いて実行すると

こんな感じで無事ログが出力されました。

まとめ

ということでkaptでハローワールドしてみました。

より良くするなら、ビルドしてコードを生成する前でもコンパイルできるような仕組みや、そもそも呼び出しのコードを書かずともアノテーションだけで動作するようにする等といったことをすると素敵ですね。

今度やって見たいと思います。

サンプルリポジトリと参考URLです。

https://github.com/sasasaiki/my-kapt-sample/commits/master

View story at Medium.com

View story at Medium.com

View story at Medium.com

https://techblog.yahoo.co.jp/advent-calendar-2016/transform_api/

ではまた。

自己紹介
Android開発エンジニアです。
kotlinがお気に入り。

 

おすすめ

Udemyのビデオ講座は本当に捗るので学習にとてもおすすめです。まじで。


スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください