| # Android Kernel Configs |
| |
| ## How are kernel config settings typically stored? |
| |
| When building the Linux kernel for a particular platform one usually begins by |
| basing the kernel configuration off of a particular defconfig. The platform’s |
| defconfig contains all of the Linux kconfig settings required to properly |
| configure the kernel build (features, default system parameters, etc) for that |
| platform. Defconfig files are typically stored in the kernel tree at |
| `arch/*/configs/`. |
| |
| It may be desirable to modify the kernel configuration beyond what the hardware |
| platform requires in order to support a particular hardware or software |
| feature. Storing these kernel configuration changes is often done using |
| fragments. These are files which have the same format as a defconfig but are |
| typically much smaller, as they only contain the kernel configuration settings |
| needed to support the hardware or software feature/behavior in question. |
| Maintainers of hardware extensions or software features can use fragments to |
| compactly express their kernel requirements. The fragments can be combined |
| with a platform defconfig using the kernel's make rules or using the |
| `scripts/kconfig/merge_config.sh` script in the kernel tree. |
| |
| ## How are Android's kernel configs stored? |
| |
| The kernel configs are stored in the [kernel/configs repo](https://android.googlesource.com/kernel/configs/). |
| |
| Kernel configuration settings that must be present for Android to function are |
| located in the base config fragment, `android-base.config`. Configuration settings |
| that enhance Android’s functionality in some way but are not required for it to |
| run are located in the recommended config fragment, `android-recommended.config`. |
| |
| Some kernel config requirements only apply on certain architectures. Other |
| requirements only apply if some other kernel config option has a particular |
| value. The platform owner may also have a choice between several config |
| options. These types of constraints cannot be expressed with a simple kernel |
| config fragment. In releases up to and including Android P, kernel config |
| requirements that are specific to a particular architecture are contained in |
| architecture-specific base config fragments, such as |
| `android-base-arm64.config`. If an architecture-specific base config fragment |
| does not exist for a particular architecture in Android P or an earlier |
| release, it means there are no required kernel config options for Android |
| specific to that architecture. Note that the architecture-agnostic kernel |
| config requirements from `android-base.config` still apply in that case. |
| |
| In releases after Android P the architecture-specific base config fragments are |
| removed, and conditional kernel config requirements are stored in |
| `android-base-conditional.xml`. |
| |
| In Android R or above, additional config fragments are added conditionally |
| on build variants. In particular, `non_debuggable.config` contains additional |
| requirements for user builds. |
| |
| Kernel configs vary by kernel version, so there are sets of kernel configs for |
| each version of the kernel that Android supports. |
| |
| ## How can I easily combine platform and required Android configs? |
| |
| Assuming you already have a minimalist defconfig for your platform, a possible |
| way to enable these options would be to use the aforementioned |
| `merge_config.sh` script in the kernel tree. From the root of the kernel tree: |
| |
| ```sh |
| ARCH=<arch> scripts/kconfig/merge_config.sh <...>/<platform>_defconfig <...>/android-base.config <...>/android-base-<arch>.config <...>/android-recommended.config |
| ``` |
| |
| This will generate a `.config` that can then be used to save a new defconfig or |
| compile a new kernel with Android features enabled. |
| |
| The kernel build system also supports merging in config fragments directly. The |
| fragments must be located in the `kernel/configs` directory of the kernel tree |
| and they must have filenames that end with the extension ".config". The |
| platform defconfig must also be located in `arch/<arch>/configs/`. Once these |
| requirements are satisfied, the full defconfig can be prepared with: |
| |
| ```sh |
| make ARCH=<arch> <platform>_defconfig android-base.config android-base-<arch>.config android-recommended.config |
| ``` |
| |
| If there is an `android-base-conditional.xml` file for your release/kernel |
| version combination, it is necessary to review it and manually edit your |
| defconfig to satisfy any applicable requirements. |
| |
| ## Are the config requirements tested? |
| |
| Starting with Android O the base kernel configs are not just advisory. They are |
| tested as part of |
| [VTS](https://android.googlesource.com/platform/test/vts-testcase/hal/+/master/treble/framework_vintf/AndroidTest.xml) |
| (specifically the SystemVendorTest.KernelCompatibility subtest of |
| CtsOnGsiTrebleFrameworkVintfTest), and also during device boot when the vendor |
| interface (which includes the kernel configuration) and framework compatibility |
| matrix are compared. |
| |
| ## Ensuring Device Upgradability |
| |
| Devices launched with prior releases of Android must be able to upgrade to |
| later releases of Android. This means that AOSP must function not only with |
| device kernels that adhere to the Android kernel configs of the current |
| release, but also with those device kernels that adhere to the configs of past |
| releases. To facilitate that in the VtsKernelConfig test and in the framework |
| compatibility matrix, past versions of the Android kernel config requirements |
| are stored in the kernel/configs repo. During tests the appropriate versions |
| of the configs are accessed depending on the launch level of the device. |
| |
| If you are adding a new feature to AOSP which depends on a particular kernel |
| configuration value, either that kernel configuration value must already be |
| present in the base android config fragments of past releases still on the |
| supported upgrade path, or the feature must be designed in a way to degrade |
| gracefully when the required kernel configuration is not present (and not be |
| essential to AOSP’s overall functionality). All configs on the supported |
| upgrade path are in the kernel/configs repo. |
| |
| Support for kernel configs from previous dessert releases is dropped from AOSP |
| when the upgrade path from that dessert release is no longer supported. |
| |
| # Organization and Maintenance of the Kernel Config Repo |
| |
| The top level of the kernel configs repo contains directories for each |
| supported kernel version. These contain the kernel config requirements (and |
| recommendations) for the next release. There are also directories at |
| the top level for previous releases. These directories contain the |
| final kernel config requirements (for all supported kernel versions) for those |
| releases and must not be changed once those releases have been |
| published. AOSP must support all kernel configurations in this repo. |
| |
| For release branches the structure is similar, except there are no configs at |
| the top level. When a release is branched from master the top-level configs are |
| copied into a new directory for the release (this change is propagated to |
| master) and the top-level configs are removed (this change is not propagated to |
| master) since no development beyond that release is done in that branch. |
| |
| ## I want to add/modify/remove a kernel config requirement. What do I do? |
| |
| Modify the top level kernel configs in AOSP. Make sure to modify the configs |
| for all applicable kernel versions. Do not modify the config fragments in |
| release directories. |
| |
| Because there is no tool to consistently generate these config fragments, |
| please keep them alphabetically (not randomly) sorted. |
| |
| ### `android-x.y/android-base.config` |
| |
| This file lists all common kernel configuration requirements on kernel version |
| `x.y`. |
| |
| ### `android-x.y/android-base-conditional.xml` |
| |
| Contains the following: |
| |
| * Minimum LTS required |
| * Conditional requirements. |
| |
| ### `android-x.y/Android.bp` |
| |
| Build rules from the aforementioned files to a |
| [framework compatibility matrix](https://source.android.com/devices/architecture/vintf/comp-matrices) |
| . See |
| [this link](https://source.android.com/devices/architecture/vintf/match-rules#kernel) |
| for details of the output format. |
| |
| ## I want to freeze/release the current kernel requirements. What do I do? |
| |
| Prior to a [FCM Version release](https://source.android.com/devices/architecture/vintf/fcm#new-fcm-versions) |
| (often accompanied with a dessert release as well), the kernel requirements must |
| be frozen. Follow the following steps |
| |
| * Copy the top-level `android-*` directories to a release directory, preferably |
| with the dessert name (for example, `q`). |
| * Remove top-level `android-*` directories. This change is not propagated to |
| master. |
| * Edit the new `<dessert>/android-*/Android.bp` files and rename the modules. |
| For example, change `kernel_config_current_4.9` in `q/android-4.9/Android.bp` |
| to `kernel_config_q_4.9` |
| * Under `hardware/interfaces/compatibility_matrices/Android.bp`, edit |
| `kernel_config` field for the `framework_compatibility_matrix.current.xml` |
| to use the new modules. |
| * `framework_compatibility_matrix.current.xml` will be renamed to |
| `framework_compatibility_matrix.<level>.xml` as part of the FCM Version |
| release, which is a separate process. |
| |
| ## I want to edit a released kernel requirement. What do I do? |
| |
| Don't edit a released kernel requirement unless necessary. If you have to make |
| such a change, after discussing the change with maintainers, keep in mind that |
| you **CANNOT** make a requirement more restrictive. Specifically, |
| |
| ### Allowed |
| * Support a new kernel version by creating a new `<dessert>/android-x.y` |
| directory |
| * Remove a line from `<dessert>/android-*/android-base.config` |
| * Remove a line from `<dessert>/android-*/android-base-*.config` |
| * In `<dessert>/android-*/android-base-conditional.xml` |
| * Lower minimum LTS requirement from `x.y.u` to `x.y.v` (where `v < u`) |
| * Remove a `<group>` |
| * Add a condition `<group><conditions><config>` |
| * Remove a conditional requirement `<group><config>` |
| |
| ### Not allowed |
| * Add or change a line from `<dessert>/android-*/android-base.config` |
| * Add or change a line from `<dessert>/android-*/android-base-*.config` |
| * Add new conditional requirements `<dessert>/android-*/android-base-*.config` |
| * Rename existing conditional requirements `<dessert>/android-*/android-base-*.config` |
| * In `<dessert>/android-*/android-base-conditional.xml` |
| * Raise minimum LTS requirement from `x.y.u` to `x.y.v` (where `v < u`) |
| * Add a new `<group>` |
| * Remove or change a condition `<conditions><config>` |
| * Add or change a conditional requirement `<group><config>` |
| * Other changes that are not in the [Allowed](#allowed) list |