# Description of the core library configuration file

## Version

The first field `configuration_format_version` encodes a versioning number internal to R8/D8
in the form of an unsigned integer. It allows R8/D8 to know if the file given is supported.
Non-backward compatible changes to the desugared library increase the version number, and such
library cannot be compiled without upgrading R8/D8 to the latest version.

The second field `version` holds the version of the content for the configuration. This number
must be updated each time the configuration is changed.

## Required compilation API level

The third field `required_compilation_api_level` encodes the minimal Android API level required for
the desugared library to be compiled correctly. If the API of library used for compilation of the
library or a program using the library is lower than this level, one has to upgrade the SDK version
used to be able to use desugared libraries.

## Library and program flags

The fourth and fifth fields are `library_flags` and `program_flags`. They include the set of flags
required for respectively the library and the program using the desugared library compilation. The
sets of flags are different depending on the min API level used. The flags are in a list, where
each list entry specifies up to which min API level the set of flags should be applied. During
compilation, R8/D8 adds up all the required flags for the min API level specified at compilation.

For example, let's say the `program_flags` have entries for `api_level_below_or_equal` 20, 24 and 26.
If compiling the program for min API 24, R8/D8 will use both the set of flags for API 24 and 26
(24 <= 24, 24 <= 26 but !(24 <= 20)).

## Extra keep rules

The last field is `extra_keep_rules`, it includes keep rules that are appended by L8 when shrinking
the desugared library. It includes keep rules related to reflection inside the desugared library,
related to enum to have EnumSet working and to keep the j$ prefix.

## Copyright

Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
for details. All rights reserved. Use of this source code is governed by a
BSD-style license that can be found in the LICENSE file.