Slide 1

Slide 1 text

K2対応がそれなりに⼤変だった話 技術本部 SansanEngineeringUnit MobileApplicationGroup 原⽥ 拓眞 Sansanの実例

Slide 2

Slide 2 text

⾃⼰紹介 ● 2014年4⽉Sansan新卒⼊社 ● もともとはC# / webアプリエンジニアでした ● 2018年11⽉頃からAndroidに転向 ● 現在はSansanのAndroidアプリアーキテクト ● 去年の3⽉からイッヌを飼い始めました ● X: @teufelium ● Instagram: bokuchin.frenchies ○ イッヌのアカウントです。 ● 3⽉末から福岡勤務予定

Slide 3

Slide 3 text

本⽇の内容 ⽬的 ● これからK2対応をする⼈、こういったケースがあったよという知⾒共有 ● 未解決の問題があるので知ってる⼈がいれば教えてほしい ⽬次 ● [前提知識] Sansanのつくりの簡単な説明 ● SansanでK2対応を⾏うに⾄った背景 ● SansanでK2対応を⾏うまでに⼤変だったこと ● 未解決問題

Slide 4

Slide 4 text

Sansanのつくりの簡単な説明① KotlinMultiplatform Android iOS

Slide 5

Slide 5 text

Sansanのつくりの簡単な説明② KotlinMultiplatform Android iOS ⼀部機能の ビジネスロジックやAPI通信 UIと、多くの機能の ビジネスロジック、API通信 ※KMPは導⼊してまだ浅いため、全部のビジネスロジックがKMPにあるわけではない。

Slide 6

Slide 6 text

SansanでK2対応を⾏うに⾄った背景① ● もともと導⼊しようと考えて企画を計画してた ○ コンパイラ性能の向上 ○ スマートキャストの改善の恩恵 ○ 今後の⾔語機能の追加 ○ などなど

Slide 7

Slide 7 text

SansanでK2対応を⾏うに⾄った背景② ● ところが状況が変わった ○ 進⾏していたプロジェクトでiOS側で不具合 ■ APIにPOSTする際、⻑い⽂字列を送ろうとするとク ラッシュする ○ 原因はKMP基盤で使っているKtor 2系 ○ Ktor 3.0.2で解消されていることがわかった

Slide 8

Slide 8 text

問題の図解 KotlinMultiplatform Android iOS ⻑い⽂字列を送ろうとすると クラッシュ! 原因はKtor 2系のバグ

Slide 9

Slide 9 text

じゃあKtor 3.0.2以上にしよう Kotlin 2.0以上が必要

Slide 10

Slide 10 text

K2対応をせねばならぬ

Slide 11

Slide 11 text

やるぞ KotlinMultiplatform Android iOS 💪K2 💪合わせてK2

Slide 12

Slide 12 text

SansanでK2対応を⾏うまでに⼤変だったこと① ● ⼤変じゃなかったこと① ○ ComposeCompilerPluginのマイグレーション // before composeOptions { kotlinCompilerExtensionVersion libs.versions.jetpack.compose.compiler.get() } // after plugins { alias(libs.plugins.compose.compiler.plugin) }

Slide 13

Slide 13 text

SansanでK2対応を⾏うまでに⼤変だったこと② ● ⼤変じゃなかったこと② ○ RoomCompilerのKSP対応(kapt版はKotlin2.0.0まで) // before android { defaultConfing { javaCompileOptions { annotationProcessorOptions { arguments += [ "room.schemaLocation": "$projectDir/schemas".toString(), "room.incremental" : "true" ] } } } } // after ksp { arg("room.schemaLocation", "$projectDir/schemas".toString()) arg("room.incremental", "true") }

Slide 14

Slide 14 text

SansanでK2対応を⾏うまでに⼤変だったこと③ ● mocKMPを対応する ○ mocKMP2.0.0からKotlin2.0以上に対応した ■ ただしKotlin 2.1.0では動かないのでKotlin 2.0.21にする必要がある ○ テストを簡単に書けるヘルパークラス関係の設定関係が変わった ○ ⾃動⽣成されるクラスの挙動が変わった(←対応が⼤変だった)

Slide 15

Slide 15 text

テストを簡単に書けるヘルパークラス関係の設定関係が変 わった // before mockmp { useHelper = true installWorkaround() } // after mockmp { onTest { withHelper() } }

Slide 16

Slide 16 text

⾃動⽣成されるクラスの挙動が変わった ● ⾃動⽣成されるモックとフェイクが org.kodein.mock.generated パッケー ジに出⼒されるようになった。 ● そのため、マルチモジュール環境で利⽤していると各モジュールでのパ ッケージ名が衝突してエラーが発⽣する様になった。 ○ このエラーがわかりにくくて⾟かった。 mockmp { onTest { withHelper() accessorsPackage("com.sansan.mockmp.hogehoge.generated") } }

Slide 17

Slide 17 text

その他雑多な対応 ● iOSで使ってるSKIEのバージョンをK2対応版に上げる ● .toLowerCase() が .lowercase() に変わったので修正する

Slide 18

Slide 18 text

未解決問題 ● kotlin 2.0以上はAGP8.7(Gradle8.9)以上が必要 ● Gradle8.9だとOSSライセンスプラグインがエラーになり、ライセンスを 出⼒してくれなくなる ○ google/play-services-plugins ○ https://github.com/google/play-services-plugins/issues/299 ● いまはAGP8.6以前で出⼒できていた内容に追記する形で凌いでいる。

Slide 19

Slide 19 text

No content