---
title: Compatibility - Android
description: Requirements and limitations to develop with the Contentsquare Android SDK
lastUpdated: 23 October 2025
source_url:
  html: https://docs.contentsquare.com/en/csq-sdk-android/product-analytics/compatibility/
  md: https://docs.contentsquare.com/en/csq-sdk-android/product-analytics/compatibility/index.md
---

* **Supported languages**: The Contentsquare SDK supports and tracks content written in Kotlin or Java.
* **Minimum Android version**: Your app must be running Android 5.0 (Lollipop) or a later version (API Level 21+) to use the Contentsquare SDK.
* **Compilation information**: The Contentsquare SDK is built and compiled using Android SDK version 34.

Warning

If your app supports Android devices running versions below 7.1, you must include the ISRG Root X1 certificate in your app to ensure Let's Encrypt certificates work correctly.

For more details and guidance, check this link: [Let's Encrypt Cross-Sign Expiration ↗](https://letsencrypt.org/2023/07/10/cross-sign-expiration/)

## Java versions

This version has been compiled on `Java 17` (Bytecode version 61).

Note

If you try to import the Contentsquare SDK while using a lower Java version in your project, you will get a `bad class file` error. Update your Java version to get rid of the error.

## Kotlin versions

Contentsquare Android SDK is compiled with Kotlin version `1.8.22`.

If you don't use the `1.8.22` Kotlin version and you have conflict issues; you must exclude the Kotlin `stdlib` from our SDK.

* Kotlin

  ```kotlin
  implementation("com.contentsquare.android:sdk:1.5.1") {
    exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8")
  }
  ```

* Groovy

  ```groovy
  implementation("com.contentsquare.android:sdk:1.5.1") {
    exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib-jdk8"
  }
  ```

Compatibility modes

We use [Kotlin Compatibility modes ↗](https://kotlinlang.org/docs/compatibility-modes.html) flags to be backward compatible with two previous Kotlin versions and one next version. For an in-depth understanding of compatibility modes, see this [quicksheet ↗](https://blog.mbonnin.net/kotlin-compatibility-quicksheet).

## Jetpack Compose versions

Contentsquare Compose SDK `com.contentsquare.android:sdk-compose:1.5.1` is compiled using Jetpack Compose version `1.7.0` (`bom 2024.09.00`).

| CSQ SDK Version | CS Compose version | Embedded Compose version | Minimum Compose version | Latest tested Compose version |
| - | - | - | - | - |
| 1.5.0 | 4.44.0 | 1.7.0 | 1.7.0 | 1.10.0 |
| 1.4.2 | 4.43.3 | 1.7.0 | 1.7.0 | 1.10.0-beta02 |
| 1.4.1 | 4.43.2 | 1.7.0 | 1.7.0 | 1.10.0-beta02 |
| 1.4.0 | 4.43.0 | 1.7.0 | 1.7.0 | 1.10.0-beta02 |
| 1.3.0 | 4.42.0 | 1.7.0 | 1.7.0 | 1.9.0-beta02 |
| 1.2.0 | 4.41.0 | 1.7.0 | 1.7.0 | 1.9.0-beta02 |
| 1.1.0 | 4.40.0 | 1.7.0 | 1.7.0 | 1.9.0-beta02 |
| 1.0.1 | 4.39.3 | 1.7.0 | 1.7.0 | 1.8.0-rc02 |
| 1.0.0 | 4.39.2 | 1.7.0 | 1.7.0 | 1.8.0-rc02 |
| 0.7.1 | 4.38.2 | 1.5.0 | 1.5.0 | 1.8.0-rc02 |
| 0.7.0 | 4.38.1 | 1.5.0 | 1.5.0 | 1.8.0-rc02 |
| | 4.38.0 | 1.5.0 | 1.5.0 | 1.8.0-rc02 |
| 0.6.0 | 4.37.0 | 1.5.0 | 1.5.0 | 1.7.7 |
| 0.5.1 | 4.36.1 | 1.5.0 | 1.5.0 | 1.7.7 |
| 0.5.0 | 4.36.0 | 1.5.0 | 1.5.0 | 1.7.7 |
| 0.4.0 | 4.35.0 | 1.5.0 | 1.5.0 | 1.7.0-beta06 |
| 0.3.0 | 4.34.0 | 1.5.0 | 1.5.0 | 1.7.0-beta06 |
| 0.2.0 | 4.33.2 | 1.5.0 | 1.5.0 | 1.7.0-beta06 |
| | 4.33.1 | 1.5.0 | 1.5.0 | 1.7.0-beta06 |
| | 4.33.0 | 1.5.0 | 1.5.0 | 1.7.0-beta06 |
| 0.1.1 | 4.32.1 | 1.5.0 | 1.5.0 | 1.7.0-beta06 |
| 0.1.0 | 4.32.0 | 1.5.0 | 1.5.0 | 1.7.0-beta06 |
| | 4.31.0 | 1.5.4 | 1.5.0 | 1.7.0-beta06 |
| | 4.30.0 | 1.5.4 | 1.5.0 | |
| | 4.29.1 | 1.5.4 | 1.5.0 | |
| | 4.28.0 | 1.5.4 | 1.5.0 | |
| | 4.27.1 | 1.5.4 | 1.4.0 | |
| | 4.26.0 | 1.5.4 | 1.4.0 | |
| | 4.25.0 | 1.5.4 | 1.4.0 | |
| | 4.24.1 | 1.5.4 | 1.4.0 | |
| | 4.23.1 | 1.4.0 | 1.4.0 | |
| | 4.22.0 | 1.4.0 | 1.4.0 | |
| | 4.21.0 | 1.4.0 | 1.4.0 | |
| | 4.20.0 | 1.4.0 | 1.4.0 | |

Note

If your project uses a lower Compose version than the one embedded in the Contentsquare Compose SDK, Gradle will automatically use the latter version. Update the Compose version to the one used by our SDK or later.

## Dependencies

The Contentsquare SDK has a few dependencies. We try to be up-to-date as much as possible to avoid conflict issues.

### Handling conflicts

We may sometimes have conflicts between your app dependencies VS SDK dependencies. In this case, you can exclude from our SDK any dependency we pull and use your version instead.

#### Example with excluding `recyclerview` dependency

If you have a version of the **`recyclerview`** in your app which is older than the one we use, you can use the following to exclude it in your Gradle file.

* Kotlin

  ```kotlin
  implementation("com.contentsquare.android:sdk:1.5.1") {
    exclude(group = "androidx.recyclerview", module = "recyclerview")
    exclude(group = "androidx.swiperefreshlayout", module = "swiperefreshlayout")
  }
  ```

* Groovy

  ```groovy
  implementation("com.contentsquare.android:sdk:1.5.1") {
    exclude group: "androidx.recyclerview", module: "recyclerview"
    exclude group: "androidx.swiperefreshlayout", module: "swiperefreshlayout"
  }
  ```

By doing this, you skip the **`recyclerview`** and **`swiperefreshlayout`** dependencies provided by our SDK.

### Dependencies list

The list of dependencies for each artifact is searchable on central.sonatype.com:

* [`com.contentsquare.android:sdk` ↗](https://central.sonatype.com/artifact/com.contentsquare.android/sdk/dependencies)
* [`com.contentsquare.android:sdk-compose` ↗](https://central.sonatype.com/artifact/com.contentsquare.android/sdk-compose/dependencies)

## Known limitations and recommendations

### Native UI Elements are not supported

**Symptom:**

1. You capture screenshots but main elements of the screen are not appearing.
2. SDK does not log any gesture events when interacting with some native UI elements.

**Explanation:** Native UI Elements such as Bottom Sheets, Dialogs, Menus are currently not supported by the SDK.

### Gestures not attached to the expected view (Layout visibility)

**Symptom:** In some cases, we found that gestures tracked by the SDK are not attached to the right UI element of the screen. These gestures will be attached to an invisible view.

**Explanation:** The reason for this is that when the SDK attaches the gesture to a UI element, it generates a path regarding the visibility of the view when traversing the view hierarchy. If a view is visible and it matches the coordinates on where the gesture was performed it will be taken into account. Most of the time, the issue is that a layout is still present on the screen even if there is no content.

**Best Practice:** When designing your application UI, do not let any layout stray along if it is not used. If a layout contains widgets like progress bar, remember to set its visibility to `GONE` or `INVISIBLE` after its purpose is served.

### Taps will be assigned to the first clickable view

**Symptom:** A tap is not assigned to the tapped view, but to a view higher in the view hierarchy.

**Explanation:** When a tap is captured, the view hierarchy is traversed to find all views that match the tap coordinates. The tap is assigned to the first clickable view, starting at the tail of the view list, meaning the search starts at the lowest hierarchy level. If no clickable view is found, then the tap is assigned to the view at the tail of the list.

Jetpack Compose example:

```kotlin
Button(
    onClick = { ... }
) {
    Text(text = "Simple Button")
}
```

A tap on the `Text` will be assigned to the `Button`, because the `Button` is clickable.

**Best practice:** If the described behavior does not fit your needs, you may add click listeners to the corresponding views. In the example above, you may add an identical click listener to the `Text`.

### Heatmaps: Initial scroll position has to be 0

**Symptom:** The tap positions in the Tap Heatmap do not match the actual tap positions on the screen.

**Explanation:** For lists with lazy item generation, we may be unable to determine the correct initial scroll position. This is because the top list items may not be generated yet. We expect the initial scroll position to always be 0.

**Best practice:** Ensure that the initial scroll position is always 0 for RecyclerViews and Compose lazy lists and lazy grids.

### No gesture detection for WebViews embedded in scroll container

**Symptom:** Swipe gestures are not detected for a WebView.

**Explanation:** For WebViews, the gesture detection is completely covered by the CS Tag, not the native Android SDK. However, when a WebView is placed inside a scrollable container, for example a `ScrollView`, the WebView will expand to its full size and all scrolling will be done by the scrollable container. In this case, no swipe gestures will be detected.

**Best practice:** Ensure that WebViews are not placed inside any scrollable containers.
