Repository navigation
v4.4.6 — WorkManager pinned to 2.9.1 (spoofed API 34 startup crash)
Maintenance release. No API changed, and no library source file changed — the whole diff is dependencies and docs.
The one change worth reading is a deliberate downgrade of WorkManager to 2.9.1, pinning away from a defect in 2.10/2.11 that kills the process at startup on ROMs that spoof API 34. Also picks up AGP 9.4.0, Firebase BOM 34.19.0, Compose BOM 2026.09.00 and Yandex Mobile Ads 8.4.0.
Upgrading is a drop-in from 4.4.x.
Changed
WorkManager pinned back to 2.9.1 (a downgrade, on purpose)
WorkManager 2.10 and 2.11 call android.app.job.JobScheduler.forNamespace whenever Build.VERSION.SDK_INT >= 34. That method genuinely exists on API 34 — but modified and spoofed ROMs that report API 34 while running an older framework underneath do not have it, so constructing the WorkManager singleton throws NoSuchMethodError.
That throw is fatal rather than merely inconvenient because androidx.startup auto-initializes WorkManager from InitializationProvider, a ContentProvider. ActivityThread.handleBindApplication installs content providers after Application.attachBaseContext but before Application.onCreate, so there is no user code on the stack to catch it and nothing in the app has run yet. The process dies during bind:
Fatal Exception: java.lang.RuntimeException: Unable to get provider
androidx.startup.InitializationProvider: java.lang.NoSuchMethodError:
No virtual method forNamespace(Ljava/lang/String;)Landroid/app/job/JobScheduler;
in class Landroid/app/job/JobScheduler; or its super classes
(declaration of 'android.app.job.JobScheduler' appears in /system/framework/framework.jar)
at android.app.ActivityThread.installProvider(ActivityThread.java:7467)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:6973)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6744)
In a minified build the StartupException between the two appears under its obfuscated name (y40: or similar), so match on the InitializationProvider + forNamespace pair rather than on the middle frame.
2.9.1 is the last release without that call, which is why the pin lands exactly there rather than on a newer 2.10.x/2.11.x patch — the call is present throughout both lines.
⚠️ The pin does not override your app
AdManageKit references androidx.work in no source file at all — the dependency is declared only to steer the version the Next-Gen GMA SDK pulls in transitively (the SDK asks for 2.7.0). It is an implementation dependency, so it lands in the published POM at runtime scope, and Gradle still resolves the highest version across the whole graph.
If your app declares 2.10 or 2.11 itself, or depends on anything that does, you keep that version and you keep the crash. Check what you actually resolve:
./gradlew :app:dependencies --configuration releaseRuntimeClasspath | grep androidx.workIf that shows 2.10.x or 2.11.x, pin it in the app as well:
implementation("androidx.work:work-runtime:2.9.1")If you need 2.10+ APIs, do not downgrade your app to match the library. Remove WorkManagerInitializer from androidx.startup and implement androidx.work.Configuration.Provider on your Application instead — WorkManager then initializes on demand at the first getInstance(context) call, on your thread, in your code, where the error is catchable and degrades one feature instead of killing the process.
Other dependency updates: AGP 9.3.2 → 9.4.0, Firebase BOM 34.18.0 → 34.19.0, Compose BOM 2026.08.00 → 2026.09.00, Yandex Mobile Ads 8.3.0 → 8.4.0, Robolectric (test only) 4.16.1 → 4.17. GMA Next-Gen SDK stays at 1.4.0, Play Billing at 9.1.0, Kotlin at 2.2.10, UMP at 4.0.0.
Fixed
A stray leading space in the workRuntime catalog entry — the value was written as " 2.9.1", and Gradle does not trim version strings, so it resolved to nothing and the downgrade would not have taken effect. Caught before tagging; 4.4.6 resolves androidx.work:work-runtime:2.9.1 cleanly.
Notes
- No behavioral change in any ad, billing, consent or waterfall path. The existing 176 tests pass unchanged
- Robolectric stays pinned to SDK 35 via
robolectric.properties; the 4.17 bump does not change that
Upgrading
implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit:v4.4.6'
implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-billing:v4.4.6'
implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-core:v4.4.6'
// For Jetpack Compose support
implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-compose:v4.4.6'
// For Yandex Ads multi-provider support
implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-yandex:v4.4.6'No code changes are required.
Full release notes: docs/release-notes/RELEASE_NOTES_v4.4.6.md