Privacy Tools Guide

Stop mobile games from collecting your location data using app permission controls, network traffic inspection, and specialized privacy tools. Games harvest location through GPS, WiFi scanning, IP addresses, and embedded analytics SDKs—disable these vectors at the OS level before installing any game.

Understanding Location Data Collection in Mobile Games

Mobile games collect location data through multiple pathways beyond the obvious GPS sensor. The primary vectors include:

Game developers often embed third-party analytics SDKs—Unity Analytics, Firebase, AppsFlyer, or Adjust—that automatically collect location data as part of their telemetry pipelines. Even when a game does not explicitly request location permissions, these SDKs may harvest data from IP addresses or network information.

Technical Countermeasures for Power Users

Analyzing App Permissions and Network Traffic

Before installing any game, audit its declared permissions. On Android, use the Play Store’s data safety section or install the app and inspect permissions via adb:

adb shell dumpsys package com.example.game | grep -A 10 "android.permission"

On iOS, inspect the app’s Info.plist after installation using tools like iMazing or Apple Configurator. Look for NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription keys.

More revealing than permission declarations is observing actual network traffic. Use a local proxy to intercept outbound connections:

# Set up mitmproxy on a dedicated machine
mitmproxy -p 8080

# Configure your test device to route through the proxy
# Watch for location-related API calls to analytics endpoints

Watch for requests to known location-data brokers such as:

Blocking Location Access at the System Level

Both iOS and Android provide granular permission controls that go beyond simple allow/deny.

iOS: Precise Location vs. Approximate Location

iOS 15+ introduced “Precise Location” toggle that allows you to grant location access without exposing exact coordinates. When a game requests location, you can enable the toggle off, providing only approximate neighborhood-level data while blocking street-level accuracy.

// For developers: Check CLLocationManager's allowsBackgroundLocationUpdates
// and configure location accuracy based on user consent
let locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
// This reduces precision while maintaining functionality

Android: Permission Manager and Mock Locations

Android’s Permission Manager allows you to revoke location permission post-installation while keeping the app functional (though some games may degrade). For testing or privacy-focused usage, enable developer options to allow mock location apps:

# Enable mock locations in developer options
# Then install a mock location app like "Fake GPS" to provide
# randomized coordinates instead of real location data

Using Network-Level Filtering

For users with technical infrastructure, routing device traffic through a VPN or DNS-level blocker provides another layer of protection. Pi-hole can block known location-data collection domains:

# Add to Pi-hole blacklist
location-services.googleapis.com
adservices.google.com
geolocation-api.purple.ai

This approach blocks some SDKs from reaching their backend servers entirely, preventing location data from leaving your device.

Developer-Level Solutions

Implementing Privacy-Preserving Location Handling

For developers building games that legitimately need location for gameplay (AR games, location-based scavenger hunts), implementing privacy by design reduces liability and protects users.

Request location only when necessary:

// Android: Request location only during active gameplay
class GameLocationManager(private val fusedLocationClient: FusedLocationProviderClient) {

    fun startGameLocationUpdates() {
        val locationRequest = LocationRequest.Builder(
            Priority.PRIORITY_HIGH_ACCURACY,
            10000L // 10 second intervals
        ).apply {
            setMinUpdateIntervalMillis(5000L)
            setWaitForAccurateLocation(false)
        }.build()

        // Only start when user explicitly engages location-based feature
        fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
    }
}

Stripping precision from coordinates before transmission:

// Reduce GPS precision to ~100 meters before sending to analytics
function obfuscateLocation(lat, lng) {
    const precision = 100; // meters
    const factor = precision / 111320; // approximate degrees per meter
    return {
        lat: Math.round(lat / factor) * factor,
        lng: Math.round(lng / factor) * factor
    };
}

Auditing Third-Party SDKs

Game developers frequently embed SDKs without fully understanding their data practices. Use tools like MobSF or AppSweep to analyze included libraries:

# Analyze APK/IPA for tracking libraries
mobsf/Mobile-Security-Framework-mobsfscan apkid --file game.apk

Identify and remove SDKs that transmit location data unnecessarily. Many analytics providers offer configuration options to disable location collection:

// Disable Firebase Analytics location collection
FirebaseAnalytics.getInstance(context).setUserProperty("location_collection", "disabled");

Practical Protection Strategy

A layered approach provides the strongest protection:

  1. Before installation: Check declared permissions and research the developer’s data practices
  2. At installation: Deny location permission if possible; use approximate location on iOS
  3. During use: Monitor network traffic with a proxy; block known trackers at DNS level
  4. Post-session: Revoke permissions after gameplay; clear app data periodically
  5. Alternative: Use emulators or test devices with mock locations for game testing

Built by theluckystrike — More at zovo.one

Advanced SDK Analysis Techniques

Beyond basic permission auditing, analyzing what SDKs actually transmit requires deeper tools:

Using Frida for Runtime Inspection

Frida allows you to instrument mobile apps at runtime to see exactly what functions are called:

import frida
import sys

def on_message(message, data):
    if message['type'] == 'send':
        print(message['payload'])

# Hook into location services
jscode = """
Interceptor.attach(Module.findExportByName("libcommonutils.so", "GetLocation"), {
    onEnter: function(args) {
        console.log("Location request intercepted");
        console.log("Latitude: " + args[0]);
        console.log("Longitude: " + args[1]);
    }
});
"""

session = frida.get_usb_device().attach('com.example.game')
script = session.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()

This technique shows exactly when and how games access location APIs, revealing whether collection happens during gameplay or in background processes.

Decrypting HTTPS Traffic

Using Burp Suite on a jailbroken/rooted device with a custom CA certificate allows inspection of encrypted traffic:

# On Android with Burp Suite
1. Install Burp Suite CA certificate
2. Configure system-wide proxy to 127.0.0.1:8080
3. Start Burp's proxy listener
4. Launch the game
5. Inspect captured requests for location-related APIs

Look for patterns in the captured requests:

GET /api/v1/analytics/location?lat=37.7749&lng=-122.4194&accuracy=15
GET /api/v2/user/telemetry
POST /sdk/event
  {
    "event_type": "location_update",
    "latitude": 37.7749,
    "longitude": -122.4194,
    "accuracy": 15,
    "timestamp": 1709548800000
  }

SDK-Specific Configuration Options

Major analytics SDKs include flags to disable location collection. Developers can implement these:

Firebase Analytics

// Disable automatic location collection
FirebaseAnalytics.getInstance(context).apply {
    setUserProperty("disable_location", "true")
    // For Crashlytics
    FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false)
}

AppsFlyer SDK

AppsFlyerLib.getInstance().apply {
    // Disable location collection
    setIsGeoLocationEnabled(false)
    // Disable OAID collection
    setSharingFilterForPartners(arrayOf("AppsFlyer"))
}

Unity Analytics

// Disable location data in Unity Analytics
AnalyticsCommonParameters.Location = null;

// Alternatively, disable privacy-sensitive collections
Analytics.CustomEvent("game_start", new Dictionary<string, object>
{
    { "collection_mode", "minimal" }
});

Network-Level Filtering Strategy

For power users, creating blocklists prevents location data exfiltration:

# /etc/hosts entries to block location analytics
0.0.0.0 locationservices.googleapis.com
0.0.0.0 location-services.google.com
0.0.0.0 adservices.google.com
0.0.0.0 mobilitydata.googleapis.com
0.0.0.0 geolocation.onetrust.com
0.0.0.0 geoservices.tealium.com
0.0.0.0 localsearch.apple.com

For more sophisticated filtering, use Pi-hole’s blocklist functionality to filter these domains across all devices on your network.

Behavioral Detection Systems

Some games implement detection to flag users who:

Understanding these detections helps you navigate the privacy/functionality trade-off:

// Example detection logic that games implement
function detectLocationSpoofing() {
    const positions = getLocationHistory(lastHour);

    for (let i = 1; i < positions.length; i++) {
        const distance = calculateDistance(positions[i-1], positions[i]);
        const timeElapsed = positions[i].timestamp - positions[i-1].timestamp;
        const requiredSpeed = distance / timeElapsed;

        // Human impossible speed = spoofing detected
        if (requiredSpeed > maxHumanSpeed) {
            return true;  // Mock location detected
        }
    }
    return false;
}

Comparison of Location Privacy Approaches

Approach Effectiveness Usability Detection Risk
Deny permission Very high Medium Low
Approximate location High High Very low
Mock location app High Low High
Proxy + location spoofing Very high Low Medium
Emulator with fake location Very high Low N/A

Emulators provide the strongest protection since they inherently provide fake location data that games cannot distinguish from real GPS.

Building Privacy-First Mobile Games

For developers creating location-based games, privacy by design reduces liability:

// Privacy-focused location handling for AR games
class PrivacyLocationManager(context: Context) {

    fun requestGameLocationWithConsent(): LocationData? {
        // 1. Request explicit user consent with clear language
        if (!getExplicitUserConsent("We need location for gameplay features")) {
            return null
        }

        // 2. Request minimum necessary accuracy
        val locationRequest = LocationRequest.Builder(
            Priority.PRIORITY_BALANCED_POWER_ACCURACY,  // Not high accuracy
            5000L  // 5 second intervals, not continuous
        ).build()

        // 3. Obfuscate coordinates before transmission
        val rawLocation = fusedLocationClient.getCurrentLocation()
        val obfuscatedLocation = obfuscateCoordinates(rawLocation)

        // 4. Purge location history after session
        clearLocationHistoryAfterSession()

        return obfuscatedLocation
    }
}

This approach gives games the location data they need while protecting user privacy.