Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

isRecycled() on a null object reference #2609

Open
benawad opened this issue Jan 13, 2025 · 11 comments
Open

isRecycled() on a null object reference #2609

benawad opened this issue Jan 13, 2025 · 11 comments
Labels
Missing repro This issue need minimum repro scenario

Comments

@benawad
Copy link

benawad commented Jan 13, 2025

Description

I have some users that get this crash report. (Only happens on Android 10)

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
    at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:65)
    at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:113)
    at android.graphics.Canvas.drawBitmap(Canvas.java:1560)
    at com.horcrux.svg.B.r(SourceFile:252)
    at com.horcrux.svg.B.draw(SourceFile:7)
    at com.horcrux.svg.RenderableView.render(SourceFile:44)
    at com.horcrux.svg.B.r(SourceFile:152)
    at com.horcrux.svg.B.draw(SourceFile:7)
    at com.horcrux.svg.RenderableView.render(SourceFile:44)
    at com.horcrux.svg.SvgView.drawChildren(SourceFile:149)
    at com.horcrux.svg.SvgView.drawOutput(SourceFile:69)
    at com.horcrux.svg.SvgView.onDraw(SourceFile:17)
    at android.view.View.draw(View.java:21618)
    at com.facebook.react.views.view.j.draw(SourceFile:60)
    at android.view.View.updateDisplayListIfDirty(View.java:20483)
    at android.view.View.draw(View.java:21350)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4446)
    at com.facebook.react.views.view.j.drawChild(SourceFile:86)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4205)
    at com.facebook.react.views.view.j.dispatchDraw(SourceFile:24)
    at android.view.View.draw(View.java:21621)
    at com.facebook.react.views.view.j.draw(SourceFile:60)
    at android.view.View.updateDisplayListIfDirty(View.java:20483)
    at android.view.View.draw(View.java:21350)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4446)
    at com.facebook.react.views.view.j.drawChild(SourceFile:86)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4205)
    at com.facebook.react.views.view.j.dispatchDraw(SourceFile:24)
    at android.view.View.draw(View.java:21621)
    at com.facebook.react.views.view.j.draw(SourceFile:60)
    at android.view.View.updateDisplayListIfDirty(View.java:20483)
    at android.view.View.draw(View.java:21350)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4446)
    at com.facebook.react.views.view.j.drawChild(SourceFile:86)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4205)
    at com.facebook.react.views.view.j.dispatchDraw(SourceFile:24)
    at android.view.View.updateDisplayListIfDirty(View.java:20474)
    at android.view.View.draw(View.java:21350)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4446)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4205)
    at android.view.View.draw(View.java:21621)
    at android.widget.ScrollView.draw(ScrollView.java:1869)
    at com.facebook.react.views.scroll.c.draw(SourceFile:48)
    at android.view.View.updateDisplayListIfDirty(View.java:20483)
    at android.view.View.draw(View.java:21350)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4446)
    at com.facebook.react.views.view.j.drawChild(SourceFile:86)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4205)
    at com.facebook.react.views.view.j.dispatchDraw(SourceFile:24)
    at android.view.View.draw(View.java:21621)
    at com.facebook.react.views.view.j.draw(SourceFile:60)
    at android.view.View.updateDisplayListIfDirty(View.java:20483)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4428)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4401)
    at android.view.View.updateDisplayListIfDirty(View.java:20441)
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:584)
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:590)
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:668)
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:3840)
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3648)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2954)

Steps to reproduce

I haven't been able to figure out how to recreate this, but I haven't seen anyone report a crash related to Bitmap.isRecycled() and thought you might have some insight where this could come from.

Snack or a link to a repository

n/a

SVG version

15.10.1

React Native version

0.76.5

Platforms

Android

JavaScript runtime

Hermes

Workflow

Expo Dev Client

Architecture

Paper (Old Architecture)

Build type

Release app & production bundle

Device

Real device

Device model

MAR-LX1A, SM-A207M, CPH1877

Acknowledgements

Yes

@github-actions github-actions bot added the Missing repro This issue need minimum repro scenario label Jan 13, 2025
Copy link

Hey! 👋

The issue doesn't seem to contain a minimal reproduction.

Could you provide a snack or a link to a GitHub repository under your username that reproduces the problem?

@tmgsca
Copy link

tmgsca commented Jan 17, 2025

We're seeing this happen on our end too. No repro steps either unfortunately. Also can confirm that the overwhelming majority is on Android 10 (99.8% of occurrences).

@maximzhemerenko
Copy link

maximzhemerenko commented Jan 17, 2025

I see this crash in my application too
I analysed the code and have potential assumption that function Bitmap.createBitmap returns null in same cases at Android 10, 9 and 8? (android/src/main/java/com/horcrux/svg/GroupView.java line 101 or 106)

What are you thinking about this though?

@jakex7
Copy link
Member

jakex7 commented Jan 20, 2025

Hey, thanks for bringing up that issue. It’s definitely concerning, but I’m unable to reproduce it or guess the root cause, especially since the stack trace is obscured (e.g., SourceFile:252 instead of the actual filename). If anyone has a full stack trace without the renamesourcefileattribute, that would be very helpful.

@brenodt
Copy link

brenodt commented Jan 21, 2025

Hi @jakex7 , hope this helps:

          Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
       at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:65)
       at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:113)
       at android.graphics.Canvas.drawBitmap(Canvas.java:1578)
       at com.horcrux.svg.GroupView.drawGroup(GroupView.java:168)
       at com.horcrux.svg.GroupView.draw(GroupView.java:88)
       at com.horcrux.svg.RenderableView.render(RenderableView.java:487)
       at com.horcrux.svg.SvgView.drawChildren(SvgView.java:336)
       at com.horcrux.svg.SvgView.drawOutput(SvgView.java:282)
       at com.horcrux.svg.SvgView.onDraw(SvgView.java:135)
       at android.view.View.draw(View.java:21999)
       at android.view.View.updateDisplayListIfDirty(View.java:20859)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.draw(View.java:22002)
       at android.view.View.updateDisplayListIfDirty(View.java:20859)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at android.view.View.draw(View.java:22002)
       at android.widget.ScrollView.draw(ScrollView.java:2019)
       at com.facebook.react.views.scroll.ReactScrollView.draw(ReactScrollView.java:638)
       at android.view.View.updateDisplayListIfDirty(View.java:20859)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.draw(View.java:22002)
       at android.view.View.updateDisplayListIfDirty(View.java:20859)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.draw(View.java:22002)
       at android.view.View.updateDisplayListIfDirty(View.java:20859)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.draw(View.java:22002)
       at android.view.View.updateDisplayListIfDirty(View.java:20859)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:867)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:840)
       at android.view.View.draw(View.java:22002)
       at android.view.View.updateDisplayListIfDirty(View.java:20859)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.View.draw(View.java:21726)
       at android.view.ViewGroup.drawChild(ViewGroup.java:4639)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4386)
       at android.view.View.updateDisplayListIfDirty(View.java:20850)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4621)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4594)
       at android.view.View.updateDisplayListIfDirty(View.java:20817)
       at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:583)
       at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:589)
       at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:667)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:4317)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4125)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3385)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2166)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8887)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1280)
       at android.view.Choreographer.doCallbacks(Choreographer.java:1019)
       at android.view.Choreographer.doFrame(Choreographer.java:911)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1248)
       at android.os.Handler.handleCallback(Handler.java:900)
       at android.os.Handler.dispatchMessage(Handler.java:103)
       at android.os.Looper.loop(Looper.java:219)
       at android.app.ActivityThread.main(ActivityThread.java:8668)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)

@benawad
Copy link
Author

benawad commented Jan 25, 2025

Looking at the internal code for react-native-svg, I'm not sure how it becomes null. There is a null check at the top for mLayerBitmap

void drawGroup(final Canvas canvas, final Paint paint, final float opacity) {
    if (mOpacity != 1) {

      if (mLayerBitmap == null) {
        mLayerBitmap =
            Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
        mLayerCanvas = new Canvas(mLayerBitmap);
      } else {
        mLayerBitmap.recycle();
        mLayerBitmap =
            Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
        mLayerCanvas.setBitmap(mLayerBitmap);
      }
      // Copy current matrix from original canvas
      mLayerCanvas.save();
      mLayerCanvas.setMatrix(canvas.getMatrix());
    } else {
      mLayerCanvas = canvas;
    }

    // ...

    if (mOpacity != 1) {
      // Restore copied canvas and temporary reset original canvas matrix to draw bitmap 1:1
      mLayerCanvas.restore();
      int saveCount = canvas.save();
      canvas.setMatrix(null);
      mLayerPaint.setAlpha((int) (mOpacity * 255));
      // crash
      canvas.drawBitmap(mLayerBitmap, 0, 0, mLayerPaint);
      canvas.restoreToCount(saveCount);
    }
  }

@maximzhemerenko
Copy link

I also analysed this code, I can only guess that Bitmap.createBitmap returns null on some devices/OS, but it is only assumption

@benawad
Copy link
Author

benawad commented Jan 25, 2025

@maximzhemerenko I didn't see your earlier comment, but that could explain it. Nice idea. I will try a patch that does a 2nd null check

  if (mOpacity != 1 && mLayerBitmap != null) {
      // Restore copied canvas and temporary reset original canvas matrix to draw bitmap 1:1
      mLayerCanvas.restore();
      int saveCount = canvas.save();
      canvas.setMatrix(null);
      mLayerPaint.setAlpha((int) (mOpacity * 255));
      // crash
      canvas.drawBitmap(mLayerBitmap, 0, 0, mLayerPaint);
      canvas.restoreToCount(saveCount);
    }

@maximzhemerenko
Copy link

We released app and don't see new crashes after this fix #2609 (comment)

who can confirm that this fix works on their app too?

@benawad
Copy link
Author

benawad commented Feb 10, 2025

It's been working for me too

@OmalPerera
Copy link

OmalPerera commented Feb 18, 2025

I encountered this issue in my React Native app and attempted to reproduce it on a similar device, but was unsuccessful.

only on Android and was not observed on Android 11 or higher in my app

Affected models
HUAWEI HWAGS2 - Android 8.0 (SDK 26)
Xiaomi beryllium - Android 10 (SDK 29)

React-native version
0.73.9

react-native-svg
15.10.1

Exception com.facebook.react.uimanager.m: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
  at com.facebook.react.ReactRootView.handleException (ReactRootView.java:804)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:846)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)
  at android.view.View.draw (View.java:21550)
  at android.view.View.updateDisplayListIfDirty (View.java:20416)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)
  at android.view.View.draw (View.java:21550)
  at android.view.View.updateDisplayListIfDirty (View.java:20416)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at android.view.View.draw (View.java:21550)
  at android.widget.ScrollView.draw (ScrollView.java:1835)
  at com.facebook.react.views.scroll.ReactScrollView.draw (ReactScrollView.java:638)
  at android.view.View.updateDisplayListIfDirty (View.java:20416)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)
  at android.view.View.draw (View.java:21550)
  at android.view.View.updateDisplayListIfDirty (View.java:20416)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at androidx.coordinatorlayout.widget.CoordinatorLayout.drawChild (CoordinatorLayout.java:1312)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.swmansion.rnscreens.ScreenStack.performDraw (ScreenStack.kt:315)
  at com.swmansion.rnscreens.ScreenStack.access$performDraw (ScreenStack.kt)
  at com.swmansion.rnscreens.ScreenStack$DrawingOp.draw (ScreenStack.kt:327)
  at com.swmansion.rnscreens.ScreenStack.drawAndRelease (ScreenStack.kt:282)
  at com.swmansion.rnscreens.ScreenStack.dispatchDraw (ScreenStack.kt:298)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)
  at android.view.View.draw (View.java:21550)
  at android.view.View.updateDisplayListIfDirty (View.java:20416)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.swmansion.rnscreens.ScreenStack.performDraw (ScreenStack.kt:315)
  at com.swmansion.rnscreens.ScreenStack.access$performDraw (ScreenStack.kt)
  at com.swmansion.rnscreens.ScreenStack$DrawingOp.draw (ScreenStack.kt:327)
  at com.swmansion.rnscreens.ScreenStack.drawAndRelease (ScreenStack.kt:282)
  at com.swmansion.rnscreens.ScreenStack.dispatchDraw (ScreenStack.kt:298)
  at android.view.View.updateDisplayListIfDirty (View.java:20407)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4401)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4374)
  at android.view.View.updateDisplayListIfDirty (View.java:20376)
  at android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:575)
  at android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:581)
  at android.view.ThreadedRenderer.draw (ThreadedRenderer.java:654)
  at android.view.ViewRootImpl.draw (ViewRootImpl.java:3736)
  at android.view.ViewRootImpl.performDraw (ViewRootImpl.java:3531)
  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2868)
  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1819)
  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7783)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1058)
  at android.view.Choreographer.doCallbacks (Choreographer.java:865)
  at android.view.Choreographer.doFrame (Choreographer.java:800)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1043)
  at android.os.Handler.handleCallback (Handler.java:883)
  at android.os.Handler.dispatchMessage (Handler.java:100)
  at android.os.Looper.loop (Looper.java:224)
  at android.app.ActivityThread.main (ActivityThread.java:7562)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:539)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:950)
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
  at android.graphics.BaseCanvas.throwIfCannotDraw (BaseCanvas.java:65)
  at android.graphics.MiuiCanvas.throwIfCannotDraw (MiuiCanvas.java:329)
  at android.graphics.BaseCanvas.drawBitmap (BaseCanvas.java:113)
  at android.graphics.MiuiCanvas.drawBitmap (MiuiCanvas.java:98)
  at android.graphics.Canvas.drawBitmap (Canvas.java:1553)
  at com.horcrux.svg.GroupView.drawGroup (GroupView.java:168)
  at com.horcrux.svg.GroupView.draw (GroupView.java:88)
  at com.horcrux.svg.RenderableView.render (RenderableView.java:487)
  at com.horcrux.svg.SvgView.drawChildren (SvgView.java:336)
  at com.horcrux.svg.SvgView.drawOutput (SvgView.java:282)
  at com.horcrux.svg.SvgView.onDraw (SvgView.java:135)
  at android.view.View.draw (View.java:21547)
  at android.view.View.updateDisplayListIfDirty (View.java:20416)
  at android.view.View.draw (View.java:21276)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4417)
  at com.facebook.react.views.view.ReactViewGroup.drawChild (ReactViewGroup.java:867)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4177)
  at com.facebook.react.views.view.ReactViewGroup.dispatchDraw (ReactViewGroup.java:840)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Missing repro This issue need minimum repro scenario
Projects
None yet
Development

No branches or pull requests

6 participants