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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
akkiee76
February 19, 2023
Technology
530
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
270
Meet the Translation API
akkie76
0
520
コードレビューで開発を加速させるAIコードレビュー
akkie76
1
780
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.3k
Observationではじめる値監視
akkie76
4
4.9k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
800
Other Decks in Technology
See All in Technology
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
210
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
150
Lakebase ワークショップ / Lakebase-workshop
databricksjapan
PRO
0
110
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
280
少人数データチームのDevin活用実践事例
runandy16
2
450
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
3
940
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
410
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
150
プロダクト思考 × 基盤思考を AIで実現する Compound Engineering
tkc66buzz
1
280
KAEN Company Deck
kaen
PRO
0
330
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
2
460
Beyond the Hype: Practical AI for Your Oracle Database with MCP
thatjeffsmith
1
280
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Building an army of robots
kneath
306
46k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
470
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Google's AI Overviews - The New Search
badams
0
1.6k
The untapped power of vector embeddings
frankvandijk
2
1.9k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
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 ご静聴ありがとうございました