2022/08/06

[android] gRPCの準備をしてみよう(2022年8月)

Android で gRPC をしてみたいので、今の最新と思われる情報でやってみる。
便利なライブラリが公開されているかもしれんが、まずは gRPC のサイトに従ってやってみよう。

Quick start | Kotlin for Android | gRPC
https://grpc.io/docs/platforms/android/kotlin/quickstart/

プロジェクトは Kotlin で、Android OS は 8.0 にした。あまり下げすぎても上げすぎてもなあ、というくらいで決めた。

そこまではよかったのだが、この Quick Start は example code を使うようになっていた。
うーん、プロジェクトに何も入っていないところからやりたかったのだが・・・。
仕方ないので、プロジェクトファイルから変更箇所を探していこう。

grpc-kotlin/examples at master · grpc/grpc-kotlin · GitHub
https://github.com/grpc/grpc-kotlin/tree/0681fc85677e2cca53bdf1cbf71f8d92d0355117/examples

ここが protobuf のファイルから生成された gRPC API のライブラリ?にアクセスするヶ所を作っているのだと思う。

private val greeter = GreeterGrpcKt.GreeterCoroutineStub(channel)
  

しかし GreeterGrpcKt という class はGitHub にはない。
package が io.grpc.examples.helloworld なのでこの proto ファイルでよいと思うので、自動生成されるのだろうか? 検索したら "BUILD.bazel" というファイルの中に protos/ がしばしば見つかる。

Bazel上のAndroid  |  Android オープンソース プロジェクト  |  Android Open Source Project
https://source.android.com/setup/build/bazel/introduction

うーん、サンプル伸びるど手順だと gradle を使うようだから、とりあえずは気にしなくてよいのかな?

それにしても Stub とかテスト用のコードが多いな・・・と思ったら、テストのスタブとは別物だそうだ。

2022年はネイティブ×gRPCが激アツかもしれん
https://zenn.dev/efx/articles/e90a93c1bd210e

そうなのか。

 

2021年11月の Google Developers には、Kotlin が protobuf をサポートしたという記事があった。

Google Developers Blog: Announcing Kotlin support for protocol buffers
https://developers.googleblog.com/2021/11/announcing-kotlin-support-for-protocol.html

そこにリンクされていたのが 2020年4月の記事で、これは grpc-kotlin のことを指しているのかな?

gRPC, meet Kotlin | Google Cloud Blog
https://cloud.google.com/blog/products/application-development/use-grpc-with-kotlin

grpc-kotlin のことなら、まあそれを使うと言うことでよしとしよう。
気になるのは Kotlin の protobuf  サポートについてだ。

From a proto definition, you can use the new built-in Kotlin support in the proto compiler to generate idiomatic Kotlin Domain Specific Languages (DSLs).

protobuf のコンパイラを用意しなくてもうまいことやってくれるということだろうか。。。
いや、記事の真ん中くらいに gradle の設定が書いてあるな。サンプルはこちら。なのだが、このサンプルは拡張子が .kts なので Android Studio で普通にプロジェクトを作った場合の build.gradle を文法が異なる。困ったものだ。


grpc-kotlin/examples を Android で使うだけだったらどのくらい削除して大丈夫か調べてみた。
そうしないと、どれがいるものかわからないからだ。

  • grpc-kotlin/ 直下は examples/ 以外は削除してよさそうだ
  • examples/ 直下は、 client/ , native-client/ , server/ , stub-lite/ , stub/ は削除してもよさそうだ
  • examples/protos/ の中は、下の方までたどって helloworld/ 以外は削除してよさそう

ビルドできるかどうかという観点だとこうなった。動くかどうかとはまた別だろうが、動的にファイルを読み込むこともないと思うから大丈夫なのかな?

stub-android/ はいらないかと思ったのだけど android/build.gradle.kts が参照しているのだった。なくすと io.grpc.ManagedChannelBuilder が import できなくなるので何か使っているんだろう。

 

差分がこちら。
JavaVersion や jvmTarget が 11 になったり、androidx.core:core-ktx が 1.8.0 になったりするのは、まあおまけのようなものだ。

https://github.com/hirokuma/grpc-kotlin-sample/commit/64d02c28220ef5b7c7611c0df8ab3f105c09bf61

protos/ と stub-android/ は grpc-kotlin から持ってきた。
追加した位置は grpc-kotlin と同じ高さで、 app/ の中ではなく app/ と同列。 settings.gradle を変更しているのはそれらを module として追加するためだと思う。
build.gradle は protobuf のプラグインを読み込んでいたのをそのまま持ってきた。 stub-android だけ追加してもなんとかなりそうな気もしたが試してはいない。

プロジェクトの依存関係としては、 app が stub-android を参照するようにした。 stub-android は protos を参照するようになっている(もともと)。

 

取りあえずビルドは通ったのだが、Android から呼び出そうとすると、今の私には知識が足りなかった。。

https://github.com/grpc/grpc-kotlin/blob/0681fc85677e2cca53bdf1cbf71f8d92d0355117/examples/android/src/main/kotlin/io/grpc/examples/helloworld/MainActivity.kt

by lazy ?  setContent ??  suspend fun ???  @Composable ???? といった感じだ。

Android Compose のチュートリアル  |  Android デベロッパー  |  Android Developers
https://developer.android.com/jetpack/compose/tutorial?hl=ja

Kotlin もまだ足りてないのに、コルーチンだの Jetpack だのいろいろ追いついていないのだった。
見栄えは悪いが、簡易的に表示まで確認した。

response · hirokuma/grpc-kotlin-sample@27e6b39
https://github.com/hirokuma/grpc-kotlin-sample/commit/27e6b39fe06e66681bc148d0c8a631d2dfbe3179