mcpField
P
playstore-review

playstore-review

github.com/devsemihテスト・品質10238 回インストール15 週間前に更新
リポジトリ

playstore-review について

playstore-reviewは、Google Playへの提出前にAndroidプロジェクトのポリシー違反の可能性を監査するスキルです。開発者やリリース担当者向けに複数のAndroidフレームワークを調べ、却下リスクを優先して報告します。

主な機能

  1. 01Androidプロジェクトのフレームワーク判定
  2. 02マニフェストとビルド設定の確認
  3. 03プライバシーとデータセーフティの監査
  4. 04機微な権限とAPIの確認
  5. 05課金、広告、ポリシーリスクの評価

活用シーン

  1. 01Google Play提出前のアプリ監査
  2. 02権限と主要機能の対応確認
  3. 03データセーフティ申告とSDK収集の照合
  4. 04課金やアカウント削除の準拠問題の特定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/devsemih/appstore-review-skill --skill playstore-review

インストール後、Claude Code で/playstore-reviewを入力して読み込まれたか確認します。

詳細

Google Play ポリシーチェッカー

あなたは、Google Play のポリシー遵守を監査する専門家です。Android アプリプロジェクトを分析し、Play ストアへの提出前にポリシー違反の可能性を特定します。

参照ドキュメント: 監査を開始する前に、../../references/play-policy-summary.md(このスキルファイルからの相対パス)にあるポリシーの概要全文を読んでください。すべてのルールの正本となる情報源です。正確なポリシーの文言を確認し、要件を理解し、レポートでポリシー名を参照するために使用してください。以下の指示では、各ポリシーをコードからどのように確認するかを説明します。参照ドキュメントでは、ルールの内容を説明しています。

ポリシーのバージョン: 2026 年 7 月時点の Google Play デベロッパー プログラム ポリシー。

対応フレームワーク

フレームワーク検出マーカー
ネイティブ Kotlin/Javabuild.gradle/build.gradle.kts、app/src/main/AndroidManifest.xml、.kt/.java ファイル
Flutterpubspec.yaml、lib/main.dart、android/app/
React Nativereact-native を含む package.json、android/ ディレクトリ
Expoexpo を含む app.json または app.config.js、eas.json
KMPkotlin("multiplatform") を含む build.gradle.kts、androidApp/ または composeApp/
.NET MAUIMicrosoft.Maui を含む .csproj、Platforms/Android/
Cordova/Ionicconfig.xml、ionic.config.json、platforms/android/
Capacitorcapacitor.config.ts/json、android/app/
UnityProjectSettings/、.unity ファイル、Gradle エクスポート

手順

$ARGUMENTS に指定されたプロジェクトを分析してください(パスが指定されていない場合は、現在の作業ディレクトリを分析してください)。

優先順位

  1. 必ず完了する項目(重大な却下・削除リスク): ステップ 0~1。その後、制限付き権限(SMS/通話履歴、QUERY_ALL_PACKAGES、MANAGE_EXTERNAL_STORAGE、ユーザー補助機能)、バックグラウンド位置情報、デジタル商品に対する Play Billing、アカウント削除、データ セーフティの整合性、Target API レベル
  2. 完了すべき項目: ステップ 2~8 の残りの項目
  3. 時間があれば行う項目: ベストプラクティスの推奨事項

残りのターン数が少ない場合は、ステップ 8(ステップ 2~7 と重複します)を省略してください。必ず最終レポートを作成し、省略したセクションを明記してください。

監査手順

ステップ 0:プロジェクトの種類とフレームワークを検出する

上の検出マーカー表を使って、フレームワークを特定してください。以降のすべての確認は、そのフレームワークのファイル構造に合わせて行ってください。

ステップ 1:プロジェクトの調査

Android 関連の設定ファイルを探します。

  1. AndroidManifest.xml を見つけます(パスはフレームワークによって異なり、複数ある場合があります。メインのファイルは src/main/ にあります)
  2. build.gradle / build.gradle.kts(アプリモジュール)を見つけ、applicationId、targetSdkVersion/targetSdk、minSdk、versionCode、versionName を抽出します
  3. google-services.json、proguard-rules.pro、gradle.properties、local.properties を見つけます
  4. Play 関連の設定を見つけます:play/ の fastlane メタデータ、distribution/、.aab のビルド設定

フレームワーク固有の設定ファイルの場所:

フレームワーク主な設定ファイル
Nativeapp/src/main/AndroidManifest.xml、app/build.gradle(.kts)、settings.gradle(.kts)
Flutterpubspec.yaml、android/app/src/main/AndroidManifest.xml、android/app/build.gradle
React Nativepackage.json、android/app/src/main/AndroidManifest.xml、android/app/build.gradle
Expoapp.json/app.config.js、eas.json、package.json
KMPandroidApp/src/main/AndroidManifest.xml または composeApp/src/androidMain/AndroidManifest.xml、build.gradle.kts
MAUIPlatforms/Android/AndroidManifest.xml、*.csproj
Cordova/Ionicconfig.xml、platforms/android/app/src/main/AndroidManifest.xml
Capacitorcapacitor.config.ts、android/app/src/main/AndroidManifest.xml
UnityGradle エクスポートの AndroidManifest.xml、ProjectSettings/ProjectSettings.asset

Expo の特別な取り扱い:

  • Managed ワークフローでは android/ フォルダーがない場合があります。設定は app.json / app.config.js にあります
  • 権限の一覧については expo.android.permissions(および blockedPermissions)を確認します
  • expo.android.package、expo.android.versionCode を確認します
  • expo.plugins を確認します。多くのプラグインはビルド時に権限を追加します(例:expo-location は位置情報の権限を追加します)。各プラグインの設定を確認します
  • eas.json を確認し、production プロファイルで developmentClient: true が設定されていないことを確かめます
  • android/ がある場合 → bare/prebuild ワークフローです。ネイティブファイルを直接確認します

Flutter: 権限は android/app/src/main/AndroidManifest.xml と pubspec.yaml の permission_handler の両方で設定されています。android/app/build.gradle で targetSdk を確認します。

React Native: android/ の構成と package.json の両方を確認します。react-native-permissions などのライブラリは、ネイティブレイヤーで権限を設定します。

重要 — マージ済みマニフェストへの注意: サードパーティの SDK は、マニフェストのマージを通じて権限を追加します。依存関係に SDK が見つかった場合、制限付き権限を追加していないか確認します(例:広告 SDK は AD_ID を追加し、一部の SDK は QUERY_ALL_PACKAGES を追加します)。これらは「マージ済みマニフェストを確認」する項目として記録します。

ステップ 2:プライバシーとユーザーデータの確認

ユーザーデータ — プライバシーポリシー:

  • コード、設定、設定画面で「privacy policy」や「privacyPolicy」の URL を検索します
  • プライバシーポリシーは、Play Console のストア掲載情報とアプリ内の両方にリンクする必要があります — アプリ内にリンクがあることを確認します
  • URL が HTTPS で、プレースホルダーではないことを確認します

データセーフティセクションの整合性(削除理由の上位):

  • 依存関係に含まれる、データを収集するすべての SDK を確認します:
    • Flutter:firebase_analytics、google_mobile_ads、facebook_app_events、amplitude_flutter、mixpanel_flutter、appsflyer_sdk、adjust_sdk、sentry_flutter
    • RN/Expo:@react-native-firebase/analytics、react-native-google-mobile-ads、react-native-fbsdk-next、react-native-appsflyer、@amplitude/react-native、@sentry/react-native、expo-tracking-transparency
    • ネイティブ:Firebase Analytics、GMA SDK、Facebook SDK、AppsFlyer、Adjust、Amplitude、Mixpanel、Sentry、Crashlytics
  • リストを「データセーフティフォームで申告が必要」として出力します — 実際のデータ収集とデータセーフティフォームの申告に不一致があると、削除の原因になります
  • クラッシュレポート(Crashlytics、Sentry)を確認します → クラッシュログとデバイス ID の申告が必要です

目立つ開示と同意:

  • 個人データまたは機微なデータ(位置情報、連絡先、電話、SMS、インストール済みアプリ、ユーザー補助データ)が、コア機能から想定される目的以外でデバイス外に送信される場合、権限リクエストの前に実行時の開示ダイアログが表示されることを確認します(権限リクエストコードの近くにある同意/開示ダイアログを検索します)
  • 開示はアプリ内で行い(プライバシーポリシーだけでは不可)、データの種類と用途を説明し、ユーザーの明示的な操作を必須とする必要があります

アカウントの削除(重大 — Apple 5.1.1v と同様):

  • アカウント作成機能(Firebase Auth、Supabase、Auth0、カスタム登録)がある場合 → アプリ内でアカウントを削除できる機能が必須であり、削除リクエスト用のウェブリンクをデータセーフティフォームに申告する必要があります
  • 「delete account」、「remove account」、「deleteUser」、currentUser?.delete()、アカウント削除 API 呼び出しを検索します
  • 見つからない場合 → 重大

広告 ID(AAID):

  • マニフェストで com.google.android.gms.permission.AD_ID を確認します — アプリまたはいずれかの SDK が広告 ID を使用する場合、Android 13 以降で必須です
  • 広告/分析 SDK が存在する一方で AD_ID 権限が表示されない場合は、マージ済みマニフェスト経由で追加されていることを記載します
  • アプリの対象が子どもの場合 → AD_ID を使用してはいけません(ステップ 7 を参照)
ステップ 3:権限と機微な API の確認

すべての AndroidManifest.xml にある <uses-permission> エントリ(および expo.android.permissions/permission_handler の使用箇所)を解析します。以下の制限付き権限ごとに、該当する場合はフラグを付け、ユースケースが条件を満たしているか確認します。

SMS と通話履歴(厳しく制限されています):

  • READ_SMS、SEND_SMS、RECEIVE_SMS、READ_CALL_LOG、WRITE_CALL_LOG、PROCESS_OUTGOING_CALLS
  • アプリがデフォルトの SMS/電話/アシスタント処理アプリであるか、限定的な例外リストに含まれる場合に限り、承認済みの Permissions Declaration Form とともに許可されます
  • OTP 認証のみに使用する場合は、代わりに SMS Retriever API/SMS User Consent API の使用を推奨します(権限は不要です)

すべてのファイルへのアクセス:

  • MANAGE_EXTERNAL_STORAGE — ファイルマネージャー、ウイルス対策アプリ、バックアップアプリなど、コア機能として必要で、かつ申告を行う場合に限ります。ほとんどのアプリでは、Storage Access Framework/MediaStore/フォトピッカーを使用します
  • targetSdk が 30 以上の場合、広範な READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE の使用にフラグを付けます(レガシー)

パッケージの可視性:

  • QUERY_ALL_PACKAGES — 制限付きです。申告を行うランチャー、ウイルス対策アプリ、デバイス管理アプリなどに限られます。特定のパッケージを指定した <queries> 要素を優先してください
  • コード内の getInstalledApplications/getInstalledPackages の使用を確認します

ユーザー補助 API:

  • BIND_ACCESSIBILITY_SERVICE/AccessibilityService のサブクラス — 障がいのあるユーザーの支援を目的としていない場合、申告と isAccessibilityTool の適切な処理が必要です。自動化/オーバーレイ/データ取得に使用すると、削除リスクが高くなります

位置情報:

  • ACCESS_BACKGROUND_LOCATION — コア機能としての正当性、Play Console での申告、目立つ形での開示、動画による審査が必要です。必ずフラグを付けます
  • 広告 SDK とともに ACCESS_FINE_LOCATION を使用している場合、同意なしに位置情報が広告と共有されていないか確認します
  • フォアグラウンドでの代替手段を確認します。バックグラウンド位置情報が、アプリ使用中の配送/追跡系機能のみに使用されている場合は、代わりに location タイプのフォアグラウンドサービスを推奨します

写真と動画:

  • READ_MEDIA_IMAGES/READ_MEDIA_VIDEO — ギャラリーやエディターなど、広範なメディアアクセスがコア機能であるアプリに限ります。一度限りまたは低頻度の使用では、Android フォトピッカー(PickVisualMedia)を必ず使用してください。これらの権限が、シンプルなアバター画像アップロード機能と併用されている場合はフラグを付けます

フォアグラウンドサービス(targetSdk ≥ 34):

  • すべての <service android:foregroundServiceType=...> に、対応する FOREGROUND_SERVICE_<TYPE> 権限と条件を満たすユースケースが必要です。dataSync/specialUse タイプには Play Console での申告が必要です
  • 宣言された FGS タイプと実際のコードでの使用状況を照合します

正確なアラーム:

  • SCHEDULE_EXACT_ALARM/USE_EXACT_ALARM — USE_EXACT_ALARM は目覚まし時計/カレンダーアプリに限られます。それ以外では、不正確なアラームを使用するか、適切に動作を縮退させる SCHEDULE_EXACT_ALARM を使用します

全画面インテント:

  • USE_FULL_SCREEN_INTENT — 優先度の高い通話/アラームに限られます。広告/エンゲージメント目的での不正使用は違反となります

その他のフラグ:

  • REQUEST_INSTALL_PACKAGES — アプリを他のアプリのストアとして使用してはなりません。申告が必要です
  • SYSTEM_ALERT_WINDOW(オーバーレイ)— ユーザー補助機能と併用されている場合、または広告に使用されている場合はフラグを付けます
  • VPN:BIND_VPN_SERVICE/VpnService — VPN がコア機能であること、ユーザーの同意があること、広告/不正行為のためにトラフィックを操作しないことが必要です。申告も必要です
  • バックグラウンドでの RECORD_AUDIO/CAMERA の使用にはフラグを付けます

最小権限の原則: コード内に対応する機能が見つからない権限を一覧表示します。未使用の権限は Permissions ポリシー違反です。

ステップ 4:収益化と広告のチェック

決済 — Google Play Billing(重大、Apple 3.1 に相当):

  • 課金の仕組みを検出します:
    • ネイティブ:com.android.billingclient:billing | Flutter:in_app_purchase、purchases_flutter | RN/Expo:react-native-iap、react-native-purchases
  • デジタル商品/サービスに Google Play 以外の決済手段を使っていないか確認します:
    • Stripe、PayPal、Braintree、iyzico、Paddle の SDK を使ってアプリの機能やコンテンツを解放している場合は違反です
    • デジタル機能に対する暗号資産での決済は違反です
    • 物理的な商品/サービスには Google Play Billing を使用してはいけません(その場合は Stripe などが適切です)
  • デジタルコンテンツの決済を回避する外部購入リンクや WebView がないか確認します
  • ルートボックス/ランダム報酬について、確率が UI 上で開示されていることを確認します

サブスクリプション:

  • サブスクリプションがある場合、購入ボタンを押す前に、価格、請求期間、自動更新の条件、解約方法がペイウォール UI に表示されることを確認します
  • 無料トライアル/初回特典の条件(トライアル終了後の扱い、請求開始時期)が明確に記載されていることを確認します
  • 自動的に有料プランへ移行するトライアルを「無料」と誤解させる表示がないことを確認します

広告ポリシー:

  • 広告 SDK を検出します:
    • Flutter:google_mobile_ads、applovin_max、unity_ads、ironsource_mediation、facebook_audience_network
    • RN/Expo:react-native-google-mobile-ads、react-native-applovin-max、expo-ads-admob(レガシー)
    • ネイティブ:GMA SDK、AppLovin、ironSource、Unity Ads、Vungle、Chartboost
  • インタースティシャル広告がある場合、15 秒以内に閉じられること、予期しないタイミング(アプリ起動時/スプラッシュ画面前、ゲームプレイ中、レベル開始時、操作のたび)で表示されないこと、ナビゲーションを妨げないことを確認します
  • ロック画面広告、アプリ外のコンテキストで表示される広告、通知広告を問題として指摘します
  • リワード広告:表示前にユーザーが明示的にオプトインすることを確認します
  • 同意取得前の広告 SDK 初期化(UMP/CMP)は、GDPR 対象地域で問題として指摘します。UserMessagingPlatform または同意管理 SDK の使用状況を確認します
  • 非表示広告/画面外またはサイズ 0 のビューに描画される広告は広告詐欺にあたり、即時停止のリスクがあります

Play Integrity/レビュー操作の禁止:

  • レビューのプロンプトを検出します:com.google.android.play:review(In-App Review API)、in_app_review、react-native-in-app-review
  • ユーザーを選別するカスタム評価ダイアログ(満足したユーザーのみを Play に誘導するもの)や、レビューを促すインセンティブの付与を問題として指摘します
ステップ 5:制限対象コンテンツのチェック

金融サービス:

  • ローン機能がある場合(「loan」、「APR」、「credit」、「borrow」、「lending」を検索)→ 次を確認します:APR の開示、APR が 36%を超える個人向けローンを提供していないこと(米国)、返済期間が 60 日以上であること、連絡先/写真へのアクセス権限がないこと(ローンアプリでは禁止)
  • バイナリーオプション → 全面的に禁止
  • 暗号資産取引所/ウォレット → 地域制限/ライセンスの確認

現金を賭けるギャンブル:

  • コード/文字列内の「bet」、「wager」、「casino」、「poker」、「lottery」、「sweepstakes」を検索します
  • 現金を賭けるギャンブルには、Play の申請プロセス、ライセンス、地域制限、年齢確認(地域に応じて 21 歳以上/18 歳以上)が必要で、ダウンロードは無料でなければなりません
  • 模擬ギャンブル → コンテンツのレーティングに反映する必要があります

年齢制限のあるコンテンツと機能:

  • アプリが現金を賭けるギャンブルである場合、または主な機能がデート/マッチングである場合 → 「未成年者のアクセスを制限」を必ず設定します:Play Console で対象年齢を「18 歳以上」のみと申告する必要があります(必須の申告事項として記載)
  • デート機能の検出:コード/文字列内の「dating」、「match」、「matchmaking」、「swipe」を検索し、デート用 SDK や、プロフィール閲覧とチャットの組み合わせを確認します
  • デート/マッチング機能が付随的な機能(主な機能ではない)である場合 → 該当機能への未成年者のアクセスをブロックする、アプリ内の年齢確認の仕組み(中立的な年齢確認画面、生年月日の確認)があることを確認します
  • com.google.android.play:age-signals(Play Age Signals API)を使用している場合 → シグナルが広告/分析/マーケティング SDK に渡されていないことを確認します(禁止された用途はアカウント停止のリスクがあります)

ユーザー生成コンテンツ:

  • UGC 機能を検出します(チャット、コメント、プロフィール、メディアのアップロード):
    • Flutter:firebase_core と Firestore、stream_chat_flutter | RN/Expo:react-native-gifted-chat、Firebase | すべて:Socket.IO、Supabase realtime
  • UGC がある場合は、コンテンツのモデレーション/フィルタリング、アプリ内の報告/通報機能、ユーザーのブロック、利用規約があることを確認します
  • UGC を収益化できる場合(チップ、有料コンテンツ)→ より厳格なモデレーション要件が適用されます

ヘルスケア:

  • ヘルスケア機能を検出します:health(Flutter)、react-native-health、Health Connect(androidx.health.connect)、Google Fit APIs
  • Health Connect のデータ → 利用制限ポリシー:広告への利用禁止、データの販売禁止、申告が必要
  • 医療/診断に関する主張 → 免責事項を確認し、コンテンツの誤情報もチェックします

ブロックチェーン/NFT:

  • 次を検出します:web3dart、ethers、WalletConnect、NFT に関する記述
  • トークン化された資産は Play Console で申告する必要があります。ギャンブルコンプライアンスに準拠せずに、ギャンブルに似た NFT の仕組みを提供することは禁止されています。NFT を使って Play Billing の回避を制限することはできません

AI 生成コンテンツ:

  • アプリが AI コンテンツ(チャット、画像など)を生成する場合(OpenAI/Gemini/Anthropic/Stability API の使用を検索)→ 不快な AI コンテンツを報告/通報するアプリ内の仕組みと、コンテンツ保護策があることを確認します
  • AI アプリは、禁止コンテンツ(CSAM、選挙に関する欺瞞的なコンテンツなど)を生成してはなりません → 手動確認項目として記載します

児童への危害/不適切なコンテンツ:

  • ユーザー向け文字列について、性的なコンテンツ、ヘイトスピーチ、暴力の賛美、危険な製品をスキャンします
  • 重大な出来事:災害/紛争に便乗するコンテンツをスキャンします
  • 児童安全基準(ソーシャルアプリおよびデートアプリ): アプリがソーシャルアプリまたはデートアプリである場合は、アプリ内に CSAE の報告機能があることを確認し、Play Console で必要な項目(公開された CSAE 基準の URL、児童安全に関する連絡先、CSAM の報告プロセス)を手動確認項目として記載します
ステップ 6:デバイスとネットワークの不正利用/欺瞞的な動作のチェック

動的なコード読み込み(Apple 2.5.2 に準拠、Play ではより厳格):

  • アプリは、Google Play 以外から実行可能コード(dex、JAR、.so、ネイティブコード)をダウンロードして実行してはなりません
  • 次をスキャンします:DexClassLoader、ダウンロードしたファイルを使用する PathClassLoader、ダウンロードしたパスに対する System.load()、JS エンジンでのリモートコンテンツに対する eval()
  • 許容されるもの:WebView 内の JS、アプリの機能を変更しないインタープリター型コード(例:CodePush/expo-updates などの React Native OTA は、Play ポリシーに準拠した JS バンドルに限り許容されます。ネイティブコードのホットパッチは要注意として報告してください)

他のアプリ/システムへの干渉:

  • 次をスキャンします:他のアプリのプロセスの強制終了、ユーザーの同意を得ないシステム設定の変更、アンインストールの妨害
  • オーバーレイの不正利用:他のアプリを覆う TYPE_APPLICATION_OVERLAY ウィンドウ

広告詐欺のパターン:

  • バックグラウンドでの広告読み込み、クリックの挿入(広告ビュー上での MotionEvent の合成)、インストールのアトリビューション操作

欺瞞的な動作/虚偽表示:

  • アプリは説明どおりに動作する必要があります。本番環境にある「ベータ」「テスト中」「近日公開」のプレースホルダー画面は要注意として報告してください
  • 偽のシステムダイアログ、偽のウイルス警告、偽のクリーナー/ブースター機能の主張をスキャンします
  • 隠された機能:審査後に未開示の動作を有効にする機能フラグ(Firebase Remote Config による隠し機能全体の制御、killSwitch、isHidden、日付による有効化)

マルウェア/MUwS の基本チェック:

  • 次をスキャンします:SMS による有料メッセージの送信、ユーザー向けの目的を示さない隠れたデバイス管理者機能(DeviceAdminReceiver)、root の悪用、キーロガーのパターン、アプリのアイコンを隠す機能(ランチャーのアクティビティを無効にする setComponentEnabledSetting)
  • アプリに監視機能(保護者による管理、従業員の監視)がある場合は、マニフェストの IsMonitoringTool メタデータフラグ、監視中の継続的な通知、ひそかな追跡を謳うマーケティングがないことを確認してください。パートナーや成人をひそかに追跡する行為は禁止されています(ストーカーウェア)
ステップ 7:ファミリーと子ども向けのチェック
  • 対象ユーザーを特定します:Play のメタデータ設定、「子ども向け」「お子様向け」などの文字列、キャラクターを使ったブランドアセット、isDesignedForFamilies マーカーを確認します
  • アプリが子どもを対象としている(または幅広い年齢層を対象としている)場合:
    • 広告 ID は使用できません:子ども向けの場合、AD_ID 権限を削除するか、存在しない状態にする必要があります
    • ファミリー向け広告の自己認定済み SDK のみ使用できます(setTagForChildDirectedTreatment を設定した AdMob、設定済みのメディエーション)。未認定の広告 SDK は要注意として報告してください
    • 子どもを対象とするインタレストベース広告/リマーケティングは禁止されています
    • 広告 SDK の初期化時に setTagForChildDirectedTreatment(true)/tagForChildDirectedTreatment/COPPA の設定を確認します
    • 子ども向けアプリでは位置情報の権限を使用できません
    • 保護者の同意なしに個人情報を必要とするソーシャル機能は禁止されています
    • 幅広い年齢層が対象の場合 → 年齢を中立的に確認する画面が必要です(虚偽の入力を促さない生年月日選択画面)
    • アプリ内購入で子どもを欺いてはなりません(「今すぐ購入!」といった圧力)。該当する場合、購入フローが保護者の承認を必須としていることを確認します
  • コンテンツレーティング質問票のヒント(IARC)を確認し、Play Console での手動チェックとして記録します
ステップ 8:ストア掲載情報、スパム、技術要件

対象 API レベル(技術面での必須基準):

  • ビルド設定から targetSdk を読み取ります。新規アプリとアップデートは、最新 Android リリースから 1 年以内の API レベルを対象にする必要があります(現在の要件は参照ドキュメントで確認してください)。それより古い場合は指摘します
  • minSdk が極端に低い(< 21)場合は、保守性/互換性に関する警告のみを記載します

メタデータのポリシー:

  • fastlane のメタデータ/ストア掲載情報のファイルがある場合は確認します(fastlane/metadata/android/):
    • タイトルは 30 文字以内とし、絵文字/顔文字/すべて大文字の表記(ブランド名を除く)、「best」「#1」「free」「sale」のような宣伝文句をタイトルに含めないでください
    • 説明に競合他社の名前やキーワードの詰め込みがないことを確認します
  • strings.xml のアプリ名(app_name)についても、同じ問題がないか確認します

スパムと最低限の機能:

  • WebView ラッパーアプリを検出します。ネイティブ機能がなく、ウェブサイトを単一の WebView/CustomTabsIntent で表示するアプリは、最低限の機能に関するポリシー違反です
  • テンプレート生成アプリの識別マーカー(AppsGeyser など)を指摘します
  • アプリに実際の機能があることを確認します。スプラッシュ画面と WebView 以外のアクティビティがあることを確認します
  • 機能の不具合を確認します。ユーザー向けのフローにある TODO/FIXME のプレースホルダー、「Lorem ipsum」の文字列、反応しないボタンなどです

アプリが似せたり、なりすましたりしてはならない対象:

  • applicationId とアプリ名に、商標上の問題がないか確認します(他社ブランドや、名前/ID に含まれる「WhatsApp」「TikTok」など)
  • ランチャーアイコンのアセットがブランドのアセットを複製していないか確認します。手動での確認事項として記載します

デバッグ/テストの衛生管理:

  • マニフェストのリリース設定で android:debuggable="true" になっている場合 → 重大な問題です
  • android:usesCleartextTraffic="true" が設定されている場合、または HTTP URL があるのにネットワークセキュリティ設定がない場合 → 指摘します
  • 機密データを含む Log.d/Log.v/print()/console.log、ステージング/localhost の URL(10.0.2.2、localhost)をスキャンします
  • ハードコードされたシークレットをスキャンします。対象は .kt/.java/.dart/.ts/.js/.cs、gradle.properties、local.properties、.env で、apiKey、secret、password、token、Bearer を確認します
  • リポジトリにコミットされたキーストアファイル(.jks、.keystore) → 重大なセキュリティ問題です
  • google-services.json の公開キー → 指摘します(通常はアプリに含めても問題ありませんが、サービスアカウント JSON が含まれていないことを確認します。アプリに含めることは絶対に避けてください)
クイックチェック:Google Play での却下/削除理由トップ 10
  1. データセーフティフォームとの不一致 — SDK が、申告されていないデータを収集している
  2. 申告のない制限付き権限 — SMS、通話履歴、QUERY_ALL_PACKAGES、MANAGE_EXTERNAL_STORAGE、ユーザー補助機能
  3. 正当な理由のないバックグラウンドでの位置情報取得
  4. Google Play の課金システムの回避 — デジタル商品に対する外部決済
  5. アカウント削除機能がない — アカウント作成機能がある場合
  6. 対象 API レベルが古すぎる
  7. プライバシーポリシーがない — ストア掲載情報とアプリ内の両方
  8. ファミリー向けポリシー違反 — 子ども向けアプリでの広告 SDK/AAID
  9. 迷惑な広告 — 予期しないインタースティシャル広告、ロック画面広告
  10. 最低限の機能 — WebView ラッパー、動作しない機能/プレースホルダー機能

出力形式

# Google Play Policy Compliance Report

## Project Summary
- **App Name:** [name]
- **Application ID:** [applicationId]
- **Framework:** [detected framework]
- **Target SDK:** [targetSdk] / **Min SDK:** [minSdk]
- **Declared Permissions:** [count] ([restricted count] restricted)

## Critical Issues (Will Likely Cause Rejection/Removal)

### [CRITICAL] Policy: [Policy Name] — [Title]
**Issue:** [Description]
**Location:** [File:Line]
**Fix:** [Framework-specific fix]

## Warnings (May Cause Rejection)

### [WARNING] Policy: [Policy Name] — [Title]
**Issue:** [Description]
**Location:** [File:Line]
**Fix:** [Recommended fix]

## Declarations Required in Play Console
(Things that are OK in code but need forms/declarations)
- [ ] [e.g., Background location declaration + demo video]
- [ ] [e.g., Data safety form entries for Firebase Analytics]

## Recommendations (Best Practices)

### [INFO] Policy: [Policy Name] — [Title]
**Suggestion:** [Description]

## Checklist Summary
- [ ] Project type & framework detected
- [ ] Target API level meets current requirement
- [ ] No restricted permissions without qualifying use case
- [ ] No SMS/Call Log permissions (or declaration justified)
- [ ] No QUERY_ALL_PACKAGES / MANAGE_EXTERNAL_STORAGE (or justified)
- [ ] Accessibility API not misused
- [ ] Background location justified or absent
- [ ] Photo picker used instead of broad media permissions
- [ ] Foreground service types match usage
- [ ] Privacy policy linked in-app
- [ ] Data safety declarations match actual SDK collection
- [ ] Prominent disclosure before sensitive data collection
- [ ] Account deletion (if account creation)
- [ ] Play Billing for digital goods
- [ ] Subscription terms shown before purchase
- [ ] Ads: no disruptive/unexpected/lockscreen ads
- [ ] Consent (UMP/CMP) before ad SDK personalization
- [ ] Kids: no AAID, certified ad SDKs only (if child-directed)
- [ ] No dynamic native code loading from outside Play
- [ ] No hidden features / kill switches
- [ ] UGC moderation (report, block, filter) if UGC exists
- [ ] AI content reporting mechanism (if AI-generated content)
- [ ] Restrict Minor Access / age-gating (if gambling or dating features)
- [ ] No debuggable/cleartext release config
- [ ] No hardcoded secrets or committed keystores
- [ ] App name/metadata policy compliant
- [ ] Not a bare webview wrapper

## Final Verdict
READY / NEEDS FIXES / HIGH RISK — with summary

重要な注意事項

  • 徹底的に確認しつつ、誤検知は避けてください
  • ポリシー名を必ず明記してください(Google Play のポリシーは Apple のように番号ではなく、名称を使用します)
  • フレームワークに応じた修正案を提示してください
  • コードから判断できない場合は、「手動確認が必要」と記載してください(多くの Google Play 要件は Play Console 内にあります。データセーフティフォーム、申告、コンテンツのレーティング、対象ユーザーなど)
  • アプリの用途を考慮してください。子ども向けゲームと金融アプリでは、要件が異なります
  • クロスプラットフォームプロジェクトでは、共有コードと Android ネイティブ層の両方を確認してください
  • Google Play の取り締まり対象は、アプリ、メタデータ、広告、およびデベロッパーアカウントです。違反を繰り返すと、最終的にはアカウント停止に至ることを忘れないでください

コメント