Nutrient Android SDK 11.6 release notes
RSS2 July 2026
Nutrient Android SDK 11.6 is now available on Maven Central as io.nutrient:nutrient-android-sdk. This release also makes viewing large, memory-heavy documents more resilient: Pages that previously crashed the app under memory pressure now recover automatically and show a placeholder until memory is available again, and rendering stays responsive while scrolling and scrubbing through documents with heavy pages. A new persistent page cache stores rendered pages on disk, so revisiting a page shows it instantly instead of flashing blank. Pages now render at their full layout resolution for sharper output on lower-end devices, and the minimum supported Android SDK version is raised to 24 (Nougat).
This release includes breaking changes — the minimum supported Android SDK version is now 24, and the fixed full-page render resolution cap has been removed. Refer to the migration guide below for details on updating your code.
This release contains several additional fixes and enhancements. For the full list of changes, refer to our changelog.
Now available on Maven Central
The SDK is now published to Maven Central as io.nutrient:nutrient-android-sdk. The existing custom Maven repository (io.nutrient:nutrient) remains available during a transition period, so existing integrations keep working without changes. New integrations can depend on Maven Central directly:
dependencies { implementation("io.nutrient:nutrient-android-sdk:11.6.0")}More resilient rendering under memory pressure
Viewing large, memory-heavy documents no longer risks crashing the app when the device runs low on memory.
- Pages whose render is aborted under memory pressure now show a warning icon with the message “There is not enough memory available to display this page.” instead of staying blank, matching the iOS SDK. The page renders normally once memory recovers or the page is refreshed.
- Out-of-memory crashes when viewing documents with extremely heavy pages are fixed. Rendering work is aborted under critical native memory pressure, and affected pages are rerendered automatically once memory recovers.
- The new
PdfFragment.setOnSustainedMemoryPressureListener()notifies your app when critical native memory pressure persists despite the SDK’s automatic recovery, so it can offer to close the document. Transient memory pressure recovers silently and never invokes the listener. - When a search ends early because the device is running low on memory, a note now appears below the search result count so the partial results aren’t mistaken for the complete set.
TextSearch.didLastSearchStopDueToLowMemory()lets you detect a truncated search when usingTextSearchdirectly.
Faster, sharper page rendering
Rendering now prioritizes what’s onscreen and renders pages at full resolution.
- Thumbnail bar renders defer to the visible page’s render instead of competing with it, so settling on a page after scrubbing the thumbnail bar no longer leaves it blank behind long-running thumbnail renders. The same applies to zoomed-page detail renders.
- Preloading of adjacent offscreen pages now waits for — and yields to — the visible page’s render and resumes once the document is idle, improving time to display on documents with heavy pages.
- A full-page render that’s superseded before it finishes is now canceled promptly instead of running to completion, so the page you settle on starts rendering without waiting behind stale renders.
- Pages without annotations no longer perform a redundant visible-region render at the default zoom level, improving rendering efficiency with no change to displayed content.
- The device-tier full-page render resolution cap has been removed, so pages render at their full layout resolution for sharper output on lower-end devices. See the migration guide for the removed
setFixedFullPageRenderPixelCount()API.
Persistent page cache
Rendered pages are now cached to disk, so revisiting a page you’ve already seen shows it instantly instead of briefly flashing blank while it rerenders.
- The cache survives closing and reopening the document, and even restarting the app, so returning to a document you were reading recently displays immediately rather than rerendering from scratch.
- Password-protected documents are never cached to disk.
- The disk cache is enabled by default. You can disable it — while keeping the in-memory cache — with the new
diskCacheEnabledoption onPdfConfiguration:
val configuration = PdfConfiguration.Builder() .diskCacheEnabled(false) .build()Mouse-wheel scrolling and zooming
Viewing a document with a mouse — for example in Android desktop mode or on a Chromebook — now responds to the scroll wheel. The wheel scrolls through the document, and holding Ctrl while scrolling zooms in and out, centered on the pointer.
Raised minimum SDK version
The minimum supported Android SDK version is now 24 (Nougat). Apps targeting an earlier minSdk must update before integrating this release.
Other improvements
- The AI Assistant user interface and the Instant sync error dialog are now translated in all supported languages, having previously been available in English only.
- Document presentation no longer instantiates a
WebViewon the main thread when checking Reader View and HTML-to-PDF conversion support. This also fixes a startup hang observed on Android emulators when a debugger is attached. - Updated bundled dependencies: Kotlin to 2.3.21, Jetpack Compose to 1.11.3, Kotlin coroutines to 1.11.0, Koin to 4.2.2, Material Components to 1.14.0, kotlinx.serialization to 1.11.0, and kotlinx.collections.immutable to 0.5.0.
Bug fixes
This release addresses issues in both the user interface and underlying model layer.
UI
- Fixed a crash that could occur when an undo or redo failed while editing document content.
- Fixed a rare
IllegalStateException: Can not perform this action after onSaveInstanceStatethat could occur when the annotation creator dialog was shown, or the stamp picker dialog was dismissed, after the host activity had been backgrounded. - Fixed a rare crash that could occur when an action menu was shown while its host was being torn down.
- Fixed a crash that could occur in the thumbnail grid when pages were added, removed, or reordered while editing a document.
- Fixed removing an invalid digital signature: The Remove Signature button in the signature information dialog was inert when validation threw, and the underlying form field removal crashed for signatures whose widgets had no associated page.
- Fixed the drag-to-reorder handle still appearing on annotation list items in edit mode even when annotation list reordering was disabled via
annotationListReorderingEnabled(false). - Fixed two-finger touches in quick succession during ink annotation creation being joined into a single straight line when stylus-only mode is off.
- Fixed the
DocumentViewandInstantDocumentViewcomposables showing a blank document after the app is minimized and restored while hosted inside a dialog window, such as a Navigation Compose dialog destination. - Fixed the annotation popup toolbar not appearing on the first selection when tapping an annotation with a finger while a drawing tool is active and stylus-only input is enabled.
- Fixed the form editing bar staying hidden behind the soft keyboard, or floating above it with a band of empty space, when the PDF view is embedded in a host with an edge-to-edge window (enforced on Android 15+ with targetSdk 35, and common in React Native hosts).
- Fixed the document refitting to a fraction of its size when the soft keyboard opens during form filling or editing with the default page fit mode. The page now keeps its current size and the visible area shrinks instead, keeping the focused element legible.
Model
- Fixed a rare
NoSuchMethodErrorcrash when reading package metadata on devices that report API 33+ but ship a framework missing the TiramisuPackageManagerAPIs. - Fixed a crash on launch that could occur when a
PdfActivitywas relaunched without its original arguments, such as a task restored after the process was killed or the app was updated. The activity now opens an empty viewer instead of crashing. - Fixed a crash on launch that could occur when a
PdfActivitywas restored from a task created by a previous SDK version, where the persisted configuration could no longer be read. - Fixed a crash that could occur when reading a document’s title from a content URI whose read permission had been revoked.
- Fixed a crash when loading malformed PDFs whose page dictionary
/Typeentry is set to anything other than/Page. - Fixed a crash when opening PDFs with malformed GoTo or GoToR link destinations.
- Fixed a rare native crash when two Instant annotation syncs overlap on the same document.
- Fixed crashes that could occur when opening or saving images with truncated or corrupt XMP metadata.
- Fixed a potential UI freeze caused by reading the system clipboard on the main thread for every clipboard change. Clipboard contents are now only inspected when annotations are pasted.
- Fixed
DeviceCMYKtransparency groups with Multiply and Overlay blend modes rendering too dark or washed out in some documents. - Fixed an issue where some PDFs could render thin white or colored lines in smooth background areas.
- Fixed adding and removing page margins on PDF pages with a non-zero-origin
MediaBox. - Fixed the content editor showing incorrect glyphs when applying text styles to embedded subset fonts.
- Fixed non-embedded Symbol and ZapfDingbats fonts rendering certain characters (such as the bullet) with an incorrect glyph.
- Fixed text extraction and search returning the replacement character (U+FFFD) for some characters in documents whose ToUnicode CMap contains a character range that crosses a byte boundary.
- Fixed Instant JSON export writing
pdfObjectId: 0for newly created annotations without a backing PDF object number. - Fixed checkbox and radio button option labels collapsing to their export values when exporting Instant JSON.
- Fixed preserving fitted rich text annotations applied from XFDF.
Looking ahead
The custom Maven repository (io.nutrient:nutrient) remains available only during the transition to Maven Central. Plan to migrate your dependency to io.nutrient:nutrient-android-sdk on Maven Central so your build keeps resolving once the custom repository is retired.
Migration guide {#migration-guide}
This section covers the breaking changes in this release and how to update your code, followed by the notable additions worth knowing about when you upgrade.
Minimum supported SDK version raised to 24
The minimum supported Android SDK version is now 24 (Nougat). If your app still declares a lower minSdk, raise it before integrating this release:
android { defaultConfig { minSdk = 24 }}FixedFullPageRenderPixelCount configuration removed
The device-tier full-page render resolution cap has been removed, so pages now render at their full layout resolution. PdfConfiguration.Builder.setFixedFullPageRenderPixelCount(Integer) and the PdfConfiguration.getFixedFullPageRenderPixelCount() property no longer have any effect and have been removed. There is no replacement — remove the call.
Before:
val configuration = PdfConfiguration.Builder() .setFixedFullPageRenderPixelCount(2_000_000) .build()After:
val configuration = PdfConfiguration.Builder() .build()getSupportPackageInfo() now throws a checked exception
If you call the public getSupportPackageInfo() extension in com.pspdfkit.utils directly, note that it now declares throws PackageManager.NameNotFoundException. Java callers must handle or declare the exception. Kotlin callers won’t see a compile error, but should still catch it where the package may be absent.
Before (Java):
PackageInfo info = PackageManagerExtensions.getSupportPackageInfo(packageManager, packageName, flags);After (Java):
try { PackageInfo info = PackageManagerExtensions.getSupportPackageInfo(packageManager, packageName, flags);} catch (PackageManager.NameNotFoundException e) { // Handle the missing package.}Notable additions
- Sustained memory pressure handling. The new
OnSustainedMemoryPressureListener(incom.pspdfkit.listeners) can be registered withPdfFragment.setOnSustainedMemoryPressureListener(...)to react when the SDK reports sustained critical memory pressure despite its automatic recovery — for example, to offer to close the document. Transient memory pressure recovers silently and never invokes the listener. - Low-memory search signal.
TextSearch.didLastSearchStopDueToLowMemory()reports when a search was cut short because the device ran low on memory, so partial results aren’t mistaken for a complete set when usingTextSearchdirectly.