Claude Media
Claude Codeでデータセーフティ申告をコードと照合する — Google Play

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点を同じ行に書かせます。

  1. その権限を使うコードの場所
  2. 取得した値が端末の外へ出る経路があるか
  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に任せるなら、次の順にします。

  1. サンプルCSVをClaude Codeに渡し、人が確定した論点の回答だけを入れさせる
  2. 確定していない行は空欄のまま残させる(任意の質問は空欄でよい)
  3. 取り込み後、Play Consoleの「ストアの掲載情報のプレビュー」で、ユーザーに見える表示を確かめる
  4. 内容に迷う箇所は「下書きとして保存」で残し、後で戻る

プレビューで見るのは、申告の内容とコードの実態が一致しているかです。Claudeが埋めた列の見た目ではありません。送信は「Submit」を押す人の操作です。

更新のたびに差分だけ見直す

データセーフティは、アプリのパッケージごとに1つで、バージョンや地域によらない合算の申告です。コードを変えるたびに、次の変更だけをサブエージェントに洗い出させると、見直しが軽くなります。

  • Manifestのuses-permissionの増減
  • Gradleの依存の追加・更新
  • 新しい通信先(ドメイン)

依頼文には「前回の下書きとの差分だけを表にして」と書き、前回の表を渡します。差分がなければ「変更なし」と返させます。

申告済みのフォームは、提出後も状態が変わり得ます。ヘルプによれば、承認されたあとに通知が届くことがあり、状態はApp contentページで確認できます。ポリシーの更新で、以前に承認された申告が後から問題になる場合もあります。

つまずきやすい点

  • 権限の一覧をそのまま申告にしない: 権限は宣言、申告は実際の収集と共有です
  • 「ユーザーが同意したから任意」と決めない: 任意にできるのは、全ユーザーが選べる場合だけです
  • SDKの更新を見落とさない: 依存のバージョンを上げると、収集データが増えることがあります
  • 古いバージョンの収集を忘れない: 配信中のバージョンに残っていれば、申告に含めます
  • Claudeの表の「不明」を空欄で済ませない: 不明な行は、SDKの提供元の情報かアプリの担当者への確認事項に変えます

まとめ

コードから拾える事実と、申告の判断は別物です。サブエージェントに読み取り専用の権限を渡し、「候補・根拠・不明」の3列で出させると、人が確定する範囲が小さくなります。最後に残る判断は、一時的な処理かどうか、任意と言えるか、共有に当たるか、の3つです。

参照した一次ソース

この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。

  1. support.google.com/googleplay/android-developer/answer/10787469
  2. code.claude.com/docs/en/sub-agents
この記事を共有:XはてブLinkedIn