Traditionally, Android* has been designed to have a unique lunch target for each enabled device, and each lunch target has a product source code directory associated with it. To enable Android on a variety of Intel x86- based boards across many CPU types at once, any given device needs to be tuned for specific peripherals and software features. With completely independent lunch targets and product directories, a great deal of configuration data was copied and pasted among build targets spread across many configuration file types. In addition, any changes to the configuration data must be propagated to those copies in the product directories, which significantly increases the maintenance cost. To mitigate the effort, Celadon introduces a multiple-inheritance system to generate product-definition features based on a mixin model.
Mixins are placed in groups; each group represents a functional area
on the system, such as audio, Wi-Fi*, or boot parameters among other
features and characteristics. Thus, configuration directives for functional
areas are grouped together and can be reused. Each group provides radio-
button-like selection options among features, and a product must choose at
least one option for each group. A script
device/intel/mixins/mixin-update then updates all the build targets
with this data whenever it’s changed.
Each mixin group represents a functional area of the system that has multiple radio button options from which to select for a particular product. Some groups may be simple true/false selections. A typical example is the option to integrate GMS. Many mixin groups offer a variety of selections, such as the cpu-arch mixin group, which instructs the system to gather configuration data relevant to the particular SoC and to generate the configuration for the target product.
Each mixin group has a subdirectory in the base mixin directory at
device/intel/mixins/groups/. The path to the base mixin directory is
mixins.spec in each product directory:
$ ls device/intel/mixins/groups/ aaf boot-arch debug-coredump debug-usb-config ethernet gptbuild memtrack pstore touch vndk abota-fw bugreport debug-crashlogd debugfs evs graphics midi public-libraries treble wlan acpi-partition camera-ext debug-dvc_desc default-drm factory-partition hdcpd navigationbar rfkill trusty acpio-partition codec2 debug-kernel device-specific factory-scripts health net sepolicy usb allow-missing-dependencies codecs debug-lmdump device-type filesystem_config houdini neuralnetworks serialport usb-audio-init art-config config-partition debug-log-watch dexpreopt firmware intel_prop odm-partition slot-ab usb-gadget atrace cpu-arch debug-npk disk-bus firststage-mount kernel ota-upgrade storage usb-init audio cpuset debug-phonedoctor disk-encryption flashfiles lights power suspend usb-otg-switch avb dalvik-heap debug-tools display-density fota load_modules product-partition swap variants bluetooth dbc debug-unresponsive dynamic-partitions googleservice media psdapp thermal vendor-partition
A mixin spec file is a text file that describes the product configurations.
Every Celadon build target that uses mixins should have a
file in their product board configuration directories. Instead of manually
modifying feature settings in the product makefiles, the product
customization and peripherals tuning are done by editing the
If there are updates or changes to any mixin configuration files, you should
mixin-update script from the root of the Celadon Android
source tree. The script searches all files named
device/intel/ directory and generates the makefiles
init.rc, etc.) required for building Android in individual product
option.spec file, if it is present in an option subdirectory of
a mixin group, specifies metadata for that option of a particular group.
This file is used to set arguments to a default value if the value is not
mixins.spec. For example, a ‘efi’ option is
available for the ‘boot-arch’ mixin group:
$ ls device/intel/mixins/groups/boot-arch/efi: AndroidBoard.mk fstab init.rc option.spec BoardConfig.mk gpt.ini init.recovery.rc product.mk
The configuration fragments such as
BoardConfig.mk included in the previous option directory are applied
to the product configuration files if the option ‘efi’ is
specified in the product mixin spec file
... boot-arch: efi(uefi_arch=x86_64,fastboot=efi,acpi_permissive=true) ...
files.spec file is used to specify additional files that will be
before building Celadon images. This configuration file should be placed in an
option subdirectory of a group. The files listed in
files.spec will be copied into the target product repo if this group is selected.
For example, the
mixins.spec of the CiV
lunch target specifies the project-celadon option for the
boot-arch group. As a result, the UEFI firmware startup file
startup.nsh listed in
files.spec is copied to the CiV source
repository after running the
$ cat device/intel/project-celadon/caas/mixins.spec ... [groups] ... boot-arch: project-celadon(uefi_arch=x86_64,fastboot=efi,ignore_rsci=true,disable_watchdog=true,...) ... $ cat device/intel/mixins/groups/boot-arch/project-celadon/files.spec ... [extrafiles] update_ifwi_ab.sh: "ifwi update script running in postinstall" startup.nsh: "Auto installer start" ...
mixinfo.spec file is an optional file in a mixin group
directory, which defines metadata for a particular group. It is currently
used to manage dependencies between mixin groups. For example:
$ cat device/intel/mixins/groups/debug-phonedoctor/mixinfo.spec [mixinfo] deps = debug-crashlogd
Running a mixin update ensures the mixin group ‘debug-crashlogd’ is included before processing the ‘debug-phonedoctor’ group.