gplay-submission-checks について
Google Play へのアプリ公開を準備する Android 開発者向けのリリース確認スキルです。gplay コマンドで成果物、ストア掲載情報、コンプライアンス、公開準備状況を調べる方法を案内し、オフラインの事前チェックやドライランも扱います。
主な機能
- 01公開準備状況をまとめて検証
- 02バンドルとストア情報を確認
- 03成果物のコンプライアンスをスキャン
- 04ローカル情報と Play Store を比較
- 05ドライランでリリース手順を検証
活用シーン
- 01提出前に AAB または APK を確認
- 02掲載情報やスクリーンショットの問題を検出
- 03CI パイプラインにコンプライアンス検査を追加
- 04変更を確定せずにリリース手順を試行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tamtom/ gplay-cli-skills --skill gplay-submission-checksインストール後、Claude Code で/gplay-submission-checksを入力して読み込まれたか確認します。
詳細
Google Play 提出前のチェック
リリースを Google Play に提出する前に、このスキルを使ってすべてを検証し、リジェクトや編集の失敗を減らしましょう。
前提条件
- 認証が設定されていること(
gplay auth loginまたはGPLAY_SERVICE_ACCOUNTenv var)。 - パッケージ名がわかっていること(
--packageまたはGPLAY_PACKAGE)。 - AAB/APK がビルドされ、署名済みであること。
- サービスアカウントに少なくとも「Release Manager」権限があること。
まずは専用コマンドを使う
CLI には、用途に合わせて設計された標準コマンドがあります。個別のバリデーターを手作業で実行する前に、まずこれらを使ってください。
-
gplay validate --package <pkg>— リリース準備状況を確認する標準レポートです。 ローカルの成果物/メタデータ/スクリーンショット/リリースノートのチェックと、リモートのトラックやストア掲載情報の状態、Console でのみ対応できる項目をまとめて確認します。--bundle、--listings-dir、--screenshots-dir、--track、--strict(警告を失敗として扱う)を使って対象を指定します。gplay validate \ --package com.example.app \ --bundle app-release.aab \ --track production \ --strict -
gplay preflight --file <app.aab>— AAB/APK のコンプライアンスと健全性をオフラインで確認します。AndroidManifest.xmlを完全にデコードし(APK はバイナリ AXML、App Bundle は aapt2 protobuf)、9 つのスキャナー(manifest、permissions、native_libs、metadata、secrets、billing、privacy、policy、size)を実行します。API 呼び出しも認証情報も不要です。終了コード:問題なしは 0、--fail-on以上の指摘がある場合は 1 です。gplay preflight --file app-release.aab --max-size 150M --fail-on warning # Validate the store listing in the same pass gplay preflight --file app-release.aab --listings-dir ./metadata --fail-on error # Narrow the gate gplay preflight --file app-release.aab --only manifest,permissions,native_libs各スキャナーの検出対象、指摘の読み方、CI のゲート設定パターンについては、
gplay-preflightスキルを参照してください。 -
gplay checks upload— CI ゲートとして Google Checks のコンプライアンス分析を実行します。リリース前に、優先度の高いチェック失敗がある場合にパイプラインを失敗させるには、--severity-threshold PRIORITYを使います。gplay checks upload \ --account "$CHECKS_ACCOUNT" \ --app "$CHECKS_APP" \ --binary app-release.aab \ --binary-type ANDROID_AAB \ --severity-threshold PRIORITY -
gplay publish track --strict— プリフライトと公開を一度に実行します。準備状況レポートを作成し、ブロッキング項目(および--strictを指定した場合は警告)があれば停止し、プリフライトに合格した場合にのみリリースのワークフローを実行します。gplay publish track \ --package com.example.app \ --track production \ --bundle app-release.aab \ --release-notes @release-notes.json \ --strict
以下に示す成果物ごとの詳細なチェックは、失敗の原因を絞り込む場合や、個別の項目ごとにゲートを設定する CI ステップで引き続き役立ちます。
提出前チェックリスト
1. バンドルの整合性を検証する
gplay validate bundle --file app-release.aab
チェック項目:
- ファイルが存在し、読み取り可能であること
- ファイルの拡張子が
.aabであること - ZIP アーカイブ構造が有効であること
- 必須のバンドルコンポーネント(マニフェスト、リソース、dex)が含まれていること
代わりに APK を使う場合:
gplay validate bundle --file app-release.apk
2. ストア掲載情報のメタデータを検証する
gplay validate listing --dir ./metadata
チェック項目:
- タイトル:最大 30 文字
- 短い説明:最大 80 文字
- 詳細な説明:最大 4000 文字
- 必須項目が入力されていること
- UTF-8 エンコーディングが有効であること
特定のロケールを検証する場合:
gplay validate listing --dir ./metadata --locale en-US
JSON 形式のメタデータの場合:
gplay validate listing --dir ./metadata --format json
3. スクリーンショットを検証する
gplay validate screenshots --dir ./metadata
チェック項目:
- デバイスタイプごとに最低 2 枚のスクリーンショットがあること
- デバイスタイプごとに最大 8 枚のスクリーンショットであること
- 画像形式が有効であること(PNG、JPEG)
- ファイルが読み取り可能であること
特定のロケール向けに検証する場合:
gplay validate screenshots --dir ./metadata --locale en-US
4. Play ストアの既存の掲載情報を確認する
ローカルのメタデータを公開中の情報と比較します:
gplay sync diff-listings \
--package com.example.app \
--dir ./metadata
設定されているすべてのロケールを確認します:
EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
gplay listings list --package com.example.app --edit $EDIT_ID --output table
5. データ セーフティの申告
データ セーフティ フォームが完成していることを確認してください。データ セーフティの申告が欠けていたり、不正確だったりすることは、リジェクトのよくある理由です。
gplay data-safety update \
--package com.example.app \
--json @data-safety.json
6. バージョンコードを確認する
バージョンコードは、すべてのトラックで過去のリリースより厳密に大きい必要があります。現在のトラックの状態を確認します:
gplay tracks list --package com.example.app --output table
特定のトラックの詳細を取得します:
EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
gplay tracks get --package com.example.app --edit $EDIT_ID --track production --output table
7. 難読化解除/マッピングファイル
ProGuard/R8 マッピングファイルをアップロードすると、Play Console のクラッシュレポートを読み取れるようになります。
このコマンドは編集に紐づいており(--edit が必要です)、バージョンを指定するフラグは --version-code ではなく --apk-version です:
EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
gplay deobfuscation upload \
--package com.example.app \
--edit $EDIT_ID \
--apk-version 42 \
--file mapping.txt
gplay edits commit --package com.example.app --edit $EDIT_ID
マッピングファイルがないと、Android Vitals のクラッシュスタックトレースは難読化されたままとなり、利用できません。
8. リリースのドライラン
提出前のチェックとして最も安全な方法です。変更を確定せずに、リリースパイプライン全体を実行します:
gplay release \
--package com.example.app \
--track production \
--bundle app-release.aab \
--release-notes @release-notes.json \
--dry-run
実行内容:
- 編集を作成する
- バンドルをアップロードする
- トラックを設定する
- 編集を検証する(API レベルのエラーを検出します)
- 確定せずに編集を破棄する
ドライランが成功すれば、実際のリリースも成功します。
9. 編集の検証(手動シーケンス)
手動編集のワークフローを使用する場合は、コミットする前に必ず検証してください。
EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
# ... upload bundle, update tracks, etc. ...
# Validate the edit (catches all server-side issues)
gplay edits validate --package com.example.app --edit $EDIT_ID
# Only commit if validation passes
gplay edits commit --package com.example.app --edit $EDIT_ID
コンテンツポリシーへの準拠
対象 API レベル
Google Play では、アプリが最近の Android API レベルを対象とすることが求められており、毎年およそ 8 月に、下限が「最新リリースから 1 つ前」へ引き上げられます。新しいアプリとアップデートの両方が対象となり、下限を下回るビルドはアップロード時に拒否されます。
現在の数値を推測せずに、ビルドを確認してください。
# The policy scanner reports targetSdkVersion against Play's floor
gplay preflight --file app-release.aab --only policy
# Override the floor if Google's annual bump landed before a gplay release
gplay preflight --file app-release.aab --only policy --min-target-sdk 36
build.gradle / build.gradle.kts で修正してください。
android {
defaultConfig {
targetSdk = 35 // set to Play's current floor or higher
}
}
特定の必須 API レベルを記憶に頼ってユーザーに伝えないでください。policy スキャナーの出力、または Play が公開している要件を確認してください。
権限の申告
機密性の高い権限には、Play Console での正当な理由の説明が必要です。
ACCESS_FINE_LOCATION/ACCESS_BACKGROUND_LOCATIONREAD_CONTACTS、READ_CALL_LOG、READ_SMSCAMERA、RECORD_AUDIOREQUEST_INSTALL_PACKAGESQUERY_ALL_PACKAGES
アプリで実際に必要のない権限は削除してください。使用されていない機密性の高い権限は、拒否理由の上位を占めています。
データ セーフティ フォーム
すべてのアプリで、データ セーフティ セクションを漏れなく記入する必要があります。申告が必要となる一般的なデータの種類は次のとおりです。
- 個人情報(氏名、メールアドレス、電話番号)
- 位置情報(おおよその位置情報、正確な位置情報)
- 財務情報(購入履歴)
- アプリのアクティビティ(アプリ内検索、その他のユーザー生成コンテンツ)
- デバイス識別子(広告 ID)
アプリのコンテンツ レーティング
Play Console でコンテンツ レーティングの質問票が完了していることを確認してください。レーティングが未設定の場合、配信がブロックされます。
デバイスの種類ごとのスクリーンショット要件
| デバイスの種類 | 画像の種類 | 最小数 | 最大数 | 最小解像度 |
|---|---|---|---|---|
| スマートフォン | phoneScreenshots | 2 | 8 | 320px(短辺) |
| 7 インチ タブレット | sevenInchScreenshots | 0 | 8 | 320px(短辺) |
| 10 インチ タブレット | tenInchScreenshots | 0 | 8 | 320px(短辺) |
| Android TV | tvScreenshots | 0 | 8 | 1280x720 |
| Wear OS | wearScreenshots | 0 | 8 | 320px(短辺) |
追加の画像アセット:
| アセット | 種類 | 必須 |
|---|---|---|
| フィーチャー グラフィック | featureGraphic | はい(特集掲載の場合) |
| プロモーション グラフィック | promoGraphic | いいえ |
| アイコン | icon | Play Console で設定 |
| TV バナー | tvBanner | TV アプリでは必須 |
よくある拒否理由と対処法
1. 「バージョン コードがすでに存在します」
原因: バンドルのバージョン コードが、既存のリリースと一致しています。
対処法: build.gradle の versionCode を増やして、再ビルドしてください。
2. 「APK/バンドルが必須レベルより低い SDK を対象としています」
原因: targetSdkVersion が低すぎます。
対処法: targetSdkVersion を 34 以上に更新して、再ビルドしてください。
3. 「データ セーフティ フォームが未完了です」
原因: データ セーフティの申告がないか、内容が不完全です。 対処法: Play Console でデータ セーフティ フォームを記入するか、CLI で更新してください。
gplay data-safety update --package com.example.app --json @data-safety.json
4. 「必須のデバイスの種類のスクリーンショットがありません」
原因: すべてのアプリで、スマートフォンのスクリーンショットが必要です。 対処法: スマートフォンのスクリーンショットを少なくとも 2 枚追加してください。
EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
gplay images upload \
--package com.example.app \
--edit $EDIT_ID \
--locale en-US \
--type phoneScreenshots \
--file screenshot1.png
5. 「デフォルトのロケールのリリースノートがありません」
原因: デフォルト言語の「新機能」テキストがありません。 対処法: リリースコマンドにリリースノートを含めてください。
gplay release \
--package com.example.app \
--track production \
--bundle app.aab \
--release-notes '{"en-US": "Bug fixes and improvements"}'
6. 「署名鍵が一致しません」
原因: バンドルが、Play Console で想定されているものとは異なる鍵で署名されています。 対処法: Play App Signing で設定したものと同じアップロード鍵を使用してください。キーストアの設定を確認してください。
7. 「難読化解除ファイルが大きすぎます」
原因: マッピングファイルが 300 MB の上限を超えています。 対処法: 未使用のマッピングを取り除くか、ファイルを圧縮してください。
リリース前レポート
Google Play は審査前にアプリの自動テストを実行します(リリース前レポート)。よく報告される問題は次のとおりです。
- 起動時のクラッシュ:1 台以上のテスト端末でアプリがクラッシュする
- セキュリティの脆弱性:依存関係に既知の CVE がある
- アクセシビリティの問題:コンテンツの説明がない、タップ領域が小さい
- パフォーマンスに関する警告:起動が遅い、ウェイクロックが過剰
いずれかのトラックにアップロードした後、Play Console でリリース前レポートを確認してください。本番環境への昇格前に、重大な問題に対処してください。
送信前の完全なパイプライン
#!/bin/bash
# pre-submission-checks.sh
PACKAGE="com.example.app"
BUNDLE="app-release.aab"
METADATA_DIR="./metadata"
RELEASE_NOTES="release-notes.json"
MAPPING="app/build/outputs/mapping/release/mapping.txt"
echo "=== Step 1: Validate bundle ==="
gplay validate bundle --file "$BUNDLE" --output table
echo "=== Step 2: Validate listings ==="
gplay validate listing --dir "$METADATA_DIR" --output table
echo "=== Step 3: Validate screenshots ==="
gplay validate screenshots --dir "$METADATA_DIR" --output table
echo "=== Step 4: Diff listings against Play Store ==="
gplay sync diff-listings --package "$PACKAGE" --dir "$METADATA_DIR" --output table
echo "=== Step 5: Dry run release ==="
gplay release \
--package "$PACKAGE" \
--track production \
--bundle "$BUNDLE" \
--release-notes "@$RELEASE_NOTES" \
--listings-dir "$METADATA_DIR" \
--screenshots-dir "$METADATA_DIR" \
--dry-run \
--output table
echo "=== Step 6: Upload mapping file (edit-scoped) ==="
EDIT_ID=$(gplay edits create --package "$PACKAGE" | jq -r '.id')
gplay deobfuscation upload \
--package "$PACKAGE" \
--edit "$EDIT_ID" \
--apk-version 42 \
--file "$MAPPING"
gplay edits commit --package "$PACKAGE" --edit "$EDIT_ID"
echo "=== All checks passed. Ready to release. ==="
CI/CD との統合
問題が Play Console に届く前に検出できるよう、これらのチェックを CI パイプラインに追加してください。
# GitHub Actions example
- name: Offline preflight (compliance + secret scan)
run: gplay preflight --file app/build/outputs/bundle/release/app-release.aab --fail-on error
- name: Checks compliance gate
run: |
gplay checks upload \
--account ${{ secrets.CHECKS_ACCOUNT }} \
--app ${{ secrets.CHECKS_APP }} \
--binary app/build/outputs/bundle/release/app-release.aab \
--binary-type ANDROID_AAB \
--severity-threshold PRIORITY
- name: Canonical readiness report
run: |
gplay validate \
--package ${{ secrets.PACKAGE_NAME }} \
--bundle app/build/outputs/bundle/release/app-release.aab \
--track internal \
--strict
env:
GPLAY_SERVICE_ACCOUNT: ${{ secrets.GPLAY_SERVICE_ACCOUNT_PATH }}
エージェントの動作
- 手作業でスクリプトを作成するより、第一級のコマンドである
gplay validate(準備状況レポート)、gplay preflight(オフライン)、gplay checks upload(Checks ゲート)、およびgplay publish track --strict(事前チェック+公開)を優先してください。 - リリースを試みる前に、必ず
gplay validateを実行してください。 - 実際のリリース前の最終ゲートとして、
--dry-run(またはpublish track --strict)を使用してください。 gplay deobfuscation uploadは編集単位のコマンドです。--editと--apk-versionを使用し(--version-codeではなく)、その後編集をコミットしてください。- コマンドを実行する前に、必ず
--helpで正確なフラグを確認してください。 - 人が読みやすい検証結果を出力するには、
--output tableを使用してください。 - 複数の検証手順が失敗した場合、最初の失敗で止めず、すべての失敗をまとめて報告してください。
- リリース前にトラックを一覧表示し、バージョンコードの競合を確認してください。
- ユーザーがデータセーフティの申告に触れていない場合は、その申告について注意を促してください。
注記
gplay validateコマンドはローカルで実行され、API 呼び出しは必要ありません。gplay release --dry-runは実際の編集セッションを作成しますが、検証後に破棄します。gplay edits validateはサーバー側で同等の処理を行い、ローカル検証では検出できない問題を検出します。- 正確なコマンドのフラグを確認するには、必ず
--helpを使用してください。 - 人が読みやすい出力には
--output tableを使用してください。デフォルトは JSON です。