react-native-svg
react-native-svg copied to clipboard
isRecycled() on a null object reference
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
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?
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).
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?
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.
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)
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);
}
}
I also analysed this code, I can only guess that Bitmap.createBitmap returns null on some devices/OS, but it is only assumption
@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);
}
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?
It's been working for me too
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)
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.
The above mentioned patch worked for me, Thanks @benawad https://github.com/software-mansion/react-native-svg/issues/2609#issuecomment-2614056996
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.
Fixed in #2694