Android AD_ID Permission: Why the Advertising ID Shows Zeros

Why Android 13+ returns a zeroed GAID, how to check AD_ID permission and privacy settings, and how Airbridge attributes when GAID is unavailable.

Airbridge4 min read
Android AD_ID Permission: Why the Advertising ID Shows Zeros

Key Takeaway

  • When Limit Ad Tracking is not set, an all-zero advertising ID on Android 13 or later happens when the AD_ID manifest permission is missing or excluded.
  • Other third-party libraries can exclude the AD_ID permission and cause this permission-related GAID issue.
  • Airbridge uses App Set ID as a fallback device identifier when GAID is unavailable, retrieves install referrer data automatically when its SDK is integrated, and uses probabilistic matching for remaining unmatched conversions.

You target Android 13, add the AD_ID permission to the manifest, and the advertising ID still comes back as 00000000-0000-0000-0000-000000000000. A zeroed ID can have more than one cause, and until you know which one applies, device-level attribution for your Android campaigns is unreliable.

Why Android Returns All Zeros

Airbridge uses the Google Advertising ID (GAID) as an identifier for attribution, as documented in Testing - Android SDK. When the Android operating system masks this value with a string of zeros, the system is actively blocking access to the device's real identifier rather than experiencing a network error or a delayed callback.

Under Android's system behavior, a zeroed-out string stems from two distinct possibilities: either the compiled application lacks the explicit manifest declaration required to read the identifier on newer OS versions, or the device owner has turned off personalized advertising at the system level. Telling these two apart requires looking at your build outputs alongside the test device's privacy flags.

Manifest Permissions and Merging

Apps targeting Android 13 (API 33) or above must declare Google Play services permissions in AndroidManifest.xml to acquire the device's ADID. In the Android SDK, v2.13.0 and later automatically adds the AD_ID permission.

When Limit Ad Tracking (LAT) is unset and the GAID still appears as 00000000-0000-0000-0000-000000000000, adding the AD_ID permission is needed. You might wonder why this happens if you already wrote the line into your source manifest or upgraded to a recent SDK version. During the Android Gradle build process, the manifest merger combines AndroidManifest.xml files from your main source set and every SDK in your dependency tree. The AD_ID permission can be excluded by other third-party libraries, causing this permission-related GAID issue. If an analytics wrapper, crash reporter, or utility library includes a node directive that strips advertising permissions, the final merged APK will ship without it, regardless of what your source file says.

User Opt-Outs and Deleted IDs

Even when your merged manifest retains the right declaration, the operating system will return zeros if the person holding the phone chooses to restrict tracking. On newer Android versions, opening the privacy settings and selecting the option to delete the advertising ID replaces the alphanumeric string with all zeros for every app installed on that handset.

This state is a deliberate privacy choice by the user, not a bug in your code. When testing on your own hardware or a team test phone, it is easy to forget that someone previously toggled this setting to test opt-out flows. If the device-level LAT flag is active, or if the advertising ID has been deleted in the system menu, no manifest change will bring the identifier back unless you generate a new ID in the device's settings.

How Attribution Still Works

Airbridge collects both GAID and App Set ID on Android. In its Identifiers handling, the platform prioritizes GAID on Android and falls back to App Set ID when GAID is unavailable.

For install measurement, Airbridge retrieves Install Referrer: Android Attribution Explained data automatically when its SDK is integrated. In Attribution Methods, install referrer matching uses information carried by the install referrer to attribute installs and is available only for Android.

Beyond Android-specific referrers, Probabilistic Modeling: Mobile Attribution Guide explains that deterministic matching is applied first when device IDs or click identifiers are available, while probabilistic matching is used for the remaining unmatched conversions. In mobile attribution, probabilistic modeling estimates the likelihood that an ad exposure caused an action such as an app install or in-app purchase, without relying on deterministic identifiers such as device IDs. Airbridge incorporates probabilistic modeling alongside deterministic methods to maximize attribution coverage.

Step-by-Step Debug Checklist

  • The manifest permission for AD_ID is com.google.android.gms.permission.AD_ID.
  • When the Restricted SDK version is installed, it does not collect device IDs, including GAID and IDFA.
  • A test device's GAID can be found under Settings > Google Settings > Ads > My Ad ID (the method for locating GAID may differ based on the installed Android version).
  • The My Device ID by Airbridge app can quickly find a device's GAID.

FAQS

FAQ

What happens if another library strips the permission during the build?

The AD_ID permission can be excluded by other third-party libraries, causing the permission-related GAID issue. When LAT is unset and GAID appears as 00000000-0000-0000-0000-000000000000, adding the AD_ID permission is needed.

Why is my SDK not collecting any device IDs at all?

If your logs show no device identifiers being gathered despite valid device settings and manifest rules, check if you installed the Restricted SDK version, which does not collect device IDs including GAID and IDFA.

How much does it cost to start measuring Android attribution with Airbridge?

As of November 2026, the Core Plan starts with a 30-day free trial and then costs $40+/mo (USD) with no annual contract or lock-in. It includes 500,000 data points per month, with additional usage billed at $0.0001 per extra data point.