Slide 1

Slide 1 text

Sansan株式会社 部署 名前 KMP with Crashlytics Sansan技術本部 Kotlin Multiplatform Night Sansan株式会社 技術本部 Sansan Engineering Unit Mobile Applicationグループ 鎌⽥ 峻輔

Slide 2

Slide 2 text

写真が入ります 鎌⽥ 峻輔Shunsuke KAMADA Sansan株式会社 技術本部 Sansan Engineering Unit Mobile Applicationグループ ‘19年卒 iOS / Android アプリエンジニア。 ‘22年8⽉にSansan株式会社に中途⼊社。 ‘22/8 ~ Android ’24/10~ iOS ⿇雀のお誘い待ってます 🀄 : let_kamaShun

Slide 3

Slide 3 text

話すこと・話さないこと

Slide 4

Slide 4 text

話すこと・話さないこと - Sansanモバイルチームの近況 > KMP 導⼊しました - 話さない: KMP導⼊の背景・メリデメ・具体的なKMPのコード・採⽤している 設計など - KMP導⼊後の困りごととその対応 > 謎のクラッシュが発⽣するようになった > CrashKiOSを導⼊して解決した - 実装⽅法 - 話さない: CrashKiOSの仕組みなど

Slide 5

Slide 5 text

KMP with Sansan

Slide 6

Slide 6 text

KMP with Sansan Now Early 2024 Android Repository iOS Repository Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB…) ※ 順次置き換え中

Slide 7

Slide 7 text

ところで

Slide 8

Slide 8 text

クラッシュ、チェックしてますか?

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Me (クラッシュチェックしている)

Slide 13

Slide 13 text

Crashcheck in Sansan ← 新規クラッシュチェック ↓ クラッシュ件数集計botのチェック

Slide 14

Slide 14 text

ある⽇...

Slide 15

Slide 15 text

ある⽇...

Slide 16

Slide 16 text

ある⽇... ← Me

Slide 17

Slide 17 text

ある⽇... ← Me あれれ〜〜? おかしいぞぉ〜?

Slide 18

Slide 18 text

これを放置すると... ← Me あれれ〜〜? おかしいぞぉ〜? アプリの多くのクラッシュが原因不明になる エンジニアが検知できないクラッシュが増える -> 事故の際に復旧が⾮常に困難になる (1敗) -> 品質低下 -> 利⽤率低下 -> マズい

Slide 19

Slide 19 text

ある⽇... “konan君問題”

Slide 20

Slide 20 text

あった https://crashkios.touchlab.co/ 調べた

Slide 21

Slide 21 text

実装する Now Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB) // build.gradle kotlin { sourceSets { commonMain.dependencies { implementation("co.touchlab.crashkios:crashlytics:0.8.6") } } } plugins { // ビルドエラーが起こるので追加 id("co.touchlab.crashkios.crashlyticslink") version "0.8.6" } // gradle.properties # ビルドエラーが起こるので追加 kotlin.native.cacheKind.iosX64=none kotlin.native.cacheKind.iosSimulatorArm64=none - ライブラリ追加 class CrashKiOSHelper { fun initialize() { enableCrashlytics() setCrashlyticsUnhandledExceptionHook() } } - iOSから呼び出せるように

Slide 22

Slide 22 text

実装する Now Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB) class CrashKiOSHelper { fun initialize() { enableCrashlytics() setCrashlyticsUnhandledExceptionHook() } } - iOSから呼び出せるように // Appdelegate.swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { CrashKiOSHelper().initialize() } - dSYMアップロードが必要

Slide 23

Slide 23 text

試す Now Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB) throw IndexOutOfBoundsException("あれれ~?おかしいぞぉ~?") - 適当な場所でcrashを起こす

Slide 24

Slide 24 text

試す Now Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB) throw IndexOutOfBoundsException("あれれ~?おかしいぞぉ~?") - 適当な場所でcrashを起こす Before

Slide 25

Slide 25 text

試す Now Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB) throw IndexOutOfBoundsException("あれれ~?おかしいぞぉ~?") - 適当な場所でcrashを起こす After

Slide 26

Slide 26 text

🎉

Slide 27

Slide 27 text

補⾜ Now Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB) class CrashlyticsHelper { actual fun initialize() { enableCrashlytics() } } - Androidからも呼び出せるように // Application class class MainApplication : Application() { override fun onCreate() { super.onCreate() // Init crash tracker CrashlyticsHelper.initialize() } } - 起動時に呼び出す (未検証)

Slide 28

Slide 28 text

まとめ - プロダクトをKMP化すると - iOSアプリで謎のクラッシュが起こるようになる > KMP部分のクラッシュが konan::abort() になる - https://crashkios.touchlab.co/ を導⼊すると解決できる > ドキュメントだけだと実装が難しいことがある - https://github.com/santimattius/kmp-crash-tracker - https://github.com/touchlab/CrashKiOS/issues - https://github.com/firebase/firebase-ios-sdk - 真実(クラッシュの原因)はいつも⼀つ!

Slide 29

Slide 29 text

Sansan 技術本部 募集ポジション紹介 https://media.sansan-engineering.com/

Slide 30

Slide 30 text

No content