Add new proto database and tool to manage it

This change adds the schema of the new extension database and the
skeleton of a tool to manage it.

Each extension version maps to set of module version requirements,
and a text representation of this proto database is checked in
(currently empty). The tool is currently only able to convert the
database to its binary representation (which will be used on-device to
derive what extension we have currently). Also add a test for the
tool/binary generation.

The tool will be extended in future CLs to be able to add/update/remove
SDKs, as well performing various consistency checks on the DB.

Bug: 173188089
Test: atest gen_sdk_test
Change-Id: I918170a851719bcc5bc70568f4705629b500735b
7 files changed
tree: cb5008eb5547bf96e8ba3f5eb1079feeb230fd9f
  1. derive_sdk/
  2. framework/
  3. gen_sdk/
  4. proto/
  5. testing/
  6. tests/
  7. Android.bp
  8. com.android.sdkext.avbpubkey
  9. com.android.sdkext.pem
  10. com.android.sdkext.pk8
  11. com.android.sdkext.x509.pem
  12. gen_sdkinfo.py
  13. manifest.json
  14. OWNERS
  15. PREUPLOAD.cfg
  16. README.md
  17. TEST_MAPPING
README.md

SdkExtensions module

SdkExtensions is a module that decides the extension SDK level of the device, and provides APIs for applications to query the extension SDK level.

General information

Structure

The module is packaged in an apex, com.android.sdkext, and has two components:

  • bin/derive_sdk: Native binary that runs early in the device boot process and reads metadata of other modules, to set system properties relating to the extension SDK (for instance build.version.extensions.r).
  • javalib/framework-sdkextension.jar: This is a jar on the bootclasspath that exposes APIs to applications to query the extension SDK level.

Deriving extension SDK level

derive_sdk is a program that reads metadata stored in other apex modules, in the form of binary protobuf files in subpath etc/sdkinfo.binarypb inside each apex. The structure of this protobuf can be seen here. The exact steps for converting a set of metadata files to actual extension versions is likely to change over time, and should not be depended upon.

Reading extension SDK level

The module exposes a java class SdkExtensions in the package android.os.ext. The method getExtensionVersion(int) can be used to read the version of a particular sdk extension, e.g. getExtensionVersion(Build.VERSION_CODES.R).

Developer information

Adding a new extension version

For every new Android SDK level a new extension version should be defined. These are the steps necessary to do that:

  • Make derive_sdk correctly set the relevant system property for the new extensions.
  • Make the SdkExtensions.getExtensionVersion API support the new extensions.
  • Extend the CTS test to verify the above two behaviors.
  • Update RollbackManagerServiceImpl#getExtensionVersions to account for the new extension version.

TODO(b/173188089): expand this section when derive_sdk is reimplemented