# 自分で宣言していない権限が入る — Play のデータセーフティ申告の前に確認すること ([English](android-permissions-data-safety.en.md)) Google Play のデータセーフティは、**アプリが実際に何を集めているか**の申告です。 申告と実際の動きが食い違うと**ポリシー違反として公開が止まります。** 厄介なのは、**`AndroidManifest.xml` を読んでも実際の権限が分からない**ことです。 ライブラリが連れてくる権限は1行も書かれていません。 Flutter / Android のアプリ5本で出荷物の権限を実測したので、その結果と確認手順を残します。 --- ## 宣言と実際がどれだけ違うか 実測した5本の内訳です。 | アプリの性質 | 自分で宣言 | 実際に入っていた | | --- | --- | --- | | 広告あり・クラウド同期あり | `INTERNET` のみ | **10件** | | 課金あり・システム連携あり | 数件 | **8件** | | 課金あり・通信は課金のみ | 2件 | **7件** | | 課金あり・通信しないゲーム | **0件** | **4件** | **通信しないゲームでも4件入っていました。** マニフェストに1行も書いていないのにです。 出どころは課金ライブラリ(`in_app_purchase`)でした。 ``` com.android.vending.BILLING INTERNET ACCESS_NETWORK_STATE .DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION ``` --- ## 申告に直結するのは広告まわり 広告 SDK(AdMob / `google_mobile_ads`)を入れると、この4件が入ります。 ``` com.google.android.gms.permission.AD_ID com.google.android.gms.permission.ACCESS_ADSERVICES_AD_ID com.google.android.gms.permission.ACCESS_ADSERVICES_ATTRIBUTION com.google.android.gms.permission.ACCESS_ADSERVICES_TOPICS ``` **`AD_ID` があるということは、広告 ID を使うということです。** データセーフティで**広告 ID の使用を申告する必要があります。** 逆に、**課金だけで広告 SDK を入れていないアプリには入りません。** 「課金しているから広告 ID の申告が要る」ではなく、**SDK の有無で決まります。** --- ## 確認するのは AAB。APK ではない ここが一番間違えやすいところです。 **Google Play が受け取って配るのは AAB(Android App Bundle)です。** APK はそこから切り出されたもので、**構成が違えば含まれるものも変わります。** 実際に、SDK を更新した前後で権限を比べたとき、 **APK では3件減って見えた**(`DUMP` / `BIND_JOB_SERVICE` / signin の `REVOCATION_NOTIFICATION`)のに、 **AAB では前後で完全に同一**でした。 **3件の差は更新の効果ではなく、APK と AAB の差**でした。 ### AAB を読む `aapt2` は AAB を読めません。**`bundletool` を使います。** ``` bundletool dump manifest --bundle app-release.aab \ --xpath /manifest/uses-permission/@android:name ``` `bundletool` は Google が配布している単体の jar です (`github.com/google/bundletool/releases`)。Android Studio には同梱されていません。 ### APK を読む(手元で動かすぶんには足りる) ``` aapt2 dump permissions app-release.apk ``` **手元の端末に入れて動かす確認には APK で足ります。** 「ストアに出るアプリが何を要求するか」の答えにならない、というだけです。 --- ## 減った権限も見る 権限は増えるだけでなく**減ることもあります。** ライブラリを外したり、実装を変えたりしたときに `QUERY_ALL_PACKAGES` のような **重い権限が消えていることがあり、これは申告を軽くできる材料**です。 `QUERY_ALL_PACKAGES` は Play の審査で用途の説明を求められる権限なので、 **消せたなら消えたことを確認しておく価値があります。** --- ## 手順 1. **リリースビルドの AAB を作る**(デバッグビルドは別物) 2. **`bundletool dump manifest` で権限を出す** 3. **自分が宣言したもの以外を1件ずつ調べる。** 出どころのライブラリを特定する 4. **`AD_ID` があれば、広告 ID の使用を申告する** 5. **前回の申告時から増減があるか比べる** **3が一番時間がかかります。** 権限名で検索すると、たいていどの SDK が要求するものか分かります。 --- ## なぜソースを読んでも分からないのか Android のビルドは、**依存しているライブラリのマニフェストを自動でマージします。** 自分の `AndroidManifest.xml` に1行も書かなくても、 ライブラリ側が宣言していれば最終的な成果物には入ります。 **`build.gradle.kts` を読んでも出てきません。** 直接の依存が、さらに別のライブラリを連れてくるからです。 **成果物を読む以外に、確実な方法はありません。** --- 2026-08 時点の記録。Android / Flutter / Google Play。