• Home
Name Date Size #Lines LOC

..--

build/03-May-2024-150110

o/03-May-2024-573556

o-mr1/03-May-2024-580563

p/03-May-2024-1,1671,140

q/03-May-2024-1,7091,643

tools/03-May-2024-203152

OWNERSD03-May-2024115 76

README.mdD03-May-202410.1 KiB204161

README.md

1# Android Kernel Configs
2
3## How are kernel config settings typically stored?
4
5When building the Linux kernel for a particular platform one usually begins by
6basing the kernel configuration off of a particular defconfig. The platform’s
7defconfig contains all of the Linux kconfig settings required to properly
8configure the kernel build (features, default system parameters, etc) for that
9platform. Defconfig files are typically stored in the kernel tree at
10`arch/*/configs/`.
11
12It may be desirable to modify the kernel configuration beyond what the hardware
13platform requires in order to support a particular hardware or software
14feature. Storing these kernel configuration changes is often done using
15fragments. These are files which have the same format as a defconfig but are
16typically much smaller, as they only contain the kernel configuration settings
17needed to support the hardware or software feature/behavior in question.
18Maintainers of hardware extensions or software features can use fragments to
19compactly express their kernel requirements. The fragments can be combined
20with a platform defconfig using the kernel's make rules or using the
21`scripts/kconfig/merge_config.sh` script in the kernel tree.
22
23## How are Android's kernel configs stored?
24
25The kernel configs are stored in the [kernel/configs repo](https://android.googlesource.com/kernel/configs/).
26
27Kernel configuration settings that must be present for Android to function are
28located in the base config fragment, `android-base.config`. Configuration settings
29that enhance Android’s functionality in some way but are not required for it to
30run are located in the recommended config fragment, `android-recommended.config`.
31
32Some kernel config requirements only apply on certain architectures. Other
33requirements only apply if some other kernel config option has a particular
34value. The platform owner may also have a choice between several config
35options. These types of constraints cannot be expressed with a simple kernel
36config fragment. In releases up to and including Android P, kernel config
37requirements that are specific to a particular architecture are contained in
38architecture-specific base config fragments, such as
39`android-base-arm64.config`. If an architecture-specific base config fragment
40does not exist for a particular architecture in Android P or an earlier
41release, it means there are no required kernel config options for Android
42specific to that architecture. Note that the architecture-agnostic kernel
43config requirements from `android-base.config` still apply in that case.
44
45In releases after Android P the architecture-specific base config fragments are
46removed, and conditional kernel config requirements are stored in
47`android-base-conditional.xml`.
48
49Kernel configs vary by kernel version, so there are sets of kernel configs for
50each version of the kernel that Android supports.
51
52## How can I easily combine platform and required Android configs?
53
54Assuming you already have a minimalist defconfig for your platform, a possible
55way to enable these options would be to use the aforementioned
56`merge_config.sh` script in the kernel tree. From the root of the kernel tree:
57
58```sh
59ARCH=<arch> scripts/kconfig/merge_config.sh <...>/<platform>_defconfig <...>/android-base.config <...>/android-base-<arch>.config <...>/android-recommended.config
60```
61
62This will generate a `.config` that can then be used to save a new defconfig or
63compile a new kernel with Android features enabled.
64
65The kernel build system also supports merging in config fragments directly. The
66fragments must be located in the `kernel/configs` directory of the kernel tree
67and they must have filenames that end with the extension ".config". The
68platform defconfig must also be located in `arch/<arch>/configs/`. Once these
69requirements are satisfied, the full defconfig can be prepared with:
70
71```sh
72make ARCH=<arch> <platform>_defconfig android-base.config android-base-<arch>.config android-recommended.config
73```
74
75If there is an `android-base-conditional.xml` file for your release/kernel
76version combination, it is necessary to review it and manually edit your
77defconfig to satisfy any applicable requirements.
78
79## Are the config requirements tested?
80
81Starting with Android O the base kernel configs are not just advisory. They are
82tested as part of
83[VTS](https://android.googlesource.com/platform/test/vts-testcase/hal/+/master/treble/framework_vintf/AndroidTest.xml)
84(specifically the SystemVendorTest.KernelCompatibility subtest of
85CtsOnGsiTrebleFrameworkVintfTest), and also during device boot when the vendor
86interface (which includes the kernel configuration) and framework compatibility
87matrix are compared.
88
89## Ensuring Device Upgradability
90
91Devices launched with prior releases of Android must be able to upgrade to
92later releases of Android. This means that AOSP must function not only with
93device kernels that adhere to the Android kernel configs of the current
94release, but also with those device kernels that adhere to the configs of past
95releases. To facilitate that in the VtsKernelConfig test and in the framework
96compatibility matrix, past versions of the Android kernel config requirements
97are stored in the kernel/configs repo. During tests the appropriate versions
98of the configs are accessed depending on the launch level of the device.
99
100If you are adding a new feature to AOSP which depends on a particular kernel
101configuration value, either that kernel configuration value must already be
102present in the base android config fragments of past releases still on the
103supported upgrade path, or the feature must be designed in a way to degrade
104gracefully when the required kernel configuration is not present (and not be
105essential to AOSP’s overall functionality). All configs on the supported
106upgrade path are in the kernel/configs repo.
107
108Support for kernel configs from previous dessert releases is dropped from AOSP
109when the upgrade path from that dessert release is no longer supported.
110
111# Organization and Maintenance of the Kernel Config Repo
112
113The top level of the kernel configs repo contains directories for each
114supported kernel version. These contain the kernel config requirements (and
115recommendations) for the next release. There are also directories at
116the top level for previous releases. These directories contain the
117final kernel config requirements (for all supported kernel versions) for those
118releases and must not be changed once those releases have been
119published. AOSP must support all kernel configurations in this repo.
120
121For release branches the structure is similar, except there are no configs at
122the top level. When a release is branched from master the top-level configs are
123copied into a new directory for the release (this change is propagated to
124master) and the top-level configs are removed (this change is not propagated to
125master) since no development beyond that release is done in that branch.
126
127## I want to add/modify/remove a kernel config requirement. What do I do?
128
129Modify the top level kernel configs in AOSP. Make sure to modify the configs
130for all applicable kernel versions. Do not modify the config fragments in
131release directories.
132
133Because there is no tool to consistently generate these config fragments,
134please keep them alphabetically (not randomly) sorted.
135
136### `android-x.y/android-base.config`
137
138This file lists all common kernel configuration requirements on kernel version
139`x.y`.
140
141### `android-x.y/android-base-conditional.xml`
142
143Contains the following:
144
145* Minimum LTS required
146* Conditional requirements.
147
148### `android-x.y/Android.bp`
149
150Build rules from the aforementioned files to a
151[framework compatibility matrix](https://source.android.com/devices/architecture/vintf/comp-matrices)
152. See
153[this link](https://source.android.com/devices/architecture/vintf/match-rules#kernel)
154for details of the output format.
155
156## I want to freeze/release the current kernel requirements. What do I do?
157
158Prior to a [FCM Version release](https://source.android.com/devices/architecture/vintf/fcm#new-fcm-versions)
159(often accompanied with a dessert release as well), the kernel requirements must
160be frozen. Follow the following steps
161
162* Copy the top-level `android-*` directories to a release directory, preferably
163  with the dessert name (for example, `q`).
164  * Remove top-level `android-*` directories. This change is not propagated to
165    master.
166* Edit the new `<dessert>/android-*/Android.bp` files and rename the modules.
167  For example, change `kernel_config_current_4.9` in `q/android-4.9/Android.bp`
168  to `kernel_config_q_4.9`
169* Under `hardware/interfaces/compatibility_matrices/Android.bp`, edit
170  `kernel_config` field for the `framework_compatibility_matrix.current.xml`
171  to use the new modules.
172  * `framework_compatibility_matrix.current.xml` will be renamed to
173    `framework_compatibility_matrix.<level>.xml` as part of the FCM Version
174    release, which is a separate process.
175
176## I want to edit a released kernel requirement. What do I do?
177
178Don't edit a released kernel requirement unless necessary. If you have to make
179such a change, after discussing the change with maintainers, keep in mind that
180you **CANNOT** make a requirement more restrictive. Specifically,
181
182### Allowed
183* Support a new kernel version by creating a new `<dessert>/android-x.y`
184  directory
185* Remove a line from `<dessert>/android-*/android-base.config`
186* Remove a line from `<dessert>/android-*/android-base-*.config`
187* In `<dessert>/android-*/android-base-conditional.xml`
188    * Lower minimum LTS requirement from `x.y.u` to `x.y.v` (where `v < u`)
189    * Remove a `<group>`
190    * Add a condition `<group><conditions><config>`
191    * Remove a conditional requirement `<group><config>`
192
193### Not allowed
194* Add or change a line from `<dessert>/android-*/android-base.config`
195* Add or change a line from `<dessert>/android-*/android-base-*.config`
196* Add new conditional requirements `<dessert>/android-*/android-base-*.config`
197* Rename existing conditional requirements `<dessert>/android-*/android-base-*.config`
198* In `<dessert>/android-*/android-base-conditional.xml`
199    * Raise minimum LTS requirement from `x.y.u` to `x.y.v` (where `v < u`)
200    * Add a new `<group>`
201    * Remove or change a condition `<conditions><config>`
202    * Add or change a conditional requirement `<group><config>`
203* Other changes that are not in the [Allowed](#allowed) list
204