機能モジュールを使用すると、アプリのベース モジュールから特定の機能とリソースを分離して App Bundle に組み込むことができます。その後、配信オプションをカスタマイズして、Android 5.0(API レベル 21)以上を搭載したデバイスがアプリの機能をいつどのようにダウンロードするかを制御できます。
このタイプのモジュール化には多くの労力と、場合によってはアプリの既存のコードのリファクタリングが必要になるため、アプリのどの機能をユーザーにオンデマンドで提供すればメリットが最大になるかを慎重に検討してください。
アプリの動作を変更したり高度な配信オプションをカスタマイズしたりせずに、時間をかけて徐々にアプリの機能をモジュール化する場合は、インストール時の配信を設定した機能モジュールを作成します。つまり、高度なオプションを有効にせずに機能を機能モジュールとしてモジュール化することで、ユーザーはアプリをインストールした際にその機能を使用できるようになります。
また、インストール時の配信を設定した機能モジュールを作成する方法には、後で機能が不要になったらアンインストールできるという利点があります。たとえば、アプリのインストール サイズを削減するために、トレーニングやオンボーディングに必要なコンテンツをモジュール化して、ユーザーがアプリの使用に慣れたらそれらの機能モジュールをアンインストールできるようにするケースがあります。
このセクションでは、インストール時に配信する機能モジュールの作成方法について説明します。はじめに、Android Studio 3.5 以上と Android Gradle Plugin 3.5.0 以上を使用していることをご確認ください。
インストール時の配信用の新しいモジュールを設定する
新しい機能モジュールを作成する最も簡単な方法は、Android Studio 3.5 以上を使用することです。機能モジュールは本来的にベースアプリ モジュールと依存関係にあるため、既存のアプリ プロジェクトにしか追加できません。
Android Studio を使用してアプリ プロジェクトに機能モジュールを追加する手順は次のとおりです。
- IDE 内でアプリ プロジェクトをまだ開いていない場合は、開きます。
- メニューバーから [File] > [New] > [New Module] を選択します。
- [Create New Module] ダイアログで [Dynamic Feature Module] を選択して [Next] をクリックします。
- [Configure your new module] で次のように入力します。
- [Base application module] プルダウンからそのアプリ プロジェクトのベース モジュールを選択します。
- [Module name] にモジュール名を指定します。この名前は IDE によって Gradle 設定ファイル内でそのモジュールを Gradle サブプロジェクトとして識別するために使用されます。サブプロジェクト名の最後の要素は、App Bundle をビルドする際、Gradle によって、
<manifest split>
属性を機能モジュールのマニフェストに挿入するために使用されます。 - [Package name] にモジュールのパッケージ名を指定します。Android Studio でのデフォルトのパッケージ名は、ベース モジュールのルート パッケージ名と、前のステップで指定したモジュール名を組み合わせた名前です。
- [Minimum API level] で、モジュールがサポートする最小 API レベルを選択します。この値はベース モジュールの値と一致している必要があります。
- [Next] をクリックします。
[Module Download Options] セクションで次のように入力します。
[Module title] にモジュールのタイトルを半角 50 文字(全角 25 文字)以内で指定します。アプリのベース モジュールのタイトルは、文字列リソースとして指定して、翻訳できるようにする必要があります。Android Studio を使ってこのモジュールを作成すると、IDE はその文字列リソースをベース モジュールに追加して、次のようなエントリをその機能モジュールのマニフェストに挿入します。
<dist:module ... dist:title="@string/feature_title"> </dist:module>
[Install-time inclusion] のプルダウンで、[Include module at install-time] を選択します。Android Studio はデベロッパーの選択に合わせて、モジュールのマニフェストに以下を挿入します。
<dist:module ... > <dist:delivery> <dist:install-time /> </dist:delivery> </dist:module>
アプリのインストール後にダウンロードできる機能モジュールの作成方法については、オンデマンド配信の設定をご覧ください。
Android 4.4(API レベル 20)以下を搭載したデバイスでこのモジュールを使用可能にして、マルチ APK に含める場合は、[Fusing] チェックボックスをオンにします。つまり、分割 APK のダウンロードとインストールに対応していないデバイスを対象外にすることができます。Android Studio はデベロッパーの選択に合わせて、モジュールのマニフェストに以下を挿入します。
<dist:module ...> <dist:fusing dist:include="true | false" /> </dist:module>
[Finish] をクリックします。
Android Studio でモジュールの作成を終えた後、[Project] ペインでモジュールの内容を確認します(メニューバーから [View] > [Tool Windows] > [Project] を選択します)。デフォルトのコード、リソース、編成は、標準のアプリ モジュールの場合と同様です。
機能モジュールのビルド構成
Android Studio を使用して新しい機能モジュールを作成する際、IDE によって次の Gradle プラグインがモジュールの build.gradle
ファイルに適用されます。
// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.
apply plugin: 'com.android.dynamic-feature'
標準のアプリ プラグインで使用できるプロパティの多くは、機能モジュールでも使用できます。以下のセクションでは、機能モジュールのビルド構成に含めるべきプロパティと含めるべきでないプロパティについて説明します。
機能モジュールのビルド構成に含めるべきでないプロパティ
各機能モジュールはベース モジュールに依存しているため、特定の構成も継承します。したがって、機能モジュールの build.gradle
ファイルから次の項目を除外する必要があります。
- 署名設定: App Bundle はベース モジュールで指定する署名設定を使って署名されます。
minifyEnabled
プロパティ: ベース モジュールのビルド構成からのみ、アプリ プロジェクト全体に対するコード圧縮を有効にすることができます。したがって、このプロパティを機能モジュールから除外する必要があります。ただし、機能モジュールごとに追加の ProGuard ルールを指定できます。versionCode
とversionName
: App Bundle をビルドする際、Gradle はベース モジュールが提供するアプリ バージョン情報を使用します。したがって、これらのプロパティを機能モジュールのbuild.gradle
ファイルから除外する必要があります。
ベース モジュールとの関係を確立する
Android Studio は、機能モジュールを作成する際、android.dynamicFeatures
プロパティをベース モジュールの build.gradle
ファイルに追加することにより、ベース モジュールから機能モジュールを認識できるようにします。下記をご覧ください。
// In the base module’s build.gradle file.
android {
...
// Specifies feature modules that have a dependency on
// this base module.
dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}
また、下記のように、Android Studio は機能モジュールの依存関係としてベース モジュールも含めます。
// In the feature module’s build.gradle file:
...
dependencies {
...
// Declares a dependency on the base module, ':app'.
implementation project(':app')
}
追加の ProGuard ルールを指定する
アプリ プロジェクトのコード圧縮を有効にできるのはベース モジュールのビルド構成のみですが、proguardFiles
プロパティを使用して、機能モジュールごとにカスタム ProGuard ルールを指定できます。下記をご覧ください。
android.buildTypes {
release {
// You must use the following property to specify additional ProGuard
// rules for feature modules.
proguardFiles 'proguard-rules-dynamic-features.pro'
}
}
これらの ProGuard ルールは、ビルド時に他のモジュール(ベース モジュールを含む)のルールと統合されます。したがって、機能モジュールごとに新しいルールセットを指定することはできますが、それらのルールはアプリ プロジェクト内のすべてのモジュールに適用されます。
アプリをデプロイする
機能モジュールをサポートするアプリの開発中も、通常のように、接続されたデバイスにアプリをデプロイできます。それには、メニューバーから [Run] > [Run] を選択します(またはツールバーで実行アイコン をクリックします)。
アプリ プロジェクトに 1 つ以上の機能モジュールが含まれる場合、アプリのデプロイ時にどの機能を含めるかを選択できます。それには、次のようにして既存の実行 / デバッグ構成を変更します。
- メニューバーから [Run] > [Edit Configurations] を選択します。
- [Run/Debug Configurations] ダイアログの左パネルの [Android App] で該当するアプリの構成を選択します。
- [General] タブの [Dynamic features to deploy] で、アプリのデプロイ時に含める各機能モジュールのチェックボックスをオンにします。
- [OK] をクリックします。
デフォルトでは、Android Studio が App Bundle を使用してアプリをデプロイすることはありません。代わりに IDE が APK をビルドしてデバイスにインストールします。この APK は、サイズよりも、デプロイの早さについて最適化されます。IDE ではなく、Android Studio で App Bundle からの APK と Instant 版のビルド、デプロイを行うように設定するには、実行 / デバッグ構成を変更します。
参考情報
機能モジュールの使用の詳細については、以下のリソースをご覧ください。