Skip to content

Development & delivery

OTA updates in a software-defined vehicle

How software actually reaches a sold vehicle — the difference between updating a head unit and updating a car, the preconditions nobody mentions, and what goes wrong.

Intermediate8 minOTA · Delivery · Regulation

is the mechanism the whole software-defined vehicle idea rests on. If you cannot change software after the sale, nothing else in this section matters.

You already know Android's update mechanism. What is worth understanding is everything around it, because updating a head unit and updating a vehicle are different problems.

Three scopes, increasing in difficulty#

The preconditions nobody mentions#

An update does not simply arrive. A long list of conditions must hold first, and most real-world OTA frustration comes from these rather than from the download.

ConditionWhy
ParkedYou cannot reboot an ECU at 100 km/h
Not about to be drivenAn interrupted install is the worst case
Sufficient batteryA flash that browns out mid-write can brick an ECU
Charging, for large updatesOn an EV, a big flash is a real energy draw
ConnectivityCellular data costs money and coverage is uneven
User consentLegally required in most markets, and expected everywhere
Compatible configurationThis hardware revision, these dependent versions
No pending faultDo not update a car that is already unhappy

The A/B pattern, and its limits#

Android's approach is the right mental model, and the wider vehicle uses the same idea where it can.

   ┌─────────── slot A (running) ───────────┐
   │  system, vendor, product               │   ← in use, untouched
   └────────────────────────────────────────┘
   ┌─────────── slot B (idle) ──────────────┐
   │  new image written here while driving  │   ← written in the background
   └────────────────────────────────────────┘

              reboot into B

        ┌───────────┴────────────┐
        │ boots and marks good?  │
        └───────┬────────────┬───┘
              yes            no
               │              │
         B becomes active   fall back to A automatically

Gotcha

A/B costs storage — roughly double for the partitions it covers. On a cost-sensitive programme this is a real argument, and some ECUs deep in the vehicle do not get A/B for that reason.

Those are the ones where a failed update is unrecoverable without a workshop visit, and they are exactly why full-vehicle OTA is treated so much more cautiously than infotainment OTA.

Orchestration across many ECUs#

A vehicle update is rarely one image. It is a campaign across components with dependencies between them.

Security is not optional here#

An update channel is a way to put code on a vehicle. Anyone who compromises it owns the fleet.

Staged rollout, and why it is different here#

Gotcha

Install success rate is a seductive and insufficient metric. An update can install perfectly and still be a failure: battery drain, a fault light, a feature that no longer works in cold weather.

Rollout gates should include fault-code rates, customer contact volume, and feature-level telemetry — not just "did the flash complete".

What this means for your Android work#

Assume your code will be replaced. Design for it. Persistent state must survive an update, and must tolerate being read by a newer version.

Assume the versions around you will differ. During a staged rollout, your app may run against an older VHAL or an older vehicle service. Handle absent properties and unknown values rather than assuming a matched set.

Keep the update path small. Anything that shrinks the image — shared libraries, avoiding duplicated assets, delta-friendly layouts — is cellular data the customer does not pay for and install time they do not wait through.

Never assume connectivity. Features that break without a network will break, and in a car that is a common state rather than an edge case.

Test the upgrade, not just the install. The interesting bugs are in migration from the previous version with real accumulated state — not in a clean flash.

Next#

What OTA enables commercially — feature on demand.

References & further reading

Code links target the main branch on cs.android.com. AOSP moves — if a path 404s, search the symbol instead.