Evidence
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”.*
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.
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.
// 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).
// 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);
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.
// 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))) {
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.