Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin/MPP getting started and troubles

Kotlin/MPP getting started and troubles

Masaya Yashiro

March 27, 2019
Tweet

More Decks by Masaya Yashiro

Other Decks in Programming

Transcript

  1. Kotlin/MPPでX-PF
    事始めのつまづきポイント
    2019-03-27
    どこでもKotlin #7
    @yashims85

    View full-size slide

  2. 誰?
    名前: 屋代昌也
    会社: 株式会社モバイルファクトリー
    Twitter: @yashims85
    Github: yashims

    View full-size slide

  3. Mobile Factoryではエンジニアを募集し
    ています。
    位置ゲーやBlockChainにご興味のある
    かたはぜひお声がけください!

    View full-size slide

  4. そもそもなんでKotlin/MPP触りだ
    したのか?

    View full-size slide

  5. それはね、
    READMEにこう記されてい
    るわ

    View full-size slide

  6. 遥か悠久の昔、cocos2dxのプロジェクトがあった。
    cocos2dxのプロジェクトはたいそう荒ぶり、ついには android-Appとios-Appという2
    つのリポジトリを生み眠りについた。
    cocos2dxより生まれし2つのリポジトリは数刻の後に空を作り海を作り大地を作っ
    た。
    やがて人々が生まれ、彼らはこの厳しくも儚い大地に根を下ろしその繁栄を謳歌した
    のである。
    時は今、天は唸り、地は裂け、この厳しくも儚い世界はまさに終わりを迎えようとして
    いた。 人々は思い出したのである。彼らが在る天地は荒ぶる cocos2dxの仔によって
    創造されたことを。
    そして人々はついに決意する。彼らを育てた天地を離れ、安住の地へ旅立つことを。

    View full-size slide

  7. いい感じにクライアントサイドをリプレイスし
    たい!
    現在絶賛リプレイス中ですが、今回はその中で得られ
    た気づきや知見を共有します。

    View full-size slide

  8. Kotlin/MPP
    構成がわからない問題

    View full-size slide

  9. 今Kotlin/MPPでやっている事
    ● Android/iOSのクライアントアプリ開発
    ● Kotlin/MPPでつかえるプレゼンテーションルーター
    ライブラリ開発

    View full-size slide

  10. クライアントアプリ
    ● 長期運用タイトルのクライアントサイドのリプレース
    ● Kotlin/MPPを使用してクライアントのビジネスロジック
    を共通化する

    View full-size slide

  11. クライアントアー
    キテクチャ

    View full-size slide

  12. KoRouter
    ● Kotlin/MPPで書かれたクライアントサイドのプレゼン
    テーションルーター
    ● VueRouterみたいなものを作りたい
    ● 現在絶賛開発中
    ● https://github.com/yashims/kotlin-router

    View full-size slide

  13. KoRouterの使い方
    private val router: KoRouter = KoRouter {
    route("") {
    name = ""
    component = this@MainActivity
    children {
    route("/") {
    name = "top"
    component = TopFragment()
    }
    route("gallery") {
    name = "gallery"
    component = GalleryFragment()
    children {
    route(":detail") {
    name = "detail"
    component = GalleryDialogFragment()
    } } } } } }

    View full-size slide

  14. KoRouterの使い方
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    router.push("/")
    }

    View full-size slide

  15. KoRouterの構成
    ● commonMain
    ● jvmMain
    ● iosMain
    の3つからなる

    View full-size slide

  16. KoRouterの構成 - 共通部分
    commonMain
    ● 共通コード
    ● 成果物はmetadata
    ● metadataだけでは何もできず、IDEなどがシンボルを追
    うために使うはず。

    View full-size slide

  17. KoRouterの構成 - Android部分
    jvmMain
    ● JVM向けコード
    ● 成果物が.jarなのでAndroidはこれを使う

    View full-size slide

  18. KoRouterの構成 - iOS部分
    iosMain
    ● Native向けコード
    ● .frameworkが成果物なのでiOSではこれをつかう

    View full-size slide

  19. ではクライアントアプリも同じ構成で
    作れるのか

    View full-size slide

  20. AndroidのPFに依存するコードが
    出てくるので、.jarでの提供では役
    不足になってくる

    View full-size slide

  21. クライアントアプリの構成
    ● commonMain
    ● jvmMain -> androidMain
    ○ JVM向けのサブセットと考えて良い
    ● iosMain
    ● main

    View full-size slide

  22. mainとは?

    View full-size slide

  23. クライアントアプリの構成 - main
    ● Androidの依存を使うためにcom.android.libraryの
    pluginを使用する
    ● Androidのbuildには、何もしなければsrc/mainの中に
    AndroidManifest.xmlを置く必要がある
    ● .aarの成果物ができる
    ● ごにょってandroidMainに統合するのが妥当

    View full-size slide

  24. 構成比較
    KoRouter
    ● commonMain
    ● jvmMain
    ● isoMain
    クライアントアプリ
    ● commonMain
    ● androidMain
    ● iosMain
    ● main -> androidMainへ混入

    View full-size slide

  25. 目的によってプロジェクトの構成
    が変わる!

    View full-size slide

  26. dependenciesわからない問題

    View full-size slide

  27. さて、今から皆さんにcoroutines
    関連のライブラリ名の一覧をお見
    せします。
    それぞれ何をするライブラリかわかりますでしょうか?

    View full-size slide

  28. coroutine関連のライブラリ
    ● kotlinx-coroutines-core-common
    ● kotlinx-coroutines-core
    ● kotlinx-coroutines-android
    ● kotlinx-coroutines-core-native
    ● kotlinx-coroutines-core-js

    View full-size slide

  29. common用
    implementation
    'org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.1'

    View full-size slide

  30. jvm用
    implementation
    'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'

    View full-size slide

  31. android用
    implementation
    'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'

    View full-size slide

  32. ios用
    implementation
    'org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.1.1'

    View full-size slide

  33. js用
    implementation
    'org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.1.1'

    View full-size slide

  34. 全部同じ事をするための
    ライブラリ

    View full-size slide

  35. 構成によってdependenciesが違う
    ● 言語的に可能でも実行環境によって不可能だったり、よ
    り適切な処理があったりする
    ● 例えばcoroutineはThreadProgrammingをサポートす
    るが、Androidの場合メインスレッドのとり方がAndroid
    用のものになったり

    View full-size slide

  36. そんな課題を乗り越えて
    CoroutineのGettingStartedを
    やっているとある問題に直面する

    View full-size slide

  37. GettingStarted
    fun hoge() {
    runBlocking {
    delay(200L)
    }
    }
    commonMain/kotlin/Sample.kt
    GettingStartedに記載されてる
    runBlockingが無い!

    View full-size slide

  38. 試しにこの状態でBuildを通してみると
    通る!

    View full-size slide

  39. jvmMainに移してみる
    fun hoge() {
    runBlocking {
    delay(200L)
    }
    }
    jvmMain/kotlin/Sample.kt
    通る!

    View full-size slide

  40. 最初はdependenciesを疑ったが…
    ● commonで通らないのは、なにか別のdependenciesを
    入れる必要があるのではと考えた
    ● でも実際はそういう仕様だった
    ● runBlockingの動作がjsで実現出来ないために
    commonで使えないようになっている
    ● あくまでmetadataにリファレンスが無いだけなので、書
    いておけばjvmやnativeでbuildすることはできる

    View full-size slide

  41. kotlinxわからない問題

    View full-size slide

  42. たとえばcoroutineなら、
    GettingStartedをやれば、なん
    やかんやでcoroutineを完全理解
    した状態になれる

    View full-size slide

  43. KotlinのCoroutine完全に理解した
    ● CoroutineScope <- 見ないようにしてる
    ● チャネル <- 見ないようにしている
    ● kotlinx-coroutines-reactive <- 見ないようにしてる
    ● kotlinx-coroutines-reactor <- 見ないようにしてる

    View full-size slide

  44. KotlinのCoroutineがちょっとできるよ
    うになるためには、何をみたら良いか知見
    がある人教えてください…
    Goroutineのドキュメントあたり参考になるのか?とは考えて
    る。

    View full-size slide

  45. コードのエントロピーが増大する問

    View full-size slide

  46. コードのエントロピー増大問題
    ● イレギュラーな事態になってもKotlinはなんとか出来てし
    まうパワフルさがある
    ● そのパワフルさに依存するとエントロピーが増大していく
    ● 結局適切な抽象化ときれいな設計を行うことに尽きる
    ● きれいな設計を行うと、イレギュラーに遭遇すること事態
    が少なくなる
    ● 今回挙げたような問題にも対処しやすくなる

    View full-size slide

  47. まとめ
    ● 目的によって構成を変えよう
    ● なにが同じライブラリかは何処かにまとめておこう
    ● GettingStarted通りに出来なくても泣かない
    ● kotlinxわからん
    ● 設計大事

    View full-size slide