Consent-blind location transmission in Google Mobile Ads SDK ≤ v20.6.0: API removed in 2022, coordinates still observed being broadcast across the ad bidstream in 2026 | Pixalate
Pixalate Ad SDK Trust Index · Technical Analysis

Consent-blind location transmission in Google Mobile Ads SDK ≤ v20.6.0: API removed in 2022, but precise consumer geolocation coordinates still observed being broadcast across the ad bidstream in the USA and Europe in 2026

Executive Summary
  • Why Pixalate is publishing this exposé: Pixalate audited 698 ad SDKs and data brokers for the Ad SDK Trust Index. The most uncomfortable finding came from the most widely adopted SDK in the audit: 38% of reported Google Mobile Ads (GMA) SDK usage still runs pre-v21 builds that can collect and transmit precise location off-device,* and per Google’s own statement below, user consent does not stop the transmission.
  • Older versions of the Google Mobile Ads SDK (pre-v21, i.e. ≤ v20.6.0) — code that serves ads inside Android apps — accept a user’s precise location from the host app and transmit it to Google’s Mobile Ads back end and third-party mediation partners whether or not the user consented, per Google’s Mobile Ads SDK support on its official developer forum. Google removed the capability on newer versions starting in 2022 but, per Pixalate’s observations, ads still served on sunset pre-v21 builds as recently as August 2026 — from apps still live on Google Play, including one last updated in 2016.
  • Pixalate still observes precise consumer coordinates from apps on these builds being broadcast into the ad bidstream — the real-time auction data shared with ad buyers — across the USA and Europe.†
  • Under GDPR and UK GDPR, disclosure by transmission is itself “processing” (Art. 4(2) of each: EU · UK).
  • Recommendation: Google should remove apps still running GMA SDK ≤ v20.6.0 from the Play Store and disable ad serving for those versions.

This analysis documents the API’s removal and sunset history, the version-usage data, two live-app case studies confirmed by APK teardown, the decompiled code path, and recommended remediation. It draws on Pixalate’s Ad SDK Trust Index 1.0; code snippets are published in the evidence dashboard for independent verification.

“…if the user is under GDPR and hasn’t given consent, whatever is passed into setLocation will still be passed to mediation partners and to the Mobile Ads back end, but it will be ignored by Google.”
— Mobile Ads SDK Forum Advisor, replying on Google’s official AdMob developer forum, January 9, 2020, describing pre-v21 behavior
Under GDPR and UK GDPR, disclosure by transmission is itself “processing” (Art. 4(2) of each: EU · UK).

API removal and sunset schedule

Pixalate’s audit of GMA SDK v24.3.0 found location-transmitting code still present in the SDK — but fed only null values. That raised an obvious question: when did real coordinates last flow through this code? Pixalate went back through the version history to find out.

The timeline below reconstructs that history, per the decompiled code and Google’s own documentation:

Through v20.6.0

SDK transmits app-supplied precise location

AdRequest.Builder.setLocation() accepted exact coordinates and serialized them into the ad-request parcel, out of the app process (decompiled chain below).

May 25, 2022

v21.0.0 removes the API

setLocation() / getLocation() removed per the release notes. Google’s migration guide framed the removal as a targeting change (“The location data is not used by Google to target ads”).

June 2023 – June 2026

Versions sunset

v7–v19 (2023), v20.x (2024), v21.x (2025), v22.x (2026) per Google’s schedule. The Play Console separately blocks new app releases on versions through v21.x (per Google’s Play SDK Index; v22.x is sunset but not yet release-blocked); for live apps, ads are only “at risk” of not serving.

August 2026

38% of reported usage still pre-v21; ads still being served

Google’s own Play SDK Index still reports 38% of GMA usage on pre-v21 versions. Separately, Pixalate observes precise consumer geolocation coordinates in the bidstream from apps on these builds, across the USA and Europe.†

38% of reported GMA SDK usage is on sunset, location-capable builds

The location API removal in 2022 did not retire the SDK versions that carry it. Google’s Play SDK Index — Google’s own published usage data, drawn from apps that share library dependencies with Google Play and have over 1,000 installs — still reports 38% of GMA SDK usage on pre-v21 (location-capable) builds, shown as share of voice (SOV) per version below.‡ Per Google’s release notes, setLocation() was added to AdRequest.Builder in v4.1 (January 16, 2014) and removed in v21.0.0 (May 25, 2022), so every version in the table accepted app-supplied location.

VersionUsage (SOV)VersionUsage (SOV)
20.6.04%19.5.02%
20.5.03%19.4.03%
20.4.03%19.3.02%
20.3.01%19.2.01%
20.2.03%19.1.02%
20.1.02%19.0.11%
20.0.01%18.3.01%
19.8.02%17.2.11%
19.7.02%16.0.01%
19.6.02%15.0.11%
Pre-v21 total · location-capableΣ 38%
v21+ · location API removed62%

Every version above is flagged “prevents app release” in Google’s Play SDK Index (retrieved August 27, 2026). Versions at 0% usage omitted.

Apps on sunset GMA SDKs are still serving ads — with precise consumer geolocation coordinates observed in the bidstream

Pixalate’s bidstream observations show apps on sunset, location-capable versions still requesting and serving ads — broadcasting precise consumer geolocation coordinates into the bidstream across the USA and Europe.

Sunsetting an SDK version does not stop it from serving ads. In Google’s own definitions, a “deprecated” version (two major releases old) still serves ads and gets no technical support; a “sunset” version (three or more releases behind) is merely “at risk” of ads not serving. Neither stage disables ad serving by default, and apps that ship these versions remain on the Play Store, according to Pixalate’s observations. The Play Console blocks new releases on sunset versions through v21.x (per Google’s Play SDK Index; v22.x is not yet release-blocked), but apps already installed keep running and keep requesting ads.

For apps still running GMA ≤ v20.6.0, Google’s published policy states:

“Ads at risk of not serving to this version. We will regularly review usage of all sunset versions going forward to consider disabling ad serving.”
— Google’s definition of a “sunset” SDK version, AdMob deprecation schedule, retrieved August 27, 2026

According to Pixalate’s observations, ads still served on sunset pre-v21 builds as recently as August 2026, including on apps still available to download from the Google Play Store. Examples, confirmed by APK teardown:

Way2News Reporter

com.way2news.reporter
Last app updateFebruary 2023
Downloads100K+ (Google Play)
Fine-location permissionPresent in manifest
Ad SDKs in teardownGoogle Mobile Ads only
BidstreamFour-decimal coordinates + in-bidstream location flag (US traffic)†

Space Expedition

com.mobirate.spaceexpedition.gplay
Last app updateJanuary 21, 2016
Downloads1M+ (Google Play)
Fine-location permissionPresent in manifest
Ad SDKs in teardownGMA + AdColony (discontinued 2024)
BidstreamFour-decimal coordinates + in-bidstream location flag (UK traffic)†

In Pixalate’s bidstream data for these apps, bid requests carry coordinates to four decimal places (≈11-meter precision) — the standard Pixalate uses to distinguish precise geolocation coordinates.† In both apps, the pre-v21 GMA SDK is the only live, location-capable ad SDK, according to Pixalate’s analysis.

What the decompiled code shows

Per Google’s Mobile Ads SDK support on its official developer forum, whatever an app passed into setLocation() was passed on to mediation partners and the Mobile Ads back end regardless of GDPR consent status. The five steps below trace that path in decompiled source, from the public API call to the coordinates leaving the app process.

The location pipeline in v20.6.0, the last affected release, is documented below in decompiled source. Snippets are published in Pixalate’s evidence dashboard for independent verification. Pixalate added the // comments in all snippets below.

1

The app hands the SDK a precise location via the public API

The SDK handles location coordinates supplied by the host app. Under Google’s Data safety guidance, “Collect” means “transmitting data from your app off a user’s device”, which “includes user data transmitted off device from your app by libraries and/or SDKs used in your app”.*

v20.6.0 · com/google/android/gms/ads/AdRequest.java Collection · Public API
public Builder setLocation(@RecentlyNonNull Location location) {
    this.zza.zzG(location);   // stores the app-supplied Location
    return this;
}
2

The SDK stores it

The builder hands the app’s Location to its internal storage class (obfuscated as zzbjf), which keeps it until the request is built.

v20.6.0 · com/google/android/gms/internal/ads/zzbjf.java Storage · Builder state
public final void zzG(Location location) {
    this.zzk = location;   // zzbjf’s own zzk — same name as, but distinct from, the parcel field in step 4
}
3

It is copied into the finished ad request

When the app builds the request, the stored Location is copied out of the builder into the request object (zzbjg), whose accessor zzd() is what the request factory reads next.

v20.6.0 · com/google/android/gms/internal/ads/zzbjg.java Handoff · Request object
// copied out of the builder ...
location = zzbjfVar.zzk;
this.zzf = location;

// ... and exposed by the accessor the request factory reads:
public final Location zzd() {
    return this.zzf;
}
4

It lands in the ad-request parcel

The request factory passes the Location into the ad-request parcel’s constructor as argument 11, where it lands in the final field zzk and is serialized at field id 11 (first block below). A second, in-process serializer multiplies latitude and longitude by 107 and packs them into the ad request under the key “uule” (second block).

v20.6.0 · com/google/android/gms/internal/ads/zzbfd.java Transmission payload
// constructor stores it in final field zzk (SafeParcelable id 11) ...
this.zzk = location;

// ... and writeToParcel marshals it at field id 11:
SafeParcelWriter.writeParcelable(parcel, 10, this.zzj, i, false);
SafeParcelWriter.writeParcelable(parcel, 11, this.zzk, i, false);
SafeParcelWriter.writeString(parcel, 12, this.zzl, false);
v20.6.0 · com/google/android/gms/internal/ads/zzeqa.java Serializer · uule bundle · inferred
Location location = zzbfdVar.zzk;
if (location != null) {
    Long valueOf3 = Long.valueOf((long) (location.getLatitude() * 1.0E7d));
    Long valueOf4 = Long.valueOf((long) (location.getLongitude() * 1.0E7d));
    Bundle bundle3 = new Bundle();
    bundle3.putFloat("radius", valueOf.floatValue());
    bundle3.putLong("lat",  valueOf3.longValue());
    bundle3.putLong("long", valueOf4.longValue());
    bundle3.putLong("time", valueOf2.longValue());
    bundle2.putBundle("uule", bundle3);
}
5

It leaves the app process

When the app calls loadAd(), the SDK builds the parcel and hands it to the sender in a single expression — and the finished object, coordinates included, is dispatched over Android’s Binder IPC to the Google Play services ad process.

v20.6.0 · com/google/android/gms/internal/ads/zzbji.java Call site · loadAd path
// reached from the public API: BaseAdView.loadAd(AdRequest) → zzbji.zzl(...)
// one expression builds the ad-request parcel and hands it to the sender:
if (zzbhkVar2.zzaa(this.zzc.zza(this.zzm.getContext(), zzbjgVar))) {
v20.6.0 · com/google/android/gms/internal/ads/zzbhi.java Egress · Binder IPC
public final boolean zzaa(zzbfd zzbfdVar) throws RemoteException {
    Parcel zza = zza();
    zzaol.zzd(zza, zzbfdVar);        // marshal the ad-request parcel
    Parcel zzbs = zzbs(4, zza);      // Binder transaction — leaves the app process
    boolean zzg = zzaol.zzg(zzbs);
    zzbs.recycle();
    return zzg;
}

In the Index, both analyzed GMA versions — pre-v21 and v24.3.0, the version rated in the Index — carry Low Risk flags on the FTC and app-store ToS risk dimensions, which measure disclosure alignment. Pre-v21 is flagged Collects & Transmits Off-Device for precise location data on code analysis, and this post examines risks, including GDPR risks, stemming from collection and transmission.

Recommended actions

For Google

Remove apps still shipping GMA SDK ≤ v20.6.0 from the Play Store, and disable ad serving for those versions. The serving mechanism already exists in the deprecation policy (“consider disabling ad serving” on sunset versions). Suggested implementation:

  • Announce a serving cutoff date for pre-v21 clients, with a notice window (e.g., 90 days).
  • Until cutoff: drop the location field server-side from pre-v21 ad requests; strip coordinates from downstream bid requests.
  • At cutoff: return no-fill to pre-v21 clients.
  • After the notice window: remove apps still shipping pre-v21 builds from Google Play.

For app developers

Upgrade to GMA SDK v21+ (current line: v25.x). v21 removed setLocation(); in v24.3.0, the version Pixalate audited, every code path in the analyzed artifacts that could populate the location field passes null, per Pixalate’s analysis.

Expected outcome

The remaining 38% of reported usage migrates to versions without the location API — consistent with the current GMA line and the other most popular ad SDKs by install base, per Pixalate’s Ad SDK Trust Index 1.0.

How this analysis was performed

  • Artifacts: distribution packages from the source of record — the same compiled artifacts developers integrate.
  • Decompilation: jadx.
  • Analysis: the recovered source is searched for location collection, device fingerprinting, and off-device egress.
  • Verification: key findings re-checked at the bytecode level; negative findings verified by closed constant-pool census, published only where three independent derivations agree.
  • Evidence: every finding cites file and line, published in the evidence dashboard.

Full methodology: pixalate.com/sdk-trust-index-methodology.

Check the SDKs you ship

The Pixalate Ad SDK Trust Index is free to search. Flagged ratings publish the analyzed code snippets behind them — including the pre-v21 GMA chain — and manifest and privacy-policy findings are published alongside the ratings.

* Some rated SDKs do not read device location sensors directly but receive coordinates from the host app through the SDK’s own API and transmit them off-device; consistent with Apple’s and Google’s definitions of data collection, Pixalate treats this as location collection. For the purpose of Pixalate’s analysis, SDKs that collect “flexible” location (i.e., collect precise location if able, coarse if not) are considered to collect precise location.

† Pixalate’s standard for precise location in the bidstream is the presence of an in-bidstream location-source flag together with coordinates of four or more decimal places.

‡ SOV (share of voice) refers to per-version usage percentages as published by Google in its Play SDK Index (retrieved August 27, 2026), based on apps that share library dependencies with Google Play and have over 1,000 installs. The 38% pre-v21 total is Pixalate’s summation of Google’s per-version figures.

Privacy policy snapshots as of May 11, 2026; Index-wide SDK code analysis as of May 21, 2026; the GMA pre-v21/current version comparison was performed August 2026.

Disclaimer

The Pixalate Ad SDK Trust Index reflects Pixalate’s opinions on observed privacy and compliance signals across mobile SDKs and does not constitute a legal compliance determination, a finding of liability, or an assertion that any SDK, its provider, or integrating developer has violated GDPR, COPPA, FTC Section 5, app store terms of service, or any other law or regulation. Risk ratings reflect Pixalate’s opinion based on its assessment of each SDK. Nothing in this report asserts that Google or any app developer named herein has violated any law or regulation, or that any current version of the Google Mobile Ads SDK collects location data. All data is grounded in Pixalate’s proprietary technology and analytics, which Pixalate is continuously evaluating and updating. Pixalate’s opinions are just that, opinions — neither facts nor guarantees. Pixalate shares these findings not to impugn the standing or reputation of any entity, person, or app, but to report findings and trends pertaining to programmatic advertising activity in the period studied. Read the full disclaimer here.

Schedule a Demo

Interested in learning more about Pixalate’s ad fraud prevention solutions? Let’s connect. Share your challenges, and our team will be in touch shortly. Thank you for reaching out.