Google Play · 4 min read

Play Console says your app uses the AD_ID permission. You never added it.

You said the app does not use the advertising ID. Your bundle disagrees. A library added the permission for you. Here is how to remove it and prove it is gone.

What you see

You fill in the advertising ID declaration in Play Console and answer that your app does not use it. Then Play flags a mismatch and blocks the release. The bundle you uploaded requests com.google.android.gms.permission.AD_ID.

You search your code and your AndroidManifest.xml. The permission is not there.

Why it happens

Android builds one final manifest by merging your manifest with the manifests of every library you use. This is called manifest merging.

Google Play Services libraries add the AD_ID permission transitively. You did not write it. A dependency did, often one pulled in by sign-in, push or analytics plugins. So the merged manifest in your bundle requests it, and that is what Play checks.

This is also why searching your code finds nothing. The line is not in any file you wrote. It only exists in the merged manifest that the build produces, so that is the file you have to fix and check.

The fix, step by step

Step 1. Open your app's manifest. In a Capacitor or React Native project this is android/app/src/main/AndroidManifest.xml.

Step 2. Add the tools namespace to the manifest tag. Without it, the remove instruction in the next step will not parse.

Step 3. Tell the merger to remove the permission.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission
        android:name="com.google.android.gms.permission.AD_ID"
        tools:node="remove"/>

    <!-- the rest of your manifest stays the same -->
</manifest>

The tools:node="remove" marker wins over the library's request during the merge.

Step 4. Bump the versionCode. Play will not accept a new bundle with a code it has already seen. In Capacitor and bare React Native projects the real versionCode is in android/app/build.gradle, not app.json:

defaultConfig {
    versionCode 12
    versionName "1.0.3"
}

If Play ever says your bundle is "completely shadowed by one or more APKs with higher version codes", earlier uploads on other tracks hold higher codes. Jump well clear of every code you have uploaded rather than adding one.

Step 5. Build and check the merged manifest. Do not trust the source file. Build the release, then search the merged output for the permission:

cd android
./gradlew bundleRelease
grep -r "permission.AD_ID" app/build/intermediates --include=AndroidManifest.xml

No match means the permission is gone from what you ship. If it still appears, check that the tools namespace is on the root manifest tag.

Step 6. Check the bundle is signed. A fresh Capacitor Android project has no release signing config, so bundleRelease can go green and still produce an unsigned bundle. Play then rejects it with a message that never mentions signing. Look for a signature file at the top level of the bundle only:

unzip -l app/build/outputs/bundle/release/app-release.aab \
  | grep -E " META-INF/[^/]+\.(RSA|EC|DSA)$"

Only count a match at the top level. META-INF folders under base/ hold library files and give a false pass.

Step 7. Answer the declaration as No. In Play Console, set the Advertising ID declaration to say the app does not use it. Now the declaration and the bundle agree.

Step 8. Upload and confirm. After saving any Play Console form, reload the page and check the value stuck. Some pages show a second confirm dialog after "Save and publish", and missing it means nothing saved.

How to prevent it

Related traps

Field Notes

This fix is one of 228 in Field Notes: What Broke and How We Fixed It.

Every entry follows the same pattern: the symptom you see, the real cause, the fix that worked, and the rule that stops it coming back. App Store, Google Play, Capacitor, Netlify, Supabase, Stripe, n8n and more.

Get Field Notes

Building a lot? The Builder Bundle has Field Notes plus the launch playbook, the prompt book and the Claude Code skills kit. See the bundle.

Related fixes

Keep reading.