Dynamic feature moduleを少し試したので、メモを残しておきます。
基本的なことはドキュメントを見てもらえると。単純に新規Moduleを Dynamic Feature Module
で作ってみると良いと思います。
依存関係
メインModuleが各Feature moduleに依存してるのではなく、各Feature moduleがメインModuleに依存している形になります。
Feature moduleの build.gradle
には、次のように書くことになります。
dependencies {
// メイン(app)moduleに依存
implementation project(':app')
}
なので、メインModuleからはFeature moduleのクラスを直接参照することが出来ません。
画面遷移
依存関係が原因で、直接Feature moduleのActivityやFragmentを参照することができないので、文字列で指定していく感じになります。
下のような感じで、Intentを作ることになります。
val intent = Intent(Intent.ACTION_VIEW).setClassName(
"com.example",
"com.example.feature1.FeatureActivity"
)
OnDemand
Feature moduleはあとからダウンロードすることはもちろんできるのですが、逆に最初からアプリに含めることもできます。
FeatureModuleの AndroidManifest.xml
のほうで、 dist:onDemand="false"
とするとアプリインストール時に同時に含めてくれます。
<dist:module
dist:onDemand="false"
dist:title="@string/module_include_feature">
<dist:fusing dist:include="true" />
</dist:module>
このあたりの詳しい設定値はドキュメントのほうを参照してください。
デバッグ実行
デバッグ実行するときは、 Run/Debug Configurations
の設定で予めmoduleを含めることが出来ます。
下のような感じで、含めたいModuleにチェックを入れるとアプリに含まれて実行されます。
Play Core Library
Dynamic feature moduleを管理してくれるライブラリになります。これを使ってインストール等を行います。
使い方自体はそんなに難しくないと思います。
Googleのサンプルも参考にしてみると良いと思います。
Dynamic feature moduleのダウンロード確認
これはデバッグ実行等では確認できません。Play Consoleの内部テスト版トラック等にアップする必要があります。
これはだいぶ面倒ですね…
Dagger
最大の難関です。依存関係のせいで、Android拡張も簡単にいかない状況で、頭を抱えてる問題です。
まったく不可能ってことはないのですが、まだ良いやり方だと思える方法を見つけられてません。引き続き調査が必要です。
ビルド速度
正直ちゃんと試せてないですが、依存関係から、1つのFeature moduleを変更した場合は、他のModuleをビルドし直す必要がないので、だいぶ速くなりそうな気がします。あとはparallelでのビルドも効果がありそうです。
まとめ
ぼくはずっと勘違いしてて、ダウンロードが必ず必要だと思ってたのですが、最初からアプリに含めることも出来るのを初めて知りました。あとは依存関係が想像と逆だったのも驚きました。
一度は触っておくべきですね…
依存関係の問題があるので、だいぶ工夫が必要そうです。あとはDaggerをなんとかしたいですね。
アプリ容量やビルド速度が改善されるので、いつかプロダクションで使いたい気持ちです。
参考
最後に参考として、Googleの方の記事を載せておきます。Tipsがいくつかあるので、目を通しておくと良いと思います。