| # Updating the latest framework manifest |
| |
| ## Adding new HALs / Major version update |
| |
| Add a new `<hal>` entry without a `max-level` attribute. The `<hal>` entry can |
| be added to the main manifest under `manifest.xml`, or to the manifest |
| fragment for the server module specified in `vintf_fragments`. |
| |
| Introducing new HALs are backwards compatible. |
| |
| ## Minor version update |
| |
| When a framework HAL updates its minor version, simply update the `<version>` or |
| `<fqname>` field to the latest version. This is the same as any other HALs. |
| |
| For example, when `IServiceManager` updates to 1.2, change its `<fqname>` field |
| to `@1.2::IServiceManager/default`. |
| |
| Because minor version updates are backwards compatible, all devices that require |
| a lower minor version of the HAL are still compatible. |
| |
| Leave `max-level` attribute empty. |
| |
| ## Deprecating HAL |
| |
| When a framework HAL is deprecated, set `max-level` field of the HAL from empty |
| to the last frozen version. |
| For example, if IDisplayService is deprecated in Android S, set `max-level` to |
| Android R (5): |
| |
| ```xml |
| <manifest version="3.0" type="framework"> |
| <hal format="hidl" max-level="5"> <!-- Level::R --> |
| <name>android.frameworks.displayservice</name> |
| <transport>hwbinder</transport> |
| <fqname>@1.0::IDisplayService/default</fqname> |
| </hal> |
| </manifest> |
| ``` |
| |
| Note that the `max-level` of the HAL is set to Android R, meaning that the HAL |
| is last available in Android R and disabled in Android S. |
| |
| Deprecating a HAL doesn’t mean dropping support of the HAL, so no devices will |
| break. |
| |
| When setting `max-level` of a HAL: |
| - If `optional="false"` in frozen DCMs, the build system checks that adding the |
| attribute does not break backwards compatibility; that is, |
| `max-level > last_frozen_level`. |
| - If `optional="true"`, the check is disabled. Care must be taken to ensure |
| `max-level` is set appropriately. |
| |
| ## Removing HAL |
| |
| When the framework drops support of a certain HAL, the corresponding HAL entry |
| is removed from the framework manifest, and code that serves and registers the |
| HAL must be removed simultaneously. |
| |
| Devices that are lower than the `max-level` attribute of the HAL may start to |
| break if they require this HAL. Hence, this must only be done when there is |
| enough evidence that the devices are not updateable to the latest Android |
| release. |
| |
| # Freezing framework HAL manifest |
| |
| First, check `libvintf` or `hardware/interfaces/compatibility_matrices` to |
| determine the current level. |
| |
| Execute the following, replacing the argument with the level to freeze: |
| |
| ```shell script |
| lunch cf_x86_phone-userdebug # or any generic target |
| LEVEL=5 |
| ./freeze.sh ${LEVEL} |
| ``` |
| |
| A new file, `frozen/${LEVEL}.xml`, will be created after the command is |
| executed. Frozen system manifests are stored in compatibility matrices. Then, |
| manually inspect the frozen compatibility matrix. Modify the `optional` |
| field for certain HALs. See comments in the compatibility matrix of the previous |
| level for details. |
| |
| These compatibility matrices served as a reference for devices at that |
| target FCM version. Devices at the given target FCM version should |
| reference DCMs in the `frozen/` dir, with some of the HALs marked |
| as `optional="true"` or even omitted if unused by device-specific code. |
| |
| At build time, compatibiltiy is checked between framework manifest and |
| the respective frozen DCM. HALs in the framework manifest with `max-level` |
| less than the specified level are omitted. |