設定 APK(config APK)のビルドをセットアップすることにより、各ユーザーのデバイス上のアプリの APK サイズを縮小できます。 これにより、アプリの DEX コードとデバイスに依存しないリソースが 1 つの APK に、デバイス固有のネイティブ コードとリソースの各セットが別の APK に配置されます。 デバイスはアプリの実行に必要な APK のみをリクエストします。これにより、特定の画面密度、ABI、言語のファイルを含む APK を作成して、アプリのダウンロードサイズを縮小することができます。
設定 APK は複数 APK と類似していますが、次の重要な相違点があります。
- 現在、複数 APK はインストール済みのアプリでのみ、設定 APK は Instant Apps でのみ使用できます。
- 複数 APK では、属性の組み合わせごとに 1 つの APK が作成されます。設定 APK には、デバイスに依存しない DEX コードを持つ 1 つの基本 APK と、さまざまなディメンションごとの各値に 1 つの APK(たとえば、サポートされている言語、密度、ABI ごとに 1 つの APK)があります。たとえば、密度と言語によって異なり、4 つの密度と 3 つの言語をサポートするアプリがあるとします。複数 APK を使用する場合、デベロッパーは 3 × 4 = 12 APK をアップロードします。設定 APK では、1(基本)+ 3 + 4 = 8 APK をアップロードします。複数 APK を使用する場合、APK は 1 つのデバイスに 1 つだけ配信されます。設定 APK の場合、デバイスは基本 APK に加えて、サポートされているディメンション(現在の言語、密度、ABI)ごとに 1 つ以上のリソース APK を受け取る場合があります。
- 複数 APK を使用する場合は、バージョン コードを使用して、デバイスに互換性のある複数の APK から選択できます。設定 APK では、デベロッパーが指定した順序は使用されません。順序は、使用可能な APK のターゲット設定によって決まります。
-
設定 APK では新しい対象ディメンション
language
がサポートされていますが、 複数 APK ではサポートされません。
要件
設定 APK のビルドをセットアップする前に、次の手順でビルドの準備ができていることを確認し、Android Studio で必要なツール設定を確認します。
- Instant App モジュールの最小 SDK バージョンを 21 以上に設定している
- Android Studio 3.0 以降を使用している
設定 APK のビルドを設定する
言語に基づいて設定 APK のビルドをセットアップするには、language ブロックを機能モジュールの splits
ブロックに追加し、android
ブロックで generatePureSplits = true
を指定します。splits
ブロックの設定の詳細については、複数 APK 用のビルドの設定をご覧ください。
android { ... generatePureSplits = true splits { abi { enable = true } density { enable = true } language { enable = true include "es-rMX", "zh", "en" } } }
language の値は、代替リソースを提供するで説明されている形式です。
設定 APK の配信
複数 APK を使用する場合とは異なり、デベロッパーは複数の同等の設定 APK に順序を定義しません。どれを配信するかを Play はどうやって決めるのでしょうか。
ABI の場合、Play は、すべてのデバイスで同じ固定の順序を使用して、互換性のある APK の中から選択します。この順序は x86_64
、x86
、mips64
、mips
、arm64-v8a
、armeabi-v7a
、armeabi
です。たとえば、デバイスが x86
と armeabi-v7a
の両方に対応し、APK が両方で使用可能な場合は、x86
APK が(基本 APK とともに)配信されます。
密度の場合、Play は使用可能な密度の中からデバイスの密度に最も近い APK を選択します。
言語による APK の選択はより複雑です。
ターゲット言語に関する特別なご注意
Play がユーザーのロケールと正確に一致させようとすることを期待するかもしれません。それが en-GB
の場合は、利用可能であれば en-GB
をターゲットにした APK を配信し、そうでない場合は en
にフォールバックします。この方法には 2 つの問題があります。
-
設定 APK には、
strings.xml
ファイルの場合と同じく、すべての文字列の翻訳を含める必要はありません。1 つまたは少数の文字列に言語を追加することもできます(それが一般的です)。たとえば、en/strings.xml
は「car」と「truck」を含み、en-rGB/strings.xml
は「lorry」のみを含む場合があります。そのため、すべてのデバイスに必要な翻訳のセットが複数のstrings.xml
ファイルにまたがる場合があるように、それらのファイルが複数の設定 APK に含まれている場合があります。 -
Android デバイスには、さまざまなフォールバック グラフがあります。Android リリースでフォールバック グラフを変更できます(たとえば、言語とロケールのガイドをご覧ください)。
さらに、OEM はフォールバックの順序をカスタマイズします。(たとえば、
“zh”
で“zh-TW”
と“zh-CN”
のどちらが優先されるかは、OEM によって異なります。)Play では、リクエスト元のデバイスで使用されているフォールバックの順序がわからない場合もあります。
Play では、言語のサブタグ(ダッシュの前の部分)がユーザーの選択したロケールの言語に一致する言語を対象とするすべての設定 APK を配信することにより、この問題を回避します。 これは、フォールバック アルゴリズムは通常、言語間でフォールバックしないという観察に基づいています。例:
ユーザーのロケールは de-CH
です。
利用可能な APK は de
、de-CH
、de-AT
、fr
です。
Play は de
、de-CH
、de-AT
を配信しますが、fr
は配信しません。
Play は、fil
/ tag
などの言語のサブタグが一致していなくても、言語をグループ化する必要がある特定のよく知られたケースも処理します。
グループ化は、配信時に Play によって行われ、デベロッパー側では何もする必要がありません。
トラブルシューティングとよくある質問
- Gradle が設定 APK を生成せず、代わりに次のメッセージを出力しました
Variant ..., MinSdkVersion 18 is too low (<21) to support pure splits, reverting to full APKs
Instant App モジュールの build.gradle ファイルで
minSdkVersion = 21
と指定してください。 - Gradle プラグインが次のメッセージを出力します
> Configure project :base Pure splits are not supported by PlayStore yet.
これは既知の問題です。このメッセージは無視してください。
- 設定 APK は 4 MB の制限にどのように影響を与えますか?
機能サイズは、機能 APK のサイズ、基本機能 APK のサイズ、デバイスに配信できる設定 APK の最大セットの合計です。たとえば、機能の基本 APK に 3 つの言語 APK、基本に 2 つの密度 APK、機能 APK に 2 つの密度 APK がある場合、最終的な機能サイズは、機能 APK のサイズ、基本 APK のサイズ、基本の最大言語 APK と最大密度 APK、機能の最大密度 APK の合計となります。
既知の問題
- Gradle で ABI APK をビルドすると、一部の増分ビルドで失敗します(https://issuetracker.google.com/69680755)。この問題は、再度クリーンアップしてビルドすることで回避できます。
-
現在、ビルドツールでは、複数のディメンションを持った設定 APK を作成できません。
たとえば、プロジェクトでは、フランス語の
xhdpi
デバイス用のリソースがres/drawable-fr-xhdpi
に格納されている場合がありますが、Gradle ではそのようなリソースを設定 APK に配置することができません。そのようなリソースは、基本 APK または機能 APK に配置されます。