| # Verifies that a library compiled with a newer JDK is compatible with older JDK API |
| |
| Currently, the project only checks `kotlin-reflect` for JDK 1.6 compatibility. |
| The check is necessary to make sure applications using `kotlin-reflect` can run on older Android devices. |
| |
| ## How to run |
| |
| Run from the root directory of the kotlin project: |
| |
| `./gradlew :tools:jdk-api-validator:test` |
| |
| ## How to interpret the result |
| |
| Successful completion of the `test` task means the checked libraries are compatible with JDK 1.6 API. |
| In case of failure, the exact location and name of the violating API references are logged as error. |
| |
| An example of validation error: |
| |
| `[ERROR] /kotlin/libraries/reflect/build/libs/kotlin-reflect-1.9.255-SNAPSHOT.jar:kotlin/reflect/jvm/internal/ComputableClassValue.class:47: Undefined reference: void ClassValue.<init>()` |
| |
| ## How to fix a failure |
| |
| If the violating reference can be desugared by R8 or its execution is prevented on Android platform, |
| the error can be suppressed. See `suppressAnnotations` and `undefinedReferencesToIgnore` in `JdkApiUsageTest.kt`. |
| Otherwise, the API should be avoided. |
| |
| To check if an API can be desugared by R8: |
| 1. Identify the earliest R8 version that supports current Kotlin version [here](https://developer.android.com/build/kotlin-support). |
| 2. Download the R8 version jar artifact from Google's maven repository [here](https://maven.google.com/web/index.html#com.android.tools:r8). |
| 3. Run it using the `BackportedMethodList` entry point, e.g., `java -cp r8-8.0.40.jar com.android.tools.r8.BackportedMethodList`. |
| 4. Check if the violating API reference is in the printed list of methods. |
| |
| Also, you can get the list of backported methods the downloaded version supports for a given Android API level: |
| ```shell |
| $ java -cp r8-8.0.40.jar com.android.tools.r8.BackportedMethodList --help |
| Usage: BackportedMethodList [options] |
| Options are: |
| --output <file> # Output result in <file>. |
| --min-api <number> # Minimum Android API level for the application |
| --desugared-lib <file> # Desugared library configuration (JSON from the |
| # configuration) |
| --lib <file> # The compilation SDK library (android.jar) |
| --version # Print the version of BackportedMethodList. |
| --help # Print this message. |
| ``` |
| |