← RESEARCH HUB • PAPER 01

Decoding Android Raw GNSS: Pseudoranges, Clock Drift & Carrier Phase

How modern Android smartphones capture unprocessed satellite observations, and how FluxMap records high-rate telemetry into crash-safe container formats.

Introduction: The Transition from NMEA to Raw Observables

Historically, mobile applications received location data solely through estimated Cartesian fixes (latitude, longitude, altitude) derived by the operating system’s internal navigation engine. While sufficient for turn-by-turn routing, these pre-computed fixes discard critical raw physical data: satellite pseudoranges, carrier phase observations, Doppler shifts, hardware clock discontinuities, and multi-path reflection metrics.

Beginning with Android 7.0 (API 24) and significantly enhanced in Android 10+, the platform introduced the GnssMeasurement and GnssClock APIs. This opened the door for smartphones to function as true geodetic receivers capable of capturing the fundamental physical observables required for post-processing kinematic (PPK) and carrier-phase integer ambiguity resolution.

The Fundamental Observation Equation

The geometric distance between a satellite \(s\) and the receiver antenna \(r\) is encoded in the pseudorange measurement \(P_r^s\):

P_r^s = ρ_r^s + c · (δt_r - δt^s) + I_r^s + T_r^s + ε_P

Where:

  • \(\rho_r^s\) is the true geometric distance.
  • \(c\) is the speed of light in a vacuum.
  • \(\delta t_r\) and \(\delta t^s\) represent receiver and satellite clock biases.
  • \(I_r^s\) is ionospheric delay (dispersive, inversely proportional to frequency squared \(1/f^2\)).
  • \(T_r^s\) is tropospheric delay (non-dispersive refraction).
  • \(\varepsilon_P\) encompasses multipath reflection and receiver noise.

Dual-Frequency Reception: L1/E1 and L5/E5a

Single-frequency receivers (L1 only at 1575.42 MHz) cannot directly calculate ionospheric delay and must rely on broad broadcast models (Klobuchar model) that remove only 50–70% of ionospheric error.

Dual-frequency chipsets (e.g. Qualcomm Snapdragon 8 Gen 2/3, Google Tensor G3) receive both L1 and L5 (1176.45 MHz) or Galileo E1 and E5a. By taking the linear ionosphere-free combination of both frequencies:

P_IF = (f_1^2 · P_1 - f_5^2 · P_5) / (f_1^2 - f_5^2)

FluxMap leverages dual-frequency telemetry to eliminate first-order ionospheric refraction, reducing atmospheric ranging error from several meters down to decimeter levels.

Accumulated Delta Range (ADR) and Carrier Phase

While pseudorange measurements provide meter-level precision, the carrier phase measurement provides millimeter-level precision. In Android, carrier phase is exposed via Accumulated Delta Range (ADR):

ADR State Flag Bit Mask Physical Interpretation
ADR_STATE_VALID 0x01 Carrier phase tracking loop is locked and accumulating range.
ADR_STATE_RESET 0x02 Cycle slip detected or tracking loop reset; integer ambiguity reset.
ADR_STATE_CYCLE_SLIP 0x04 Loss of carrier lock between consecutive epochs.
ADR_STATE_HALF_CYCLE_RESOLVED 0x08 Half-cycle ambiguity has been resolved by receiver firmware.

How FluxMap Archives Raw Observables: The .fluxraw Package

Capturing 50+ satellite measurements every second generates substantial data volume. FluxMap’s RawGnssRecordingEngine handles this through crash-safe append-only NDJSON chunking:

  1. Raw epochs are committed to private storage in 5-minute chunk files (00000.ndjson, 00001.ndjson).
  2. Upon session completion, SHA-256 cryptographic digests are verified for every chunk.
  3. The session is packaged into a standardized session.fluxraw container with metadata.json and published atomically via Storage Access Framework.
Summary & Significance

By preserving uncompromised raw GNSS observables in standardized container formats today, FluxMap users can re-process their historical journeys with future RTK, PPP, and Galileo HAS solvers to achieve centimeter accuracy.

NEXT PAPER
All Research Papers