Android TV アプリが Google Play の審査を通るまで

2024年11月16日

Godot4.2 で エクスポートしたAndroid TV向けのアプリをリリースしようとしたところ、アイコンがポリシーに準拠していないこと理由に否承認になりました。今回はこの事象について解決までの経緯を書きます。

(お断り:文章内で曖昧な表現になっている箇所がありますが、確証がないため、そのような表記になっています。類似の事象に遭遇した場合の参考になれば幸いです。)

(2024/11/16 タイトルを変更しました)

結論

  • アイコン画像を前景と背景に分けた時、前景部分のサイズを小さくする必要がある。
  • Godot4.2 では、エクスポート時にAndroid向けのアイコンを生成した後 gradleが実行される。修正したアイコンをリソース用のディレクトリにコピーするために、build.gradleを編集した。

否承認について

Google Play Support から送信されたメールのうち、否承認の理由に関する部分は次の通りです。(改行等を入れています。リンクは【】で表示しています。)

問題が見つかりました。 フルサイズのアプリバナーやアプリアイコンがない

お客様のアプリには、ランチャーに表示されるフルサイズのアプリバナーとアプリアイコンを含める必要があります。
ターゲットは 1080p で、xhdpi として扱われます。
xhdpi(320 dpi)のドローアブル フォルダに、320 x 180 ピクセルのサイズのバナーと 512 x 512 ピクセルのサイズのアイコンを含める必要があります。
詳しくは、【ホーム画面にバナーを配置する】をご参照ください。

ユーザーが、ランチャー内のアプリをタイトルで識別できるようにする必要があります。詳しくは、【ビジュアル デザインとユーザー操作】をご参照ください。

- アイコンがアイコン領域全体に表示されていません。

Android TV アプリの品質に関するガイドライン について

【Android TV アプリの品質】に関するガイドラインに準拠していない Android TV アプリは承認されません。

アイコンについて

今回の場合、アイコンについては、次の条件を満たす必要があったようです。

  • 解像度 xhdpi のリソースファイルディレクトリに 512 x 512 ピクセルのアイコンファイルを置く
  • このアイコンの前景部分のサイズは、 Google TV の円形アイコンの中に収まる程度にする(下記画像参照)

検索するとアイコンが原因で否承認になった事例が確認できます。解決のヒントについても記載があります。

このアイコンにおけるポリシー変更の情報です。

TV アプリ向けのアイコンのガイドラインが存在します。 figmaのテンプレートが用意されていますが、現時点で 512px x 512px の画像は確認できません。

512px x 512px のアイコンに関する記述は Google Playのアイコン仕様にあります。

  • https://developer.android.com/distribute/google-play/resources/icon-design-specifications
    • イラストを使用したアイコンはアイコン領域全体に表示するような記述があり、これが否承認の理由の「アイコンがアイコン領域全体に表示されていません。」になるように見えます。
    • ロゴのようなアートワークはフチ無し(full bleed)にするのではなく、キーライン上に配置するようにと記述があります。今回の場合はこちらに該当するように思えます。

参考 フルブリード印刷で注文するには、アートワークをどのように設定すればいいですか。 https://www.stickermule.com/jp/support/full-bleed

最終的にレビューをパスしたアイコンは以下になります。 (このアイコンのアプリはこちらです)

icon.png

アイコン画像自体は 512px x 512pxです。アイコン内のカレンダー部分のサイズは縦240px、横220pxです。

このアイコンを実機(Chromecast with Google TV)で表示した時の画像が以下になります。

icon on Chromecast with Google TV

Godot 4.2 でTV向けにAndroidアプリをエクスポートする

Godot 4.2でAndroid TV 向けアプリのエクスポートオプションが追加されたので、これを利用してアプリをエクスポートします。

Godot 4.2 でAndroidアプリをエクスポートする場合、エクスポート処理は次のように動作します。

  • プロジェクト設定で指定されたアイコンファイルから各解像度ごとにサイズ変更したアイコンを生成して、それを android/build/res/ ディレクトリ以下の所定の位置にコピーする
  • gradleを実行する

Godotのエクスポート処理で生成したこれらのアイコンのサイズは残念ながらTVアプリのアイコンのポリシーに適合していません。 そのため、使用したいアイコンファイルを別途用意して、リソースディレクトリのアイコンファイルを置き換える必要があります。 (アイコンを生成する処理は上記のエクスポートオプションとは別に用意されたようです。)

ただし、単純にファイルを置き換えるだけでは、エクスポート処理で上書きされてしまいます。そのため、gradleの処理の中で、アプリのビルドを行う前に、アイコンファイルをリソースディレクトリにコピーします。また、./res/mipmap-xhdpi-v4/icon.png を削除しています。これは gradleのビルド処理の失敗を解決するためです。(このファイルとコピーするファイルが競合するため)

以下は build.gradle ファイルで、アイコンファイルのコピーと削除を行うタスクを定義しています。 (参考 Run task before compilation using Android Gradle plugin https://stackoverflow.com/questions/16853130/run-task-before-compilation-using-android-gradle-plugin)

build.gradle(一部)

// add the following lines at the end of the file

task deleteIcon(type: Delete) {
    // avoid conflict to ./res/mipmap-xhdpi/icon.png
    delete './res/mipmap-xhdpi-v4/icon.png'
}

task copyIcon(type: Copy) {
    from '../assets/res'
    include '**/*.png'
    into './res'
}

copyIcon.dependsOn "deleteIcon"
preBuild.dependsOn "copyIcon"

用意したアイコンファイル、そのコピー先、削除するアイコンファイルの位置関係は次のとおりです。(バナー用の画像ファイルもコピーしていますがここでは割愛します。)

android
├── assets
│   └── res
│       └── mipmap-xhdpi
│           └── icon.png ★ 用意したアイコンファイル
├── build
│   ├── AndroidManifest.xml
│   ├── build.gradle
│   ├── res
│   │   ├── mipmap-xhdpi
│   │   │   └── icon.png ★ 用意したアイコンファイルのコピー先
│   │   ├── mipmap-xhdpi-v4
│   │   │   └── icon.png ★ 削除する