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
490
コードレビューで開発を加速させるAIコードレビュー
akkie76
1
730
Android Target SDK 35 (Android 15) 対応の概要
akkie76
0
6.2k
コードレビューを支援するAI技術の応用
akkie76
5
1.3k
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
9.9k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
1.2k
Observationではじめる値監視
akkie76
4
4.9k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
780
Other Decks in Technology
See All in Technology
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
190
自宅LLMの話
jacopen
1
610
20260619 私の日常業務での生成 AI 活用
masaruogura
1
230
SONiCの統計情報を取得したい
sonic
0
220
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
230
iAEONの段階的リアーキテクト戦略 / iAEON's_Gradual_Re-architecture_Strategy
aeonpeople
0
230
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
2
510
人材育成分科会.pdf
_awache
4
290
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
3k
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
270
【Snowflake Summit 2026 Recap!!】Snowflake Summit Deep Dive: Security & Governance
civitaspo
1
260
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
220
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
New Earth Scene 8
popppiees
3
2.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Optimizing for Happiness
mojombo
378
71k
A better future with KSS
kneath
240
18k
Writing Fast Ruby
sferik
630
63k
Prompt Engineering for Job Search
mfonobong
0
350
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
ラッコキーワード サービス紹介資料
rakko
1
3.7M
Visualization
eitanlees
152
17k
Navigating Team Friction
lara
192
16k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
230
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 ご静聴ありがとうございました