🍯

AABファイルサイズが肥大化してしまいアップデート申請できなかった話

に公開

この記事を投稿した背景

アプリアップデートのためにいつものようにAABファイルを作成し、Google Play Consoleにアップロードしようとしたところ、規定の200MBを超えていて申請ができませんでした。
原因を調べて解決するまでに行ったことを備忘録として残すために作成しました。

解決するにあたって自分自身がAABファイルについて詳細まで理解をしていなかったので、基本的なことを調べてみました。

1.AABとは何か?

Android App Bundle(AAB)はアプリの公開用形式で、アプリ本体(コード+全リソース)を含んだものを一つアップロードする。
このAABファイル自体はユーザーにそのまま配布されるわけではなく、Google Playがユーザーの端末に合わせたAPKを自動的につくる設計図のようなファイルになっている。

つまり、実際に端末に配布されるのはGooglePlayによって生成されたAPKで、AABはその元になるパッケージファイル。

2.AABのメリット

ユーザーの利点

各ユーザーの端末(例えば言語、画面密度、CPUアーキテクチャなど)にとって必要なコードとリソースだけがダウンロードされるため、インストール完了までの時間が短くなる

例えば、多言語対応しているアプリケーションの場合に日本語ユーザーには英語や韓国語のリソースは不要なので日本語リソースだけを含むAPKを作成してくれる。

デベロッパー側の利点

多様なデバイスをサポートするために**「端末ごと・CPUアーキテクチャごと」に複数のAPKをビルド・署名・管理する必要がなくなる**。

3.AABファイルサイズを小さくするために行ったこと

a.ABIをターゲットのCPUアーキテクチャのみに絞る

今回行った対応で最も効果があったのがこの設定です。

そもそも、ABIとは Application Binary InterfaceのことでアプリとOS・ハードウェア間のやりとりの取り決め(命令セット・データ構造・関数呼び出し規約)を定義する仕組みのこと。

同じコードでも、Android端末のCPUアーキテクチャ(arm64、x86_64など)によってネイティブライブラリの形式(ABI)が異なる。
AABでは、ABIごとにネイティブライブラリを自動で分割し、端末に合わせて必要なものだけを含むAPKを生成する。これにより、不要な .so ファイルを含まない最小構成のAPKを配信でき、ファイルサイズを削減することが可能。

Androidでよく使われる主なABIは以下の通り。現在は64bit対応が必須条件となっているので注意

ABI名 対応CPU 備考
armeabi-v7a 32bit ARM 多くのAndroid端末で利用(旧世代)
arm64-v8a 64bit ARM 現在の主流。Google Playでは64bit対応必須
x86 32bit Intel 一部エミュレータ・古い端末
x86_64 64bit Intel 一部Chromebookなど

手動制御が必要な場合のbuild.gradleでの設定

通常はAABが自動的にABIごとの分割を行うため、特別な設定は不要だが、対象を特定のCPUアーキテクチャに絞りたい場合にはbuild.gradleのndkセクションで設定する必要がある。
指定したABI以外のネイティブライブラリはビルド時に除外されるため、32bitライブラリを含めないことでファイルサイズを削減することができる。

android {
    defaultConfig {
        ndk {
            abiFilters "arm64-v8a", "x86_64"
        }
    }
}

b.画像を使用する時はWebP形式を使用する

WebPはGoogleが開発した画像ファイル形式。イラストや写真、ボタン背景などの画像はWebP形式にすることで大幅に容量を削減することができる。

特徴

  • JPEGのような非可逆圧縮に対応
  • PNGのような透明度設定が可能
  • 圧縮率において、JPEGやPNGよりも優れている
    • 同じ画質でも20〜50%ほど軽くなるため、アプリ容量の削減、読み込み速度の改善につながる

非可逆圧縮に対応したWebP画像はAndroid4.0(APIレベル14)以上でサポートされ、可逆圧縮と透明度に対応したWebP画像はAndroid4.3(APIレベル18)以上でサポートされる。

変換については公式ドキュメント参照↓
https://developer.android.com/studio/write/convert-webp?hl=ja&utm_source=chatgpt.com

c.不要なリソースがインストールされないよう適切なディレクトリ構成を設計する

ローカライズに対応したアプリケーションの場合、strings.xml(デフォルト言語)以外にも日本語や韓国語など必要な言語ごとにファイルを作成する必要がある。
このファイルはres/values-〇〇/strings.xmlというように言語ごとにディレクトリを作成することでインストール時に不要な言語ファイルを含めないようにすることができる。

画像なども同様にres/drawable-〇〇/background.pngとすることで対応可能。

https://developer.android.google.cn/guide/topics/resources/providing-resources?hl=ja#AlternativeResources

まとめ

この記事ではアプリ申請時に必要なAABファイルの基本的な知識や、AABファイルを適切に作成するための方法について解説をしました。

私自身、AABやgradleの設定について深く理解していなかったため、これをきっかけにgradleファイルの設定について見直すいい機会になりました!

最後に

株式会社ジャンボではエンジニアを絶賛募集中です!
少しでも気になった方はぜひカジュアルにお話しましょう!
Wantedly: https://www.wantedly.com/companies/company_725162
HP Recruit: https://jambo-inc.io/recruit/

Jambo Tech Blog

Discussion