アプリのサイズを削減する

アプリのサイズが小さいことは、ダウンロードの成功に直接関係します。特に顕著なのが、デバイスのネットワーク接続状況が悪い、または通信速度が遅い新興国の市場です。その結果、アプリの使用率が下がり、ターゲット ユーザーの範囲とリーチが限られるおそれがあります。しかし、アプリのサイズを縮小できる方法が複数あります。

おすすめの方法

Android App Bundle としてアプリをダウンロードする

Google Play にアプリを公開する時点ですぐにサイズを削減するには、Android App Bundle を使用してアプリをアップロードすることが最も簡単な方法です。この新しい公開形式には、アプリのコンパイル済みコードとリソースがすべて含まれ、APK の生成と署名は Google Play で行われるようになります。

ランタイム コードのサイズを削減する

ランタイムに使用されないコード(大規模なクラスや自動生成コードなど)がアプリにないかどうかを確認します。R8 のようなコード最適化ツールは、コードサイズの最適化と縮小に役立ちますが、ランタイム定数で保護されたコードには対応できません。チェックフラグをコンパイル時定数に置き換えることで、さまざまな最適化ツールを最大限に活用できます。不要なコードとリソースの削除は Gradle 構成ファイルで有効にできます。

android {
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
        }
    }
}

不要なレイアウトを削除する

未使用のレイアウトを UI の小さな変更と統合し、不要なレイアウトを削除することで、アプリのコードサイズ全体を削減します。また、可能な場合は、レイアウトとビューを動的にレンダリングすることもできます。これにより、静的テンプレートの描画を回避し、技術的なオーバーヘッドなしで代替レイアウトを適用できます。

使用頻度の低い機能を再評価する

具体的には、1 日のアクティブ ユーザー(DAU)指標が低い機能を無効にして、Android(Go バージョン)向けに最適化します。たとえば、複雑なアニメーションや大きな GIF ファイルなど、アプリの成功に不要な、見た目のための追加部分を除去することが考えられます。

Dynamic Delivery を活用する

Play Feature Delivery は App Bundle の高度な機能を使用することで、アプリの特定の機能を条件付きで配信する、またはオンデマンドでダウンロード可能にすることができます。機能モジュールをカスタム配信に使用することもできます。機能モジュールの特長は、Android 5.0(API レベル 21)以上を搭載したデバイスに対して、アプリのさまざまな機能をどのように、どのタイミングでダウンロードするかをカスタマイズできることです。

翻訳可能な文字列のサイズを削減する

Android Gradle の resConfigs プロパティを使用すると、アプリに不要な代替リソース ファイルを削除できます。言語リソースを含むライブラリ(AppCompat や Google Play 開発者サービスなど)を使用している場合、アプリの翻訳とは無関係に、ライブラリ メッセージの翻訳済みのすべての言語文字列がアプリに含まれることになります。アプリが公式にサポートする言語のみ保持するようにするには、resConfig プロパティを使用してそれらの言語を指定します。指定しない言語のリソースは削除されます。

言語リソースを英語とフランス語のみに限定するには、下記のように defaultConfig を編集します。


android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
    }
}

翻訳対象を選別する

アプリの UI に表示されない文字列は、翻訳する必要はありません。デバッグ用の文字列、例外メッセージ、URL は、リソースではなく、コード内の文字列リテラルにする必要があります。

たとえば、URL の翻訳は不要です。

<string name="car_frx_device_incompatible_sol_message">
  This device doesn\'t support Android Auto.\n
  &lt;a href="https://support.google.com/androidauto/answer/6395843"&gt;Learn more&lt;/a&gt;
</string>

&lt;&gt は、<> のエスケープ文字です。<a> タグを <string> タグ内に含めると、Android リソース コンパイラがタグを認識せずに破棄するため、エスケープ文字が必要になります。しかし、この HTML タグと URL は 78 の言語に翻訳されることになります。代わりに、HTML を削除することをおすすめします。

<string name="car_frx_device_incompatible_sol_message">
         This device doesn\'t support Android Auto.
</string>

共通の依存関係を持つネイティブ バイナリを統合する

アプリ内の複数の Java Native Interface(JNI)実装に、共通する基本的依存関係が含まれている場合、さまざまなバイナリに冗長なコンポーネントが含まれることになるので、APK サイズが増えます。Java ファイルと JNI ファイルを分離したまま、複数の JNI バイナリを 1 つの JNI バイナリ ファイルにまとめることができます。これにより、APK サイズを大幅に削減できます。