設定 APK のビルドを設定する

設定 APK(config APK)のビルドをセットアップすることにより、各ユーザーのデバイス上のアプリの APK のサイズを縮小できます。これにより、アプリの DEX コードとデバイスに依存しないリソースが 1 つの APK に、デバイス固有のネイティブ コードとリソースの各セットが別の APK に配置されます。デバイスはアプリの実行に必要な APK のみを要求します。これにより、特定の画面密度、ABI、言語のファイルを含む APK を作成して、アプリのダウンロード サイズを減らすことができます。

設定 APK は複数 APK と似ていますが、次の点が異なります。

  • 現在、複数 APK はインストール済みアプリのみ、APK は Instant App でのみ使用できます。
  • 複数 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_64x86mips64mipsarm64-v8aarmeabi-v7aarmeabi です。たとえば、デバイスが x86armeabi-v7a の両方に対応し、APK が両方で使用可能な場合、x86 APK が(基本 APK とともに)配信されます。

密度の場合、Play は使用可能な密度の中からデバイスの密度に最も近い APK を選択します。

言語による APK の選択はより複雑です。

ターゲット言語に関する特別なご注意

Play がユーザーのロケールと正確に一致させようとすることを期待するかもしれません。それが en-GB の場合、利用可能なら en-GB をターゲットにした APK を配信し、そうでない場合は en にフォールバックします。この方法には 2 つの問題があります。

  1. 設定 APK には、strings.xml ファイルと同じように、すべての文字列の翻訳を含める必要はありません。1 つまたは少数の文字列に言語を追加することもできます(それが一般的です)。たとえば、en/strings.xml は「car」と「truck」を含み、en-rGB/strings.xml は「lorry」のみを含む場合があります。そのため、すべてのデバイスに必要な翻訳のセットが複数の strings.xml ファイルにまたがる場合があるように、それらのファイルが複数の設定 APK に含まれている場合があります。
  2. Android デバイスには、さまざまなフォールバック グラフがあります。Android リリースでフォールバック グラフを変更できます(たとえば、言語とロケールのガイドをご覧ください)。さらに、OEM はフォールバックの順序をカスタマイズします。(たとえば、“zh”“zh-TW”“zh-CN” のどちらが優先されるかは、OEM によって異なります。)Play では、リクエスト元のデバイスで使用されているフォールバックの順序がわからない場合もあります。

Play では、言語のサブタグ(ダッシュの前の部分)がユーザーの選択したロケールの言語に一致する言語を対象とするすべての設定 APK を配信することにより、この問題を回避します。これは、フォールバック アルゴリズムは通常、言語間でフォールバックしないという観察に基づいています。例:

ユーザーのロケールは de-CH です。
利用可能な APK は dede-CHde-ATfr です。
Play は、dede-CHde-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 に配置されます。