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

KMP with Crashlytics

KMP with Crashlytics

■ イベント
初心者もOK!3社のリアルな活用術から学ぶ Kotlin Multiplatform Night
https://sansan.connpass.com/event/339209/

■ 発表者
技術本部 Sansan Engineering Unit Mobile Applicationグループ
鎌田 峻輔

■ Androidエンジニア 採用情報
https://media.sansan-engineering.com/android-engineer

■ iOSエンジニア 採用情報
https://media.sansan-engineering.com/ios-engineer

SansanTech

January 14, 2025
Tweet

More Decks by SansanTech

Other Decks in Technology

Transcript

  1. Sansan株式会社 部署 名前 KMP with Crashlytics Sansan技術本部 Kotlin Multiplatform Night

    Sansan株式会社 技術本部 Sansan Engineering Unit Mobile Applicationグループ 鎌⽥ 峻輔
  2. 写真が入ります 鎌⽥ 峻輔Shunsuke KAMADA Sansan株式会社 技術本部 Sansan Engineering Unit Mobile

    Applicationグループ ‘19年卒 iOS / Android アプリエンジニア。 ‘22年8⽉にSansan株式会社に中途⼊社。 ‘22/8 ~ Android ’24/10~ iOS ⿇雀のお誘い待ってます 🀄 : let_kamaShun
  3. 話すこと・話さないこと - Sansanモバイルチームの近況 > KMP 導⼊しました - 話さない: KMP導⼊の背景・メリデメ・具体的なKMPのコード・採⽤している 設計など

    - KMP導⼊後の困りごととその対応 > 謎のクラッシュが発⽣するようになった > CrashKiOSを導⼊して解決した - 実装⽅法 - 話さない: CrashKiOSの仕組みなど
  4. KMP with Sansan Now Early 2024 Android Repository iOS Repository

    Android Repository iOS Repository KMP Repository (Usecase, Repository, API, DB…) ※ 順次置き換え中
  5. 実装する 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から呼び出せるように
  6. 実装する 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アップロードが必要
  7. 試す Now Android Repository iOS Repository KMP Repository (Usecase, Repository,

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

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

    API, DB) throw IndexOutOfBoundsException("あれれ~?おかしいぞぉ~?") - 適当な場所でcrashを起こす After
  10. 補⾜ 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() } } - 起動時に呼び出す (未検証)
  11. まとめ - プロダクトを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 - 真実(クラッシュの原因)はいつも⼀つ!