Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
大規模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
EmptyViewは本当に“空”なのか?
akkie76
0
90
Graph Art with Charts API – Beyond Data Visualization
akkie76
0
280
Meet the Translation API
akkie76
0
530
コードレビューで開発を加速させるAIコードレビュー
akkie76
1
840
Android Target SDK 35 (Android 15) 対応の概要
akkie76
0
6.2k
コードレビューを支援するAI技術の応用
akkie76
5
1.4k
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
10k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
1.3k
Observationではじめる値監視
akkie76
4
4.9k
Other Decks in Technology
See All in Technology
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
270
DBについての基礎説明(MySQL編) - コロプラ 2026年度 新卒研修
colopl
0
120
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
730
AI導入は済んだ。次は統制を作り替える番だ_AI×開発組織 Summit 2026
techtekt
PRO
0
320
PHPカンファレンス関西の招待状 / Invitation to PHP Conference Kansai
ykanoh
0
200
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
180
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
110
USB PDを使ってスマホを労わりたい
raspython3
0
180
今さら理解するウェブフォントver.2026
takanorip
3
890
大型犬好きによるPugの紹介
yamanoku
1
160
Local CI × GitHub Actions
gogutan
2
220
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
340
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
370
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
480
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
630
Believing is Seeing
oripsolob
1
240
Statistics for Hackers
jakevdp
799
230k
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
My Coaching Mixtape
mlcsv
0
360
Documentation Writing (for coders)
carmenintech
77
5.6k
New Earth Scene 8
popppiees
4
2.7k
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 ご静聴ありがとうございました