Skip to content

Tutorials

What you can customise in AAOS, and how

Android Automotive is built to be modified — but the modification points are spread across partitions, build files and policy languages that are documented separately, if at all. This is the map, followed by step-by-step tutorials for each one.

14 tutorials · 5 tracks22 customisation surfaces mapped
Start with Create your own lunch target

Every customisation surface

15 of these have a full tutorial below. The rest are listed so the map is complete — knowing a surface exists is most of the problem.

SurfaceWhat it changesWhere it livesTutorial
Product / lunch targetA build flavour of your owndevice/<oem>/<product>/Open
Board configurationPartitions, architecture, AVBBoardConfig.mkOpen
SELinux policyDomains, types, allow rulesdevice/<oem>/<product>/sepolicy/Open
init serviceA native daemon started at boot*.rc + cc_binaryOpen
Vehicle HALThe vehicle network bridgehardware/<oem>/automotive/vehicle/Open
Vehicle propertiesVendor-defined vehicle stateVHAL config + car-libOpen
AIDL HALYour own vendor interfacehardware/interfaces/ or vendor/Open
Car subserviceA service inside Car Servicepackages/services/Car/Open
System serviceA service inside system_serverframeworks/base/services/Open
PermissionsOEM permissions and allowlistsframework overlay + privapp XMLOpen
System appPrivileged, platform-signed APKpackages/apps/ or vendor/Open
RRORuntime theming without forkingAn overlay APKOpen
CarSystemUISystem bars, HVAC panel, keyguardpackages/apps/Car/SystemUI + RROOpen
Audio topologyZones, buses, volume groupscar_audio_configuration.xmlOpen
Boot animationWhat the driver sees firstbootanimation.zipOpen
Framework resourcesBuild-time config overridesDEVICE_PACKAGE_OVERLAYS
LauncherThe app grid and home screenpackages/apps/Car/Launcher
Car SettingsSettings entries and preferencespackages/apps/Car/Settings
Key layout / inputSteering wheel and rotary mapping*.kl and *.idc files
Locale & regionLanguages, units, regional behaviourProduct config + resources
Kernel & device treeDrivers, display ports, CAN interfaceskernel/ — outside AOSP
OTA packagingHow updates are built and signedota_from_target_files

Platform foundations

Your own product target, your own SELinux domain, your own native daemon — the base everything else is built on.

  1. 01Intermediate

    Create your own lunch target

    Your own product flavour that builds, boots in the emulator, and gives every later tutorial somewhere to put its files.

    1–2 hours (plus one full build)

  2. 02Intermediate

    Add a native daemon started by init

    A vendor service written in C++, built with Soong, started by init at boot — and the SELinux denial you will hit immediately.

    1–2 hours

Vehicle integration

A vendor VHAL from an empty directory, custom properties end to end, and your own AIDL HAL when properties are the wrong shape.

  1. 04Advanced

    Build your own Vehicle HAL

    A vendor VHAL that registers as IVehicle, serves its own property configs, and publishes changes — reusing AOSP's binder plumbing instead of reimplementing it.

    3–5 hours

  2. 05Advanced

    Add a custom vehicle property end to end

    A vendor property from ID allocation to an app reading it — config, permission, SEPolicy, car-lib constant and the six places it fails silently.

    2–4 hours

  3. 06Advanced

    Define your own AIDL HAL

    When vehicle properties are the wrong shape — a versioned vendor interface with real RPC, its own VINTF entry and its own SELinux domain.

    2–3 hours

Framework services

Add a subservice to Car Service, a service to system_server, and the permission that guards it.

  1. 07Advanced

    Add a subservice to Car Service

    An OEM service inside com.android.car, with its own AIDL, its own manager class in car-lib, and the threading rules that keep the platform booting.

    3–4 hours

  2. 08Advanced

    Add a service to system_server

    A framework service outside Car Service — SystemService lifecycle, boot phases, and when this is the right layer rather than a Car subservice.

    2–3 hours

  3. 09Intermediate

    Define and enforce an OEM permission

    A signature-level permission of your own — declared in the framework, allowlisted for a privileged app, enforced at every entry point, and verified on device.

    1–2 hours

Apps & UI

A privileged system app, runtime resource overlays, and modifying CarSystemUI without forking it.

  1. 10Intermediate

    Build a privileged system app

    An APK built into the image, signed with the platform key, holding a signature permission and using hidden APIs — and how to iterate on it without reflashing.

    2–3 hours

  2. 11Intermediate

    Theme the platform with an RRO

    Restyle CarSystemUI and the Car UI Library from a separate APK — no forking, no rebuild, and a thirty-second iteration loop.

    1–2 hours

  3. 12Advanced

    Modify CarSystemUI

    Add a button to the system bar, change which bars exist, and know exactly when an overlay stops being enough and a fork begins.

    2–3 hours

Product configuration

Audio topology, boot animation and the settings surface — the configuration that makes a build an OEM’s.

  1. 13Advanced

    Configure car audio zones and buses

    Declare output devices in the audio HAL, group them into zones and volume groups, and prove every context routes somewhere.

    2–3 hours

  2. 14Beginner

    Build a custom boot animation

    The OEM's first impression — a correctly packaged bootanimation.zip, sized for the real display, that does not add a second to boot.

    1 hour