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

設定 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_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 に配置されます。