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
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
510
コードレビューで開発を加速させる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.2k
Observationではじめる値監視
akkie76
4
4.9k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
790
Other Decks in Technology
See All in Technology
[potatotips #96] Give Your AI Agent the Flutter Playbook
korodroid
0
160
AI画像認識を活用したゲーム内決済処理検証の自動化
gree_tech
PRO
0
360
【書籍出版記念】 10周回って、エージェント開発は RAGがすべてだった。〜RAGの歴史と開発現場で見えた実践知〜
akiratameto
19
6.9k
属人化を叩き割れ!「制作加速」と「安定化」の矛盾を打破する:8年目プロダクトが辿り着いた「ミスが起こり得ない」アセット制作フローの全貌
gree_tech
PRO
0
370
AI・HPC開発を支えるGPU環境の新しい選択肢 液冷GPUシステム「AquSys」の取り組み
gpuunite_official
0
230
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
4
26k
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
900
Kiro Crew入門 - 常駐エージェントの仕組みと使いどころ / Intro to Kiro Crew
k_adachi_01
1
860
2027年のMetricKit
kantacky
0
170
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
200
カーネルまで探検して理解するふたつの自動計装
sumiyae
0
260
FDEの心得
noriakioji
5
6.4k
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
500
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Producing Creativity
orderedlist
PRO
348
40k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
580
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
BBQ
matthewcrist
89
10k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Unsuck your backbone
ammeep
672
58k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
Navigating Team Friction
lara
192
16k
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 ご静聴ありがとうございました