Kotlin MultiplatformサポートのGoogle Analyticsライブラリ「Measurer」をつくった


年始から個人的に大流行のKotlin Multiplatform。開発が楽しい。BFF Server触るエンジニアとネイティブエンジニアの距離感が非常に近くなる。「いや、チームとして当たり前でしょ」みたいなツッコミはあるだろうけど、新しい技術を軸にエンジニア達が「あーだこーだ」言ってる楽しい時間がKotlin Multiplatformでは職域が違うエンジニアが議論することで更に熱が加速する現象を目の当たりにしてます。

モチベーション

私はBFF Serverのほうを主に開発していましたが、プラットフォーム横断で共通するロジックをcommonモジュールにつくった辺りからKotlin Multiplatformサポートのライブラリの開発欲が湧いてきました。

当時ですと既存していた2つのライブラリに着目しました。

Kissmeはセキュアストレージの扱いをマルチプラットフォーム化できて、KonformはValidationのユーティリティなライブラリです。また社内からも自作ライブラリが飛び出していたりと活発な流れを感じていました。

どのライブラリも「プラットフォーム横断で共通するロジック」であればKotlin Multiplatformにするコンセプトがあり、私も何か作りたいなーと感じていました。同僚の@AAkiraからGoogle Analyticsのログ送信部分をライブラリするのはどうだろうか、という話をしたのをきっかけにGoogle Analyticsライブラリを作るモチベーションが高まりました。

Measurer

そして開発をしたのがMeasurerです。

GoogleはMeasurement ProtocolというHTTPリクエストのプロトコルを設計しています。このプロトコルをつかえばHTTP/1.1でGoogle Analyticsへログが送信できます。ライブラリはMeasurement Protocolに準拠して開発を行いました。

2019/2時点で公開されているパラメータとヒットタイプの全てをサポートしています。また1件ずつ送信するのではなくバッチリクエストにも対応していて20件までは一度に送信できます。

今のところJVMとAndroidをサポートしていてiOSとJSは順次対応していく予定です。

使い方

Readmeに記載しているので簡単に使い方を紹介します。

Measurerをプロジェクトに依存させたらcommon moduleに送信部分を実装します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
object GoogleAnalytics {

    private val httpClient = SampleHttpClient(SampleHttpClientConfig.httpClient, SampleNapierLogger())

    suspend fun pageTracking(ua: String) {
        val mp = MeasurementProtocol
            .Builder(
                trackingId = ua,
                httpClient = httpClient
            ).build()

        mp.also { ga ->
            ga.pageView("mydemo.com", "/home").apply {
                clientId = "555"
                documentTitle = "homgepage"

                contentGroup = ContentGroup(index = 1).apply {
                    value = "news/sports"
                }
            }

            ga.pageView("mydemo.com", "/home").apply {
                clientId = "555"
                documentTitle = "homgepage"

                contentGroup = ContentGroup(index = 2).apply {
                    value = "news/finance"
                }
            }
        }.send()
    }
}

上記のGoogleAnalyticsをJVMとAndroidのプラットフォームから呼び出すだけです。

1
GoogleAnalytics.pageTracking(trackingId)

Google Analyticsの送信部分がワンソースで管理され各プラットフォームでマルチユースできています。

ライブラリ標準でHTTPクライアントはKtor、ログ出力はNapierを使っています。この部分はプロジェクトで使いたいライブラリに置き換えられるようにしています。

「ライブラリに置き換えられるようにしている」としましたが、HTTPクライアントやログのライブラリは2019/2時点ではKtorとNapierの選択肢しかないです。Kotlin Multiplatform界隈のライブラリはそこまで出てきてない状況をお分かりいただけると思います。

まとめ