# R8 Keep Radius

The "keep radius" of a keep rule refers to the negative impact that the rule has on the final application.

R8 provides a tool to analyze and visualize this keep radius. This helps developers:

* **Identify expensive rules**: Find keep rules that prevent R8 from
optimizing large parts of the application.
* **Debug dependencies**: See which libraries introduce broad keep rules.
* **Remove redundancy**: Discover rules that are not needed because they are
covered by other rules.

> **Note**: This feature is currently **experimental** and requires R8 version
> 9.2.14-dev or higher.

## Generating the R8 Configuration Analysis Report

R8 supports outputting a Configuration Analysis Report as an HTML file.

### Gradle

To generate the HTML report from a Gradle build, pass the
`com.android.tools.r8.dumpkeepradiushtmltodirectory` system property.

See [Replacing R8 in AGP](../README.md#replacing-r8-in-agp) for instructions on
how to update the R8 version in your build.

```bash
./gradlew assembleRelease \
    --no-daemon \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
```

**Example**:
```bash
./gradlew assembleRelease \
    --no-daemon \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/blastradius
```

### Android Platform

For builds within the Android Platform, set the `R8_DUMP_BLAST_RADIUS` environment variable to `true`.

```bash
R8_DUMP_BLAST_RADIUS=true m
```

This will generate an `r8blastradius.pb` file for each R8 build target within
`out/soong/.intermediates`.

## Visualizing the Data

The raw `.pb` file can be converted into an interactive HTML report using the
`BlastRadiusHtmlReportGenerator`.

### Converting a single file

Use the following command to convert a specific `.pb` file to HTML:

```bash
java -cp r8.jar com.android.tools.r8.blastradius.BlastRadiusHtmlReportGenerator \
  <path_to_input_pb> <path_to_output_html>
```

**Example**:
```bash
java -cp r8.jar com.android.tools.r8.blastradius.BlastRadiusHtmlReportGenerator \
  /tmp/blastradius/blastradius.pb /tmp/blastradius/report.html
```

### Converting multiple files (Android Platform)

If you have multiple blast radius files (e.g., from an Android Platform build),
you can generate a summary report for the directory:

```bash
java -cp prebuilts/r8/r8.jar com.android.tools.r8.blastradius.BlastRadiusHtmlReportGenerator \
  <path_to_input_directory> <path_to_output_directory>
```

**Example**:
```bash
java -cp prebuilts/r8/r8.jar com.android.tools.r8.blastradius.BlastRadiusHtmlReportGenerator \
  out/soong/.intermediates /tmp/blastradiusreport
```

This will scan the input directory for `.pb` files and generate an HTML report
in the output directory.
