blob: eb2c5036d2c331a961fea386559052510344c401 [file] [log] [blame] [view]
Anton Hanssona6caee82020-07-15 12:34:13 +01001# SdkExtensions module
2
Artur Satayevf7348092021-04-09 12:18:10 +01003SdkExtensions module is responsible for:
4- deciding the extension SDK level of the device;
5- providing APIs for applications to query the extension SDK level;
6- determining the values for the BOOTCLASSPATH, DEX2OATBOOTCLASSPATH, and
7 SYSTEMSERVERCLASSPATH environment variables.
Anton Hanssona6caee82020-07-15 12:34:13 +01008
Anton Hanssonb1a217c2020-11-30 11:43:05 +00009## General information
10
11### Structure
Anton Hanssona6caee82020-07-15 12:34:13 +010012
Artur Satayevf7348092021-04-09 12:18:10 +010013The module is packaged in an apex, `com.android.sdkext`, and has several
14components:
15- `bin/derive_classpath`: a native binary that runs early in the device boot
16 process. It reads individual classpath configs files from the system and
17 other modules, merges them, and defines the definition of *CLASSPATH environ
18 variables.
19- `bin/derive_sdk`: native binary that runs early in the device boot process and
Anton Hanssona6caee82020-07-15 12:34:13 +010020 reads metadata of other modules, to set system properties relating to the
21 extension SDK (for instance `build.version.extensions.r`).
Artur Satayevf7348092021-04-09 12:18:10 +010022- `javalib/framework-sdkextension.jar`: this is a jar on the bootclasspath that
Anton Hanssona6caee82020-07-15 12:34:13 +010023 exposes APIs to applications to query the extension SDK level.
24
Anton Hanssonb1a217c2020-11-30 11:43:05 +000025### Deriving extension SDK level
Anton Hanssona6caee82020-07-15 12:34:13 +010026`derive_sdk` is a program that reads metadata stored in other apex modules, in
Anton Hansson69e6ba82021-05-26 16:52:13 +010027the form of binary protobuf files in subpath `etc/sdkinfo.pb` inside each
Anton Hanssona6caee82020-07-15 12:34:13 +010028apex. The structure of this protobuf can be seen [here][sdkinfo-proto]. The
29exact steps for converting a set of metadata files to actual extension versions
30is likely to change over time, and should not be depended upon.
31
Anton Hanssonb1a217c2020-11-30 11:43:05 +000032### Reading extension SDK level
Anton Hanssona6caee82020-07-15 12:34:13 +010033The module exposes a java class [`SdkExtensions`][sdkextensions-java] in the
34package `android.os.ext`. The method `getExtensionVersion(int)` can be used to
35read the version of a particular sdk extension, e.g.
36`getExtensionVersion(Build.VERSION_CODES.R)`.
37
Artur Satayevf7348092021-04-09 12:18:10 +010038### Deriving classpaths
39`derive_classpath` service reads and merges individual config files in the
40`/system/etc/classpaths/` and `/apex/*/etc/classpaths`. Each config stores
41protobuf message from [`classpaths.proto`] in a proto binary format. Exact
42merging algorithm that determines the order of the classpath entries is
43described in [`derive_classpath.cpp`] and may change over time.
44
45[`classpaths.proto`]: packages/modules/SdkExtensions/proto/classpaths.proto
46[`derive_classpath.cpp`]: packages/modules/SdkExtensions/derive_classpath/derive_classpath.cpp
47[sdkinfo-proto]: packages/modules/SdkExtensions/proto/sdk.proto
Anton Hanssona6caee82020-07-15 12:34:13 +010048[sdkextensions-java]: framework/java/android/os/ext/SdkExtensions.java
Anton Hanssonb1a217c2020-11-30 11:43:05 +000049
50## Developer information
51
Anton Hansson12236542022-04-12 20:34:06 +010052### Adding a new extension
53An extension is a way to group a set of modules so that they are versioned
54together. We currently define a new extension for every Android SDK level
55that introduces new modules. Every module shipped in previous versions are
56also part of the new extension. For example, all the R modules are part of
57both the R extensions and the S extensions.
58
59The steps to define a new extension are:
60- Add any new modules to the SdkModule enum in sdk.proto.
61- Add the binary "current sdk version" proto to the apexes of the new modules.
Anton Hanssoncda99fa2021-01-15 08:15:57 +000062- Update `derive_sdk.cpp` by:
63 * mapping the modules' package names to the new enum values
Anton Hansson12236542022-04-12 20:34:06 +010064 * creating a new set with the new enum values of the modules relevant for
65 this extension.
Anton Hanssoncda99fa2021-01-15 08:15:57 +000066 * set a new sysprop to the value of `GetSdkLevel` with the new enum set
Anton Hansson12236542022-04-12 20:34:06 +010067 * add a unit test to `derive_sdk_test.cpp` verifying the new extensions work
Anton Hanssonb1a217c2020-11-30 11:43:05 +000068- Make the `SdkExtensions.getExtensionVersion` API support the new extensions.
69- Extend the CTS test to verify the above two behaviors.