5.1K Views
April 26, 24
スライド概要
potatotips #87 で発表したスライドです。
https://potatotips.connpass.com/event/313875/
Android Engineer at Kyash Inc.
Kotlin Multiplatform の SKIE を 導入したら iOS アプリのビルド時間を 増やしてしまったので減らしたい話 potatotips #87 ©2024 Kyash Inc. ©2024 Kyash Inc.
自己紹介 自己紹介 ● 高田 晴彦 ● @tfandkusu ○ Qiita/Zenn/note/GitHub/X ● 株式会社Kyash ● Androidエンジニア ● スプラトゥーンが好き ©2024 Kyash Inc. 2
Visaプリペイドカードアプリ「Kyash」 ©2024 Kyash Inc. 3
Kyash の使用技術 SwiftUI / Jetpack Compose Kyash アプリは Kotlin Multiplatform で開発 ● 見た目(Swift UI/Jetpack Compose) 以外を Kotlin 言語で共通 Kotlin Multiplatform UI 操作 見た目情報 見た目制御 化 ● iOS/Android らしい UI/UX と iOS/Android 間の仕様差違を仕組みで 防ぐことを両立 ©2024 Kyash Inc. API、データ保存、メモリキャッシュ等 4
Kyash の使用技術 SKIE (スカイ) も導入済み ● SKIE - Swift Kotlin Interface Enhancer ● Kotlin Foundation のメンバーである Touchlab 社が2023年9月にオープンソースで公開 したツール ● Kotlin Multiplatform で作られた Swift 向け API は Swift 言語が本来持つ記述力、安全 性を活かせない問題があるが SKIE を導入することで解決できる ©2024 Kyash Inc. 5
Kyash の使用技術 SKIE の紹介記事 ● Kotlin Multiplatform は iOS エンジニアの開発者体験が良くないのではと思っていたが、 SKIE を使えば良いと思った。 - Qiita ○ Kotlin の sealed class は SKIE を使うと Swift では Enums with associated values になることを紹介 ● Kotlin Multiplatform の SKIE (スカイ)を導入して、iOS エンジニアの開発者体験を改善しま した。 - Kyash Product Blog ○ ©2024 Kyash Inc. Kyash アプリへの導入事例 6
SKIE 導入のデメリット ©2024 Kyash Inc. 7
SKIE 導入のデメリット ビルド時間が延びる 公式ガイド https://skie.touchlab.co/ の Known issues and limitations > Slow compilation というページで解説している SKIE はその性質上 Objective-C フレームワークを構築する Kotlin タスクにオーバーヘッドを追加 します。 ©2024 Kyash Inc. 8
計測してみた ©2024 Kyash Inc. 9
計測してみた アプリの規模 ● 397画面 ● 内102画面が Kotlin Multiplatform で開発されている ©2024 Kyash Inc. 10
計測してみた ビルド時間計測方法 ● 10回フルビルドして平均と標準偏差を算出 ○ ビルド時間は多いときで10秒ほど前後するため ○ そのための Python スクリプトを作成 ■ ©2024 Kyash Inc. https://github.com/tfandkusu/build_time_script 11
計測結果 ©2024 Kyash Inc. 12
計測結果 ビルド時間が増えた 161.5 秒(±3.0) → 193.6 +32.1 ©2024 Kyash Inc. 秒(±3.2) 秒 13
計測結果 3ヶ月経ち、画面や機能が増えた 193.6 秒(±3.2) →206.3 +12.7 ©2024 Kyash Inc. 秒(±4.2) 秒 14
ビルド時間を減らしたい ©2024 Kyash Inc. 15
ビルド時間を減らしたい 公式ページ Slow compilation の記述 コンパイル時間とバイナリサイズに悪影響を与えるため、エクスポートされるクラスの数を制限することを 強くお勧めします。これは SKIE がなくても当てはまりますが、SKIE ではエクスポートされた宣言のみ を処理するため、SKIE を使用すると効果がさらに顕著になります。 https://skie.touchlab.co/known-issues/slow-compilation ©2024 Kyash Inc. 16
ビルド時間を減らしたい Swift 向けにエクスポートされているクラスを減らした 4000 →3612 個 個 -9.6% ● ● ちょうどマルチモジュール構成の見直しが行われ、その実行に取りかかっていたので、その副産物 数字は Objective-C の @interface の数 ○ 詳細はスライドの終わりに添付 ©2024 Kyash Inc. 17
Swift 向けにエクスポートさ れているクラスを減らす方法 ©2024 Kyash Inc. 18
Swift 向けにエクスポートされているクラスを減らす方法 非公開クラスに internal を付ける // インターフェースは公開 interface GetSomeUseCase { suspend operator fun invoke(): SomeData } // インスタンスは DI から取得するので実装クラスは非公開 internal class GetSome( private val someRepository: SomeRepository, ) : GetSomeUseCase { override suspend fun invoke(): SomeData { return someRepository.getSomeData() } } ©2024 Kyash Inc. 19
Swift 向けにエクスポートされているクラスを減らす方法 マルチモジュール構成で Swift 向け ライブラリモジュールの build.gradle.kts で公開モジュー ルのみ export する kotlin { sourceSets { listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "shared" // Swift 向けに公開 export(project(":feature:wallet")) export(project(":model")) } } commonMain.dependencies { api(project(":feature:wallet")) api(project(":model")) // Swift 向けに非公開 implementation(project(":data")) } } } ※ 実際の Kyash のコードでは無いです ©2024 Kyash Inc. 20
Swift 向けにエクスポートされているクラスを減らす方法 エクスポートされているクラスを減らした結果 206.3 秒(±4.2) →198.5 -7.8 ©2024 Kyash Inc. 秒(±3.2) 秒 21
まとめ まとめ ● SKIE を導入すると Kotlin で作られた Swift 向け API は、記述力が高く安全なものになる ● デメリットとして、iOS アプリのビルド時間は約400画面中100画面が Kotlin Multiplatform で作られているアプリで約30秒伸びる ● Swift 向けにエクスポートされているクラス数もビルド時間に関係するので、それが最小になるよ うに設計する ©2024 Kyash Inc. 22
ありがとうございました。 付録は次のスライドです。 ©2024 Kyash Inc. 23
付録 使用PC バージョン ビルド時間計測方法 MacBook Pro 16インチ Gradle 8.6 毎回 Xcode プロジェクトと 2021 Kotlin 1.9.10 Kotlin プロジェクトに対して Apple M1 Max SKIE 0.5.3 clean を行う。 64GB その後デバッグビルドの開始 から完了までの時間を記録す る。 ©2024 Kyash Inc. 24
付録 Swift 向けに公開されているクラスを確認する Xcode で Kotlin Multiplatform によって作られたクラスで右クリック → Jump to Definition Objective-C のヘッダファイルを確認できる。 ©2024 Kyash Inc. 25
謝辞 謝辞 このプレゼンテーションの準備にあたり、様々なアドバイスを頂いた Kyash 社モバイルチームの皆様に 心から感謝申し上げます。 ©2024 Kyash Inc. 26