Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
大規模AndroidアプリのDIをKoinからHiltへ移行するTIPS
Search
akkiee76
February 19, 2023
Technology
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
大規模AndroidアプリのDIをKoinからHiltへ移行するTIPS
「potatotips #81 iOS/Android開発Tips共有会」の登壇資料です。
https://potatotips.connpass.com/event/272353
akkiee76
February 19, 2023
More Decks by akkiee76
See All by akkiee76
Graph Art with Charts API – Beyond Data Visualization
akkie76
0
240
Meet the Translation API
akkie76
0
500
コードレビューで開発を加速させるAIコードレビュー
akkie76
1
740
Android Target SDK 35 (Android 15) 対応の概要
akkie76
0
6.2k
コードレビューを支援するAI技術の応用
akkie76
5
1.3k
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
10k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
1.2k
Observationではじめる値監視
akkie76
4
4.9k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
790
Other Decks in Technology
See All in Technology
データと地図で読む 大井町の「かわるもの、かわらないもの」
yoshiyama_hana
0
160
20260720_クラウド女子会×PyLadiesTokyoコラボ Amazon Bedrock ハンズオン用資料
yuuka51
2
110
41歳でAWSが好きすぎてITエンジニアになったおっさんの話
yama3133
1
740
データエンジニアリングとドメイン駆動設計
masuda220
PRO
14
2.5k
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
470
”AIを使う” から ”AIに任せる” へ ─ 開発プロセスを再設計してAIを組織標準にするまで
cyberagentdevelopers
PRO
2
140
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
4
2.5k
それでも、技術なブログを書く理由 #kichijojipm / Why I Still Write Tech Blogs Even Now
shinkufencer
0
500
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
310
JAWS_ICEBERG_BASECAMP
iqbocchi
2
110
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
520
AI Native なプロダクト組織の立ち上げ方 : 生産性 100 倍への挑戦
mikesorae
0
1.3k
Featured
See All Featured
Six Lessons from altMBA
skipperchong
29
4.3k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
Claude Code のすすめ
schroneko
67
230k
Odyssey Design
rkendrick25
PRO
2
730
BBQ
matthewcrist
89
10k
Practical Orchestrator
shlominoach
191
11k
Making the Leap to Tech Lead
cromwellryan
135
10k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Leo the Paperboy
mayatellez
8
1.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
A Tale of Four Properties
chriscoyier
163
24k
Transcript
potatotips #81 ©2022 RAKUS Co., Ltd. 大規模AndroidアプリのDIを KoinからHiltへ移行するTIPS @akkiee76 potatotips
#81 iOS/Android 開発 Tips 共有会
potatotips #81 Akihiko Sato / 株式会社ラクス Lead Engineer / @akkiee76
SaaS 開発 (Backend, Frontend) / Mobile 開発 (iOS, Android) 上流工程、コードレビュー、チームの課題改善など 読書 / コーヒー / HHKB / あんバターフランス 自己紹介
potatotips #81 会社紹介 株式会社ラクス 「ITサービスで企業の成長を継続的に支援します」を ミッションに、お客様の課題解決やビジネスの成長を 継続的に支援するクラウドサービスを提供しています。
potatotips #81 今日伝えたいこと 品質を維持しながら効率よく行う DI レガシー改善
potatotips #81 DI ライブラリの移行のモチベーション Koin AndrodX ViewModel は JCenter の廃止により
3.0.x の開発で終了し、 1. Maven Repository で提供されている io.insert-koin へ移行する 2. Android 公式の Hilt に移行する のどちらかの選択を迫られる状況に。
potatotips #81 Koin の特徴 DI が直感的に実装できるライブラリなので、 中小規模のAndroidアプリ開発では導入がしやすい点が特徴。 val appModule =
module { // Interfaceを用いてDIする single<Repository> { RepositoryImpl() } // ViewModelにDIする viewModel { MainViewModel(get()) } } class MyApplication : Application() { override fun onCreate() { super.onCreate() setupKoin() } private fun setupKoin() { startKoin { androidContext(this@MyApplication) modules(appModule) } } }
potatotips #81 Koin 実装の課題 アプリの規模が大きくなってくると、module が肥大化し、 可読性が低下してくる。 val appModule =
module { viewModel { parameters -> DetailViewModel(id = parameters.get(), get(), get()) } viewModel { DetailViewModel(get(), get(), get()) } viewModel { HogeDetailViewModel(get(), get(), get(), get(), get(), get()) } viewModel { FugaDetailViewModel(get(), get(), get(), get(), get(), get(), get()) } // 以降続く・・・ }
potatotips #81 Hilt 移行のメリット ・ Andriod 純正ライブラリなので今後もメンテされる (おそらく) ・ いつかは乗り換えることになる
・ Jetpack ライブラリとの親和性 ・ 乗り換えによるモチベーションアップ ・ 生産性の向上 (テストコード書きにくい課題の改善) etc
potatotips #81 Hilt 移行にあたって考慮するべきこと 1. Koin と Hilt は共存できるか ・
場合によっては1バージョンで乗り換えできないこともある 2. 既存機能のデグレ 3. Koin で実装されたテストコードをどうするか
potatotips #81 ここからは実際の乗り換えの手順になります。
potatotips #81 1. Koin と Hilt の共存調査 まずは1バージョンで乗り換え完了できなかった場合のリスクヘッジ 1. 依存関係を設定し、既存機能への影響度をチェック
2. DIの引数が1つか2つのViewModelをお試し移行で影響度をチェック 👉 機能影響なし
potatotips #81 2. 乗り換えの基本方針を決める 2.1 module 実装の方針 interface UserRepository {
fun getUsers(): List<User> } class UserRepositoryImpl : UserRepository { override fun getUsers(): List<User> { } } @Module @InstallIn(SingletonComponent::class) abstract class RepositoryModule { @Binds @Singleton abstract fun bindUserRepository(impl: UserRepositoryImpl): UserRepository }
potatotips #81 2. 乗り換えの基本方針を決める 2.2 Fragment, ViewModel 実装の方針 @AndroidEntryPoint class
MainFragment : Fragment() { private val viewModel: MainViewModel by viewModels() } @HiltViewModel class MainViewModel @Inject constructor( savedStateHandle: SavedStateHandle private val userRepository: UserRepository ): ViewModel() { ... }
potatotips #81 2. 乗り換えの基本方針を決める 2.3 完了の定義 1. ViewModel から KoinComponent
の継承が削除されていること 2. ViewModel の DI が by viewModels() となっていること 3. module から対象のコードが削除されていること 4. CI が成功していること
potatotips #81 3. 横展開の準備をする メンバー同士のレビュー待ちタスクなどで横展開していく 1. ViewModel ごとに修正のスコープにする 2. DI
の少ない ViewModel から進めていく 3. スプレッドシートでタスク一覧化して進捗管理する
potatotips #81 4. 依存関係を削除して品質を担保する 1. Koin の依存関係を削除する 2. 各機能のテストを実施する 3.
機能デグレがあれば修正する
potatotips #81 まとめ 1. 乗り換えの既存機能に対する影響を調査 2. 実装方針を確立する 3. 横展開で修正する 4.
依存関係を削除 5. デグレチェック このプロセスで効率的に乗り換え作業が進められます。
potatotips #81 今後の課題 テストコードまでは修正できず、テストの依存関係はそのまま 👉 テストフレームワークの見直しを含めて対応予定
potatotips #81 ご静聴ありがとうございました