react-native-svg icon indicating copy to clipboard operation
react-native-svg copied to clipboard

isRecycled() on a null object reference

Open benawad opened this issue 10 months ago • 13 comments
trafficstars

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

benawad avatar Jan 13 '25 14:01 benawad

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?

github-actions[bot] avatar Jan 13 '25 14:01 github-actions[bot]

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).

tmgsca avatar Jan 17 '25 15:01 tmgsca

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?

maximzhemerenko avatar Jan 17 '25 16:01 maximzhemerenko

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.

jakex7 avatar Jan 20 '25 11:01 jakex7

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)

brenodt avatar Jan 21 '25 11:01 brenodt

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);
    }
  }

benawad avatar Jan 25 '25 17:01 benawad

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

maximzhemerenko avatar Jan 25 '25 18:01 maximzhemerenko

@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);
    }

benawad avatar Jan 25 '25 18:01 benawad

We released app and don't see new crashes after this fix https://github.com/software-mansion/react-native-svg/issues/2609#issuecomment-2614056996

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

maximzhemerenko avatar Feb 10 '25 15:02 maximzhemerenko

It's been working for me too

benawad avatar Feb 10 '25 19:02 benawad

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)

OmalPerera avatar Feb 18 '25 04:02 OmalPerera

Hi @jakex7, can you look into patch from @benawad: https://github.com/software-mansion/react-native-svg/issues/2609#issuecomment-2614056996 It seems to resolve the issue.

lorenc-tomasz avatar Mar 28 '25 12:03 lorenc-tomasz

The above mentioned patch worked for me, Thanks @benawad https://github.com/software-mansion/react-native-svg/issues/2609#issuecomment-2614056996

narender2031 avatar Aug 19 '25 05:08 narender2031

Hi, I appreciate your help in resolving this issue. Since the fix has been merged and a new version will be released shortly, I'm closing the issue.

jakex7 avatar Sep 02 '25 10:09 jakex7

Fixed in #2694

jakex7 avatar Sep 02 '25 10:09 jakex7