---
title: "Nutrient Android SDK 11 release notes"
canonical_url: "https://www.nutrient.io/guides/android/releases/11-0/"
md_url: "https://www.nutrient.io/guides/android/releases/11-0.md"
last_updated: "2026-02-10T00:00:00.000Z"
description: "Nutrient Android SDK 11 release notes: a Jetpack Compose rendering rebuild, new Kotlin coroutine APIs, and major memory optimizations."
---

4 February 2026

Nutrient Android SDK 11 is a major release focused on performance and memory management. We’ve rebuilt the core rendering system using Jetpack Compose, started modernizing our APIs to use Kotlin coroutines, and added significant memory optimizations for viewing complex documents.

This release begins our transition to coroutine-based APIs, starting with [`AnnotationProvider`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.annotations/-annotation-provider/index.html) and [`DocumentJsonFormatter`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.document.formatters/-document-json-formatter/index.html). We’ll continue migrating additional APIs in future releases. For projects not yet using coroutines, we provide helper classes to ease the transition.

We also plan to expand our use of Jetpack Compose throughout the SDK, building on the Compose-based page rendering introduced in this release.

This release contains several fixes and enhancements. For the full list of changes, refer to our [changelog](https://www.nutrient.io/guides/android/changelog.md#11.0.0).

## Compose-based page rendering

We’ve rebuilt the core `PageView` rendering system using Jetpack Compose, replacing the legacy Android view system. This architectural change brings several benefits:

- **Improved performance** — Faster page transitions and smoother scrolling.

- **Better memory handling** — More efficient bitmap management during rapid scrolling.

- **Fixed tile artifacts** — Removed tile rendering for detailed bitmaps, which eliminates visual artifacts that could appear during zooming.

## Memory management improvements

This release introduces memory monitoring and automatic trimming to reduce memory pressure when viewing complex or large documents. The SDK now tracks memory usage and automatically releases resources when the system is under pressure, reducing the likelihood of out-of-memory crashes.

We’ve also improved memory management during rapid scrolling, ensuring smoother performance when navigating through documents quickly.

## Enhanced stylus support

We’ve added support for Samsung S-Pen custom motion events on devices like Tab S6 Lite that use non-standard action values, as well as support for the stylus eraser tool type (`TOOL_TYPE_ERASER`). When using a supported stylus, flipping to the back end of the stylus automatically switches to eraser mode.

## Multi-stage IME composition

This release adds proper support for multi-stage IME composition in content editing, such as Korean character input. The editing performance for these input methods has been significantly improved.

## Brotli compression support

The SDK now supports Brotli decompression for PDFs, an emerging compression standard that offers better compression ratios than traditional methods. For more information, refer to the [PDF Association announcement on Brotli compression](https://pdfa.org/brotli-compression-coming-to-pdf/).

## UI improvements

- **Document tabs** — Tabs now fill the full width of the tab bar with even distribution, matching our iOS SDK implementation.

- **Form filling** — Form filling is now enabled in annotation creation mode when no annotation tool is selected.

- **Instant JSON** — Improved import and export by preserving form field IDs across operations.

## Bug fixes

This release addresses numerous issues:

- Fixed a crash that could occur when rapidly pressing the undo button.

- Fixed an OOM exception when rendering text blocks during content editing at very high zoom levels.

- Fixed an ANR issue on heavy documents when opening the outline view.

- Fixed the eraser tool missing ink annotation segments at high zoom levels.

- Fixed ink annotation lines appearing jagged during erasing until touchup.

- Fixed various issues with XFDF export, text markup annotations, and font handling.

## Instant improvements

- `autosaveEnabled` in [`InstantPdfFragment`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.instant.ui/-instant-pdf-fragment/index.html) is now configurable. It remains enabled by default but can be disabled via `PdfConfiguration.Builder.autosaveEnabled(false)` if you experience sync issues during lifecycle transitions. Documents are still automatically synced every second after annotation changes.

- Added safeguards against `ALREADY_SYNCING` race conditions during sync retries.

- Improved error handling to prevent infinite sync loops when critical errors are received. The SDK now stops syncing after encountering unrecoverable errors such as `INVALID_REQUEST`, allowing apps to handle the error gracefully.

- Added support for recovering from server-side document recreation scenarios where annotation IDs no longer match the local cache. Refer to the [Instant example](https://github.com/PSPDFKit/pspdfkit-android-catalog/blob/master/app/src/main/java/com/pspdfkit/catalog/examples/kotlin/instant/activities/InstantExampleConnectionActivity.kt) in the Catalog app for a demonstration of cache reset and document reopening.

## Looking ahead

We’re continuing to invest in performance and developer experience:

- **Progressive rendering** — We’re working on progressive page rendering for faster initial display of complex pages. Expected delivery in one of the upcoming minor V11 releases.

- **Toolbar customization** — Improved APIs for customizing toolbars and annotation tools.

- **Stability** — Continued focus on reducing crashes and improving reliability.

- **Memory management** — Further optimizations for memory usage on resource-constrained devices.

---

## Migration guide

This release includes breaking changes to several APIs. Review the following sections to update your code.

### AnnotationProvider API changes

The `AnnotationProvider` interface now uses Kotlin coroutine `suspend` functions instead of RxJava or synchronous methods. This change improves performance and provides better cancellation support.

**Before (RxJava):**

```kotlin

document.annotationProvider.getAnnotationsAsync(pageIndex).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe { annotations ->
        // Handle annotations
    }

```

**After (Kotlin coroutines):**

```kotlin

lifecycleScope.launch {
    val annotations = document.annotationProvider.getAnnotations(pageIndex)
    // Handle annotations
}

```

#### Java interoperability

For Java code or projects not yet using coroutines, we provide two helper classes as temporary solutions.

**[`AnnotationProviderRxJava`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.annotations/-annotation-provider-rx-java/index.html)** — Bridges suspend APIs to RxJava types:

```java

import static com.pspdfkit.annotations.AnnotationProviderRxJava.*;

getAnnotationsObservable(document.getAnnotationProvider(), pageIndex).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(annotations -> {
        // Handle annotations.
    });

```

**[`AnnotationProviderBlocking`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.annotations/-annotation-provider-blocking/index.html)** — Provides blocking versions for synchronous Java code:

```java

import static com.pspdfkit.annotations.AnnotationProviderBlocking.*;

// Must be called off the main thread.
List<Annotation> annotations = getAnnotationsBlocking(
    document.getAnnotationProvider(),
    pageIndex
);

```

These helper classes are deprecated and will be removed in a future release (expected in 2027). We recommend migrating to Kotlin coroutines.

### DocumentJsonFormatter API changes

`DocumentJsonFormatter` now uses `suspend` functions. The `importDocumentJsonAsync` and `exportDocumentJsonAsync` methods are deprecated but still available.

**Before:**

```kotlin

DocumentJsonFormatter.exportDocumentJsonAsync(document, outputStream).subscribeOn(Schedulers.io()).subscribe()

```

**After:**

```kotlin

lifecycleScope.launch(Dispatchers.IO) {
    DocumentJsonFormatter.exportDocumentJson(document, outputStream)
}

```

For synchronous calls from Java, use `exportDocumentJsonBlocking` or `importDocumentJsonBlocking`, which must be called off the main thread.

### PdfDrawableProvider API changes

The [`PdfDrawableProvider.getDrawablesForPage`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui.drawable/-pdf-drawable-provider/index.html) method is now a `suspend` function. Previously, this was a synchronous method.

**Before:**

```kotlin

class MyDrawableProvider : PdfDrawableProvider() {
    override fun getDrawablesForPage(
        context: Context,
        document: PdfDocument,
        pageIndex: Int
    ): List<PdfDrawable>? {
        // Return drawables.
    }
}

```

**After:**

```kotlin

class MyDrawableProvider : PdfDrawableProvider() {
    override suspend fun getDrawablesForPage(
        context: Context,
        document: PdfDocument,
        pageIndex: Int
    ): List<PdfDrawable>? {
        // Return drawables.
    }
}

```

### Removed theme attribute

The `pspdf__tabBarMaximumWidth` theme attribute has been removed. Document tabs now automatically fill the available width and are distributed evenly. If you were using this attribute in your theme, remove it:

```xml

<!-- Before -->

<style name="MyTheme" parent="Theme.Nutrient">
    <item name="pspdf__tabBarMaximumWidth">300dp</item> <!-- Remove this line -->

</style>

<!-- After -->

<style name="MyTheme" parent="Theme.Nutrient">
    <!-- No longer needed -->

</style>

```

If your use case requires a maximum tab width, [contact our Support team](https://support.nutrient.io/hc/en-us/requests/new) to discuss your requirements.

### Toolbar customization in custom activities

If you’re embedding [`PdfFragment`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-fragment/index.html) in a custom activity, menu invalidation and toolbar customization now go through the [`PdfUi`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-ui/index.html) API instead of the activity’s menu callbacks.

- Call `invalidateMenu()` on your `PdfUi` instance to refresh the toolbar menu instead of the activity’s `invalidateOptionsMenu()`.

- Use `onGenerateMenuItemIds()` as your primary hook for adding or removing toolbar menu items rather than relying on the activity’s `onCreateOptionsMenu()` / `onPrepareOptionsMenu()` methods.

- `supportActionBar` is no longer used for toolbar customization. Obtain and customize the toolbar directly via:

```kotlin

val toolbar: Toolbar? = findViewById(com.pspdfkit.R.id.pspdf__toolbar_main)

```

When you call `invalidateMenu()`, `PdfUi` will trigger the `onGenerateMenuItemIds()` callback, ensuring the toolbar is rebuilt with your custom menu configuration.

### Null license keys and manual initialization

[`Nutrient.initialize`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit/-nutrient/initialize.html) now accepts a `null` license key for demo mode. For [manual initialization](https://www.nutrient.io/guides/android/basics/initializing-pspdfkit.md#manual-initialization), set `nutrient_automatic_initialize` to `false` in your `AndroidManifest.xml`:

```xml

<application>
    <meta-data
        android:name="nutrient_automatic_initialize"
        android:value="false" />
</application>

```

For more details on initialization options, refer to the [initializing Nutrient](https://www.nutrient.io/guides/android/basics/initializing-pspdfkit.md#manual-initialization) guide.
---

## Related pages

- [10 10 1](/guides/android/releases/10-10-1.md)
- [10 10](/guides/android/releases/10-10.md)
- [10 7](/guides/android/releases/10-7.md)
- [10 6](/guides/android/releases/10-6.md)
- [10 8](/guides/android/releases/10-8.md)
- [10 9](/guides/android/releases/10-9.md)
- [11 2](/guides/android/releases/11-2.md)
- [11 1](/guides/android/releases/11-1.md)
- [11 3 1](/guides/android/releases/11-3-1.md)
- [11 4](/guides/android/releases/11-4.md)
- [11 5](/guides/android/releases/11-5.md)
- [11 3](/guides/android/releases/11-3.md)

