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

Kotlin/MPP getting started and troubles

Kotlin/MPP getting started and troubles

6b37e5c21ba723dacede78124b25d5a8?s=128

Masaya Yashiro

March 27, 2019
Tweet

Transcript

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

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

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

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

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

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

    人々は思い出したのである。彼らが在る天地は荒ぶる cocos2dxの仔によって 創造されたことを。 そして人々はついに決意する。彼らを育てた天地を離れ、安住の地へ旅立つことを。
  8. いい感じにクライアントサイドをリプレイスし たい! 現在絶賛リプレイス中ですが、今回はその中で得られ た気づきや知見を共有します。

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

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

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

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

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

  14. 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() } } } } } }
  15. KoRouterの使い方 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) router.push("/") }

  16. KoRouterの構成 • commonMain • jvmMain • iosMain の3つからなる

  17. KoRouterの構成 - 共通部分 commonMain • 共通コード • 成果物はmetadata • metadataだけでは何もできず、IDEなどがシンボルを追

    うために使うはず。
  18. KoRouterの構成 - Android部分 jvmMain • JVM向けコード • 成果物が.jarなのでAndroidはこれを使う

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

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

  21. 答えはNO

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

  23. クライアントアプリの構成 • commonMain • jvmMain -> androidMain ◦ JVM向けのサブセットと考えて良い •

    iosMain • main
  24. mainとは?

  25. クライアントアプリの構成 - main • Androidの依存を使うためにcom.android.libraryの pluginを使用する • Androidのbuildには、何もしなければsrc/mainの中に AndroidManifest.xmlを置く必要がある •

    .aarの成果物ができる • ごにょってandroidMainに統合するのが妥当
  26. 構成比較 KoRouter • commonMain • jvmMain • isoMain クライアントアプリ •

    commonMain • androidMain • iosMain • main -> androidMainへ混入
  27. 目的によってプロジェクトの構成 が変わる!

  28. dependenciesわからない問題

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

  30. coroutine関連のライブラリ • kotlinx-coroutines-core-common • kotlinx-coroutines-core • kotlinx-coroutines-android • kotlinx-coroutines-core-native •

    kotlinx-coroutines-core-js
  31. 答え:

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

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

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

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

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

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

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

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

  40. GettingStarted fun hoge() { runBlocking { delay(200L) } } commonMain/kotlin/Sample.kt

    GettingStartedに記載されてる runBlockingが無い!
  41. 試しにこの状態でBuildを通してみると 通る!

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

    通る!
  43. 最初はdependenciesを疑ったが… • commonで通らないのは、なにか別のdependenciesを 入れる必要があるのではと考えた • でも実際はそういう仕様だった • runBlockingの動作がjsで実現出来ないために commonで使えないようになっている •

    あくまでmetadataにリファレンスが無いだけなので、書 いておけばjvmやnativeでbuildすることはできる
  44. kotlinxわからない問題

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

  46. KotlinのCoroutine完全に理解した • CoroutineScope <- 見ないようにしてる • チャネル <- 見ないようにしている •

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

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

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

    が少なくなる • 今回挙げたような問題にも対処しやすくなる
  50. まとめ

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

    設計大事
  52. Thank You!