Androidでマルチモジュール
Androidでマルチモジュールを実践してみました。
サンプル
モジュールを作成
モジュールはAndroid Library
として作成します。
Android ライブラリの作成
こちらに詳しく説明されていますが、ここでは簡単な手順を記載します。
- File > New > New Module
- TemplateにAndroid Libraryを選択
- モジュール名・パッケージ名を入力
- [オプション]File > Project StructureでJava 11に変更
モジュールをアプリに追加する
作成したモジュールをアプリに追加するためには、app/build.gradle
に依存関係を追加する方法とGUIを使う方法があります。
app/build.gradle
に記載する方法
dependencies {
...
implementation(project(":module-name"))
}
GUIを使う方法
- File > Project Structure > Dependencies に移動します。
- ライブラリを使用するモジュールを選択します。ここでは
app
とします。 - [Declared Dependencies] タブで+をクリックし、プルダウンから [Module Dependency] を選択します。
- [Add Module Dependency] ダイアログで、ライブラリ モジュールを選択します。
- 通常は[implementation] を選択し、[OK] をクリックします
app/build.gradle
に依存が追加されます。
モジュール間での共通ライブラリのバージョン管理
androidx.core:core-ktx
などの一部のライブラリは全てのモジュール、もしくは幾つかのモジュールで使う場合があります。
今まではトップレベルのbuild.gradle
でバージョンを管理していましたが、新しい機能のversionCatalogs
を使用します。
こちらの記事で書いています。
全体的な構成
全体的な構成は以下のようにしました
- app: アプリ本体
- Feature1のみimportしています
- Infrastructureにはアクセスできません
- Feature1: 機能1のロジックとか
- Infrastructureのみimportしています
- Infrastructure: APIアクセス、DataStoreなど
アクセス修飾子について
モジュール分割をしていく中で、どのクラスを公開しどのクラスを非公開にするかを考えることがありました。
kotlin
のデフォルトのアクセス修飾子を調べたところ、public
だったので、他のモジュールで公開したくないクラス等にはinternal
かprivate
を付けました。
つまづきポイント
APIリクエストからKotlin Flowへの変換
Kotlin
には、LiveData
のような機能としてFlow
があります。今回、APIクライアントとしてRetrofit
を使いましたが、Flow
に変換する部分を書くのに時間がかかってしまいました。
解決策として、こちらの記事を参考にしました。
FlowからLiveDataへの変換
こちらの記事に書かれているように、ライブラリの追加が必要でした。
androidx.lifecycle:lifecycle-livedata-ktx
ViewModel内でcorutineを使うために
viewModelScope
は以下のライブラリにありました。
androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0
このように使っています。
fun listRepo(user: String) {
viewModelScope.launch {
feature1Logic.listRepos(user)
.collect {
_repos.postValue(it)
}
}
}
ViewModelの作成
ViewModel
の初期化方法についても、少し前から変わっていました。
viewModels()
のところがなかなか見つからなかったのですが、以下の2つのライブラリが必要でした。
androidx.activity:activity-ktx:1.4.0
androidx.activity:fragment-ktx:1.4.0
以下のように使用しています。
private val viewModel by viewModels<MainViewModel>()
Discussion