media icon indicating copy to clipboard operation
media copied to clipboard

java.lang.NullPointerException only on Pixel 10 XL Pro

Open akrulec opened this issue 4 months ago • 4 comments

Version

Media3 1.8.0

More version details

No response

Devices that reproduce the issue

Pixel 10 XL Pro, running Android 16

Devices that do not reproduce the issue

Pixel 7a, running Android 16 Samsung Galaxy A26 Pixel 8a, running Android 16

Reproducible in the demo app?

Not tested

Reproduction steps

This error is reported via Firebase Crashlytics in production, and we have no way of reproducing it.

Expected result

App doesn't crash.

Actual result

App crashes.

We have one of our users using Pixel 10 XL Pro triggering the following error. Puzzling part is that this is only reproducible on Pixel 10, and the frustrating part is that none of the stack points to the origin in our code, so I wouldn't even know where to catch the exception, if I wanted to. Any recommendations?

# Crashlytics - Stack trace
# Platform: android
# Version: 1.20250821.3 (201241)
# Issue: 73e5c4a5942c95dd06b55d3ef6919b7b
# Session: 68C0AAE2010400014F2CF56363813099_DNE_1_v2
# Date: Tue Sep 09 2025 15:32:06 GMT-0700 (Pacific Daylight Time)

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
       at androidx.media3.common.util.Assertions.checkNotNull(Assertions.java)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.syncTasks(DownloadManager.java:970)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.onTaskStopped(DownloadManager.java:1102)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.handleMessage(DownloadManager.java:763)
       at android.os.Handler.dispatchMessage(Handler.java:110)
       at android.os.Looper.dispatchMessage(Looper.java:315)
       at android.os.Looper.loopOnce(Looper.java:251)
       at android.os.Looper.loop(Looper.java:349)
       at android.os.HandlerThread.run(HandlerThread.java:100)

glide-active-resources:
       at java.lang.Object.wait(Object.java)
       at java.lang.Object.wait(Object.java:405)
       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:207)
       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:228)
       at com.bumptech.glide.load.engine.ActiveResources.cleanReferenceQueue(ActiveResources.java:132)
       at com.bumptech.glide.load.engine.ActiveResources$2.run(ActiveResources.java:61)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
       at com.bumptech.glide.load.engine.ActiveResources$1$1.run(ActiveResources.java:43)
       at java.lang.Thread.run(Thread.java:1119)

Firebase Blocking Thread #1:
       at jdk.internal.misc.Unsafe.park(Unsafe.java)
       at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:410)
       at java.util.concurrent.LinkedTransferQueue$DualNode.await(LinkedTransferQueue.java:452)
       at java.util.concurrent.SynchronousQueue$Transferer.xferLifo(SynchronousQueue.java:194)
       at java.util.concurrent.SynchronousQueue.xfer(SynchronousQueue.java:233)
       at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:336)
       at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1081)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
       at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0(CustomThreadFactory.java:47)
       at java.lang.Thread.run(Thread.java:1119)

FileObserver:
       at android.os.FileObserver$ObserverThread.observe(FileObserver.java)
       at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)

Firebase Blocking Thread #3:
       at libcore.io.Linux.close(Linux.java)
       at libcore.io.ForwardingOs.close(ForwardingOs.java:176)
       at libcore.io.BlockGuardOs.close(BlockGuardOs.java:113)
       at libcore.io.ForwardingOs.close(ForwardingOs.java:176)
       at libcore.io.IoBridge.closeAndSignalBlockedThreads(IoBridge.java:311)
       at java.io.FileInputStream.close(FileInputStream.java:578)
       at com.google.firebase.installations.local.PersistedInstallation.readJSONFromFile(PersistedInstallation.java:138)
       at com.google.firebase.installations.local.PersistedInstallation.readPersistedInstallationEntryValue(PersistedInstallation.java)
       at com.google.firebase.installations.FirebaseInstallations.getMultiProcessSafePrefs(FirebaseInstallations.java:625)
       at com.google.firebase.installations.FirebaseInstallations.doNetworkCallIfNecessary(FirebaseInstallations.java)
       at com.google.firebase.installations.FirebaseInstallations.lambda$doRegistrationOrRefresh$3(FirebaseInstallations.java)
       at com.google.firebase.concurrent.SequentialExecutor$1.run(SequentialExecutor.java:117)
       at com.google.firebase.concurrent.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:229)
       at com.google.firebase.concurrent.SequentialExecutor$QueueWorker.run(SequentialExecutor.java)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
       at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0(CustomThreadFactory.java:47)
       at java.lang.Thread.run(Thread.java:1119)

OkHttp Dispatcher:
       at jdk.internal.misc.Unsafe.park(Unsafe.java)
       at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:410)
       at java.util.concurrent.LinkedTransferQueue$DualNode.await(LinkedTransferQueue.java:452)
       at java.util.concurrent.SynchronousQueue$Transferer.xferLifo(SynchronousQueue.java:194)
       at java.util.concurrent.SynchronousQueue.xfer(SynchronousQueue.java:233)
       at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:336)
       at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1081)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
       at java.lang.Thread.run(Thread.java:1119)

[com.mycopilot.copilotapp_issue_73e5c4a5942c95dd06b55d3ef6919b7b_crash_session_68C0AAE2010400014F2CF56363813099_DNE_1_v2_stacktrace.txt](https://github.com/user-attachments/files/22262094/com.mycopilot.copilotapp_issue_73e5c4a5942c95dd06b55d3ef6919b7b_crash_session_68C0AAE2010400014F2CF56363813099_DNE_1_v2_stacktrace.txt)

Media

{"text":"up first is 30 seconds of kneeling-push-up. press start to begin.","url":"https://deltatrainer-voice-prompts.s3.amazonaws.com/7cd353d2e94de9310717197469b230e7f74d53240e2dea551c808562e1d8fa2667b2d455f1a27781ddf38b07bfeb61b194e852ae2a03025f86cc2d8ed7228cac.mp3"}, {"text":"up first is 30 seconds of kneeling-push-up.","url":"https://deltatrainer-voice-prompts.s3.amazonaws.com/a4b1762175b9cc776124e5996a882a51be4f4f8af0bf0e4f7323dbb0aabc06b5863b651fde58d63becdc7b10681fded1a34f770111d98e09436eab69be17a135.mp3"}, {"text":"left side.", "url":"https://deltatrainer-voice-prompts.s3.amazonaws.com/a2f28fc8b5ff7d533feb62673b884726c0fac8c82cb0f21b989f99622838d25a81cdcd749f01949a06d3755b402dd67c3f643b15f4f1bcad4aa2972521ed9156.mp3"}, {"text":"up next is 30 seconds of chest-opener.","url":"https://deltatrainer-voice-prompts.s3.amazonaws.com/451418c9427f09c2af42b8fa97b538354483fd02c9df535badd42b742e417a7b76d1f365f262ef3fc11f3c48d24acc251e00b57672ead1a841a62c30ccff0c1b.mp3"},

Bug Report

  • [ ] You will email the zip file produced by adb bugreport to [email protected] after filing this issue.

akrulec avatar Sep 10 '25 20:09 akrulec

I believe this is happening because activeTask is null here:

https://github.com/androidx/media/blob/bfe5930f7f29c6492d60e3d01a90abd3c138b615/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadManager.java#L970

I think the fact the error is complaining about trying to invoke getClass() is a red herring (likely caused by Android trying to add info to the NPE after (or while) it's been thrown).

icbaker avatar Sep 11 '25 08:09 icbaker

Thank you for your prompt response! Is there something I can do on the app side to prevent this? Thank you

akrulec avatar Sep 11 '25 17:09 akrulec

We facing 3 variants of same crash in Firebase.

Variant 1

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
       at androidx.media3.common.util.Assertions.checkNotNull(Assertions.java)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.syncTasks(DownloadManager.java:970)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.initialize(DownloadManager.java:805)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.handleMessage(DownloadManager.java:726)
       at android.os.Handler.dispatchMessage(Handler.java:109)
       at android.os.Looper.loopOnce(Looper.java:250)
       at android.os.Looper.loop(Looper.java:340)
       at android.os.HandlerThread.run(HandlerThread.java:107)

Varient 2

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
       at androidx.media3.common.util.Assertions.checkNotNull(Assertions.java)
       at androidx.media3.exoplayer.offline.DownloadHelper.onMediaPrepared(DownloadHelper.java:1053)
       at androidx.media3.exoplayer.offline.DownloadHelper.access$500(DownloadHelper.java)
       at androidx.media3.exoplayer.offline.DownloadHelper$MediaPreparer.handleDownloadHelperCallbackMessage(DownloadHelper.java:1434)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loopOnce(Looper.java:243)
       at android.os.Looper.loop(Looper.java:338)
       at android.app.ActivityThread.main(ActivityThread.java:8470)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
        

Varient 3

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
       at androidx.media3.common.util.Assertions.checkNotNull(Assertions.java)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.syncTasks(DownloadManager.java:970)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.initialize(DownloadManager.java:805)
       at androidx.media3.exoplayer.offline.DownloadManager$InternalHandler.handleMessage(DownloadManager.java:726)
       at android.os.Handler.dispatchMessage(Handler.java:110)
       at android.os.Looper.dispatchMessage(Looper.java:315)
       at android.os.Looper.loopOnce(Looper.java:251)
       at android.os.Looper.loop(Looper.java:349)
       at android.os.HandlerThread.run(HandlerThread.java:100)

amitabesit avatar Oct 31 '25 07:10 amitabesit

I also got this error in firebase:

          Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
       at androidx.media3.common.util.Assertions.checkNotNull(Assertions.java:155)
       at androidx.media3.session.MediaSessionImpl.resolveControllerInfoForCallback(MediaSessionImpl.java:1019)
       at androidx.media3.session.MediaSessionImpl.onPlayerInteractionFinishedOnHandler(MediaSessionImpl.java:954)
       at androidx.media3.session.MediaSessionLegacyStub.lambda$dispatchSessionTaskWithPlayerCommand$21(MediaSessionLegacyStub.java:919)
       at androidx.media3.common.util.Util.postOrRun(Util.java:802)
       at androidx.media3.session.MediaSessionLegacyStub.dispatchSessionTaskWithPlayerCommand(MediaSessionLegacyStub.java:864)
       at androidx.media3.session.MediaSessionLegacyStub.onStop(MediaSessionLegacyStub.java:645)
       at androidx.media3.session.legacy.MediaSessionCompat$Callback$MediaSessionCallbackApi21.onStop(MediaSessionCompat.java:1279)
       at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1636)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loopOnce(Looper.java:257)
       at android.os.Looper.loop(Looper.java:342)
       at android.app.ActivityThread.main(ActivityThread.java:9634)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:619)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)

mbpictures avatar Nov 14 '25 10:11 mbpictures