Claude Codeでデータセーフティ申告をコードと照合する — Google Play
AndroidManifestの権限とSDKの通信先から、データセーフティの申告項目の下書きを読み取り専用のサブエージェントに作らせる手順と、人が確定する判断の線引きです。
Google Playのデータセーフティは、アプリが集めた・渡したデータを開発者自身が申告するフォームです。コードを読んで申告の下書きを作る作業は、Claude Codeに向いています。ただし、権限の一覧から機械的に答えが出るフォームではありません。
下書きまでをClaude Codeに任せ、確定は人が行う。この線引きを、読み取り専用のサブエージェントと出力の型で固定するのがこの記事の手順です。年齢レーティングの質問票は別のフォームなので、そちらはGoogle Play年齢レーティングの質問票をClaudeでApp Store審査と照合するにあります。
Claude Codeに頼む範囲と、人が決める範囲
データセーフティのヘルプには、申告の責任は開発者にあると明記されています。Googleのレビューは申告の正確さと網羅性を検証する設計ではなく、食い違いを見つけたときは是正措置を取るとされています。下書きが間違っていても、誰も代わりに直してくれません。
そこで、作業を2つに分けます。
| 作業 | 担当 | 理由 |
|---|---|---|
| 権限・API・SDKの洗い出し | 担当Claude Code | 理由コードを読めば分かる事実だから |
| 通信先・送信されるデータの候補挙げ | 担当Claude Code | 理由根拠のファイルと行を付けさせられるから |
| 「収集」「共有」に当たるかの判定 | 担当人 | 理由例外規定の適用は、アプリの実態と契約の知識が要るから |
| 必須か任意か、削除の手段があるか | 担当人 | 理由全バージョン・全地域の合算で答える必要があるから |
| フォームの送信 | 担当人 | 理由申告の責任が開発者にあるから |
Claude Codeが出すのは「このコードがこう動くので、この種別の候補です」までです。「申告すべき」とは書かせません。
申告に効くのは「端末の外に出るか」
下書きの質は、Claudeに何を探させるかで決まります。ヘルプの定義では、収集(collect)は「アプリから端末の外へデータを送ること」です。端末内だけで処理して外に出さないデータは、収集として申告する必要がありません。
探させる対象は、次の4つに絞れます。
- 外部へ送信するコード: HTTPクライアントの呼び出し先、Firebaseなどの初期化コード
- SDKとライブラリ: アプリに組み込んだサードパーティのコードが送る分も、自分のアプリの申告に含まれます
- WebView: アプリ側が配信するコードやふるまいを制御しているWebViewの分は含まれます。ユーザーが自由にWebを閲覧するWebViewは、申告の対象外です
- 他のアプリへの受け渡し: 端末内でも、別アプリにデータを渡すなら共有として申告します
共有(share)の側には、申告しなくてよい転送もあります。ヘルプが挙げるのは、開発者の指示で処理するサービス提供者への転送、法的な目的、ユーザーが自分で起こした操作や明示的な同意に基づく転送、完全に匿名化されたデータです。この判定はClaudeに断言させず、「例外に当たる可能性がある転送」として別の列に分けさせます。
読み取り専用のサブエージェントを用意する
下書き作成にはファイルの書き換えが要りません。サブエージェントのツールをReadとGrepとGlobだけに絞り、コードを壊せない状態で走らせます。
---
name: data-safety-auditor
description: AndroidプロジェクトのManifest・Gradle依存・通信コードを読み、Google Playデータセーフティ申告の下書き材料を作る
tools: Read, Grep, Glob
---
あなたはAndroidアプリのコード監査役です。ファイルは変更しません。
調べるもの:
1. AndroidManifest.xml の uses-permission
2. build.gradle(.kts) の dependencies にあるSDK
3. HTTP通信・WebView・Intent共有のコード
出力は表にします。列は「データ種別の候補 / 根拠のファイルと行 /
端末外へ送るか / 送信先 / サービス提供者への転送の可能性」。
コードから読み取れないことは「不明」と書き、推測で埋めません。
「申告すべき」「不要」という判定は書きません。ツールを絞る書き方は、サブエージェントのドキュメントにあるtoolsの許可リストそのものです。ファイルを.claude/agents/に置くと、数秒以内に検出されます。そのセッションで初めてagentsディレクトリを作った場合だけ、再起動が必要です。
呼び出しは、名前を指定した依頼文で足ります。
data-safety-auditor を使って、app モジュールのデータセーフティ申告の下書き材料を作って。
出力は docs/data-safety-draft.md に貼れる表だけにしてこの例では出力の保存を人が行っています。サブエージェントに書き込み権限を与えないためです。
読み取り専用の分析役を、フックでさらに固くする書き方はClaude Codeのサブエージェントをhookで読み取り専用のDB分析役にするで扱っています。ここではtoolsの許可リストだけで足ります。
Manifestの権限は「候補」止まりにする
ヘルプのデータ種別の説明で、権限名が直接出てくるのは位置情報の2つだけです。ACCESS_COARSE_LOCATIONによる位置は大まかな位置情報、ACCESS_FINE_LOCATIONによる位置は正確な位置情報に当たります。ほかの権限は、データ種別との対応表が示されていません。
さらに、FAQには逆向きの注意があります。権限を宣言していても、データを実際に収集・共有していなければ申告は不要です。申告のもとになるのは権限ではなく、データの動きです。
ヘルプはこの違いを、権限リストとデータセーフティの役割の違いとして説明しています。権限リストはManifestに宣言されたインストール時の権限から作られ、データセーフティはアプリが収集・共有するデータを示します。
したがってClaudeには、権限を見つけたら次の3点を同じ行に書かせます。
- その権限を使うコードの場所
- 取得した値が端末の外へ出る経路があるか
- 経路がないなら「端末内のみの可能性」と書き、申告候補から外す理由を残す
権限を一覧にして「全部申告」とするのも、権限が使われていないから「何も申告しない」とするのも、どちらも誤りを生みます。
SDKの分は、提供元の情報と突き合わせる
見落としやすいのは、自分で書いていないコードの通信です。ヘルプは、SDKが端末外へ送るデータは、送信先が自社か第三者かを問わず、自分のアプリの申告に含まれると説明しています。
SDKについては、ヘルプが次の手がかりを示しています。
- SDKの提供元が公開しているデータセーフティ向けの情報を参照する
- Google Play SDK Indexで、提供元がガイダンスへのリンクを出しているか見る
- 提供元向けの任意の書式が用意されており、データ種別・端末外への送信の有無・目的・暗号化・削除の可否が書かれる
Claudeに頼むのは、依存関係から組み込み済みSDKの一覧を作り、各SDKの公式ドキュメントへのリンクを人が開く順に並べることです。Claudeにそのドキュメントを読ませて要約させる場合も、判定ではなく引用として扱います。
サービス提供者の扱いにも注意が要ります。分析SDKでも、ヘルプの例のとおり「開発者の代わりにだけ処理する」なら提供者に当たり得ます。複数の顧客のデータをまたいで広告プロファイルを作るSDKは、提供者の活動に当たらず、共有として申告する対象です。契約書とSDKの規約を見る作業なので、人が決めます。
下書きの出力を、人が確定できる形にする
サブエージェントの出力は、そのままフォームに写せる粒度にそろえます。ヘルプが示すデータ種別は、位置情報、個人情報、金融情報、健康とフィットネス、メッセージ、写真と動画、音声ファイル、ファイルとドキュメント、カレンダー、連絡先、アプリのアクティビティ、ウェブ閲覧履歴、アプリ情報とパフォーマンス、デバイスまたはその他のIDです。目的は、アプリの機能、分析、デベロッパーとの通信、広告またはマーケティング、不正行為の防止とセキュリティとコンプライアンス、パーソナライズ、アカウント管理に分かれています。
下書きは、たとえば次のような形になります。以下は書式を示す例で、実在のアプリの結果ではありません。
| データ種別の候補 | 根拠 | 端末外へ | 送信先 | 人が確定する点 |
|---|---|---|---|---|
| 正確な位置情報 | 根拠LocationRepo.kt:42 | 端末外へ送信コードあり | 送信先自社API | 人が確定する点一時的な処理に当たるか |
| クラッシュログ | 根拠クラッシュ収集SDKの依存 | 端末外へ不明 | 送信先SDK提供元 | 人が確定する点提供元の資料と照合 |
| デバイスまたはその他のID | 根拠広告ID取得のコード | 端末外へ送信コードあり | 送信先広告SDK | 人が確定する点目的と共有の扱い |
最後の列が、人の確定欄です。Claudeには、この列を判定ではなく論点で埋めさせます。
目的の列は、別の表で作らせるのがお勧めです。ヘルプの例では、アカウントに誕生日を足させるアプリは、アカウント管理の目的で申告します。その誕生日をプッシュ通知の出し分けにも使うなら、その目的も足します。同じデータが複数の目的を持つので、データ種別と目的は1対多で持たせます。
一時的な処理・任意・暗号化は、人が決める
下書きに入れさせず、人が確定する判断を表にします。
| 論点 | ヘルプの定め | 人が見るもの |
|---|---|---|
| 一時的な処理 | ヘルプの定め要求を処理する間だけメモリに置き、保存しない場合は、ユーザーに見える表示からは外れる。フォームの回答には含める | 人が見るものサーバー側のログ保存の有無 |
| 仮名化データ | ヘルプの定め再び個人に結び付けられるデータは申告する | 人が見るものIDを付けた診断ログ |
| 必須か任意か | ヘルプの定め全ユーザーが地域や端末を問わず、提供・拒否・同意を選べる場合だけ「任意」にできる | 人が見るもの機能の利用に必須かどうか |
| バージョン・地域 | ヘルプの定め配信中の全バージョンの合算を、グローバルで1つ申告する | 人が見るもの古い版に残る収集 |
| 転送中の暗号化 | ヘルプの定めアプリとSDKが端末外へ送る全データに当てはまる場合だけ宣言できる | 人が見るもの平文通信の有無 |
| 削除の手段 | ヘルプの定め依頼手段の有無を答える。方式は指定されない | 人が見るもの問い合わせ窓口の導線 |
暗号化は、1つでも平文の通信があれば宣言できない点が、コードから拾える数少ない確定材料です。マニフェストのusesCleartextTrafficや、http://の接続先を探させ、見つかった場所を列挙させます。ヘルプは暗号化の方式としてTLSとHTTPSを例に挙げています。
プライバシーポリシーの改定案を作る作業と同じで、事実の洗い出しは機械に任せ、文面や回答の確定は人が持つ分担になります。ポリシー側はプライバシーポリシーの改定案を外部送信規律に沿ってClaudeで下書きする手順で扱っています。
CSVに写してから、プレビューを見て送る
Play ConsoleのApp contentページから、回答をCSVで書き出せます。サンプルのCSVを入手し、オフラインで埋めて取り込む方法もあります。CSVは1行が1つの回答で、選択式の質問は選択肢の数だけ行が並びます。回答欄にはTRUEかFALSEを入れ、必須かどうかは「Answer requirement」の列に書かれています。
下書きを写す作業をClaudeに任せるなら、次の順にします。
- サンプルCSVをClaude Codeに渡し、人が確定した論点の回答だけを入れさせる
- 確定していない行は空欄のまま残させる(任意の質問は空欄でよい)
- 取り込み後、Play Consoleの「ストアの掲載情報のプレビュー」で、ユーザーに見える表示を確かめる
- 内容に迷う箇所は「下書きとして保存」で残し、後で戻る
プレビューで見るのは、申告の内容とコードの実態が一致しているかです。Claudeが埋めた列の見た目ではありません。送信は「Submit」を押す人の操作です。
更新のたびに差分だけ見直す
データセーフティは、アプリのパッケージごとに1つで、バージョンや地域によらない合算の申告です。コードを変えるたびに、次の変更だけをサブエージェントに洗い出させると、見直しが軽くなります。
- Manifestの
uses-permissionの増減 - Gradleの依存の追加・更新
- 新しい通信先(ドメイン)
依頼文には「前回の下書きとの差分だけを表にして」と書き、前回の表を渡します。差分がなければ「変更なし」と返させます。
申告済みのフォームは、提出後も状態が変わり得ます。ヘルプによれば、承認されたあとに通知が届くことがあり、状態はApp contentページで確認できます。ポリシーの更新で、以前に承認された申告が後から問題になる場合もあります。
つまずきやすい点
- 権限の一覧をそのまま申告にしない: 権限は宣言、申告は実際の収集と共有です
- 「ユーザーが同意したから任意」と決めない: 任意にできるのは、全ユーザーが選べる場合だけです
- SDKの更新を見落とさない: 依存のバージョンを上げると、収集データが増えることがあります
- 古いバージョンの収集を忘れない: 配信中のバージョンに残っていれば、申告に含めます
- Claudeの表の「不明」を空欄で済ませない: 不明な行は、SDKの提供元の情報かアプリの担当者への確認事項に変えます
まとめ
コードから拾える事実と、申告の判断は別物です。サブエージェントに読み取り専用の権限を渡し、「候補・根拠・不明」の3列で出させると、人が確定する範囲が小さくなります。最後に残る判断は、一時的な処理かどうか、任意と言えるか、共有に当たるか、の3つです。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。