DroidKaigi 2019でbuild.gradle.ktsに移行しようという話をした

Yuki Fujisaki (rai)
8 min readFeb 17, 2019

--

昨年に引き続き、今年もDroidKaigiで登壇し、昨年11月に1.0がリリースされたGradle Kotlin DSLのメリットと、どうやって移行していくか実際の手順についての話を共有した。

DroidKaigiも今年で5回目になり、Androidエンジニア向けの技術共有に特化したものとしては国内で一番大きいカンファレンスとなっている。

モチベーション

昨年の9月末からDroidKaigi 2019のプロポーザルの募集期間が始まり、なにかネタがないか考えたところ、 昨年アムステルダムで開催されたKotlinConf 2018に参加した際に、Paul MerlinのType-Safe Build Logic with Gradle Kotlin DSLの話を聞いて、自分でもbuild.gradle.kts化をやってみようと思っていたのを思い出したので、それについて話そうと思った。

自分自身、build.gradleについてはプラグインの作り方を紹介できる程度に知識がある状態で、それらをKotlinで書くことによって得られるメリットもなんとなく分かるものの、それをサンプルではなく実際に開発されているAndroidプロジェクトに適用しようとしたときにどんな課題があるのか、実際の移行計画はどのように立てるべきなのか、肌感を持って知れる情報源があったら助かるなーと思っていたので、そんな感じの概要を書いて投稿したところ、結果的に採択された。

なお、プロポーザルを投稿する時点ではKotlin DSLを実際に書いたことはなく、DroidKaigiでの採択が実際にkts化を行うきっかけとなった。

内容

セッションの内容は、現時点でbuild.gradleのKotlin化に興味がある人が、実際に移行するための再現可能な手順をなんとなく理解して、Kotlin化のメリットをチームメンバーに伝えながら、自分のプロジェクトにも手を入れていくことができるようになることがゴール。

登壇資料

発表の内容は基礎編と実践編の2部構成になっている。基礎編は、Android Studioで作成できるブランクプロジェクトで実際のkts化の流れと効果を一通り体験し、とにかくkts化を一度成功させて、環境を手に入れて触れるようにすることが目標。成功体験がないと知識を詰めるモチベーションも湧かないよね。実践編は現実のプロジェクトを移行する上で引っかかるポイントについてカバーして、ノウハウと解決策を詰め込んでいる。

KotlinになるとIDEが働いてくれる

Kotlin化のメリットは、とにかくIDE(Android Studio)からのフィードバックがリアルタイムに得られることによる生産性の向上に尽きると思う。もちろんリファクタも可能だし、コードジャンプも便利だけど、間違っていることを書いてるその場で指摘してくれることによるイテレーションの高速化は本当に気分が楽。(21世紀なんだからコード書くのにそのぐらいの支援は欲しい)

また、言語の壁が下がるのもメリットかもしれない。発表を始める前に時間があったのでその場の皆さんに聞いてみたところ、Groovyについてしっかり理解した上でbuild.gradleを書いているケースは(少なくともその場では)かなり少数派だった。実際、自分自身が見る機会があるリポジトリも「とりあえずこれで動いた」があらゆる所でコピーされて使われている印象が強い。プロダクションコードと同じ言語のKotlinであれば今よりはメンテやリファクタに積極的になれるはず。

解説にあたり、普段なんとなく使っている ext とは何者なのか、といった言語に依存しないGradleの基礎知識についてもおさらいするなど、build.gradleについての理解が深まる内容になっていると思うので、興味のある方は動画を見てもらえると嬉しい。

セッション動画(約30分)

感想

準備は大変だったけど発表してよかった。発表自体も好評だったし、Kotlin DSL化のモチベーションを共有できたし、自分の中で知識も整理された。今なら build.gradle.kts のことについて聞かれたら大体答えられると思う。

やっていきましょう

DroidKaigiに限らず登壇者としてイベントに参加すると、他の参加者と話がしやすくなるというのは大きなメリット。特にDroidKaigiは、事前に登壇者向けのパーティがあるのだけど、そこに居るのは当然みんな登壇者なので、会う人会う人どんな発表するの?こんな発表するよ!って話ができ、話題に困らなくて楽しい。慣れない英語で話す壁もだいぶ下がって、海外の開発者と繋がることもできたりする。

DroidKaigiも今や人気カンファレンスなので採択のハードルも高いけど、参加するなら是非登壇をオススメしたい。

Under the hood

登壇については以上で、ここからはオマケ。たくさんツイートを貼りつつ、舞台裏を紹介。

ASはまだktsサポートしてないぞ宣言

Android Studioの中の人が「Gradle Kotlin DSLはまだAndroid Studioではサポートされてない」って言うもんだから、ちょwww発表の前提が崩れるwwwwwと思ったら 完全サポート はしてないという話でした。まあ確かに挙動は完全ではないけど、シンタックスハイライトやリファクタといった機能は動くので、まあ大丈夫でしょ、って感じで発表内容はそのまま行くことに。

自分です

Gradle Kotlin DSLの深淵を覗く

build.gradle.kts における各種記法を説明するにあたって、例えば、

val kotlinVersion by extra("1.3.11")

について、

  • 何故こう書かないといけないのか?
  • 何故これが動くのか?
  • 何故この書き方が採用されたのか?

みたいな話の背景を知るために、ドキュメントやコードを読みつつそろそろ理解できてきたというタイミングで、ふと我に返ってしまった。Kotlin DSLの実装には、確かに正しく動くけどそんな発想出てこないでしょ…普通…ってコードがたくさん埋まってて楽しいのだけど、これを全部理解するのはいろんな文脈を知っている必要があって大変だなという感想。

その他地雷もたくさん踏んだけど、資料の中で解説したのでみんなは回避してね!

登壇前日にAndroid Studio 3.3.1がリリースされる

作った資料の内容に影響する変更がないか確認するの大変なので、カンファレンス直前のリリースは控えて欲しい(わがまま)

なお確認した結果、自分の発表内容に影響する変更はなかったのでした。

締めの挨拶

2年連続でスタッフ兼最終登壇者だったので、DroidKaigi自体を締める役目も仰せつかった。

完全に期待されている
がんばります
DroidKaigi 2019おしまい!ってスライドを仕込んだりした

資料作り

ほぼ昨年と同じで、Markdownでアウトラインだけ作成→アウトラインの段階で話してみて時間調整→Marpでスライド化→Decksetで見た目調整しつつ仕上げ。アニメーションGIF入れると、どうしてもPDFエクスポートしかないMarpでは完結しなくて、一方で作業環境としてはDecksetよりも圧倒的にMarpの方が効率がいいので悩ましいところ。

スケジュール的には1ヶ月ぐらい前から諸々調べ始め、スクリーショットやコード断片をScrapboxに書きためつつ、1週間前ぐらいから発表のアウトライン化、2日前Deckset版が一旦形になり、1日前から当日発表直前までDeckset化と微調整をしていた。DroidKaigi 1日目の時点で資料が完成していないのは心理的にも厳しかったけど完全に自業自得。11月から発表することは分かってたんだから… 😇

気づけば3年連続で登壇してるので、慣れからの油断が出てきてしまった感じ。

ともあれ、DroidKaigi 2019もこれで無事終了。また次回会いましょう!引き続き、スタッフとしての話(オープニング動画、会場BGM、写真撮影)も書いていきたい。

追記

セッションフィードバックが送られてきた。好評だったようでなにより!

なお数値は中央値だそう

--

--

Yuki Fujisaki (rai)

Co-founder and CEO of @DeployGate, Android, Software Engineering, DroidKaigi, Speaks Japanese and English, Twitter: @tnj