Adamantcheese / Kuroba

Kuroba - imageboard browser for Android
GNU General Public License v3.0
393 stars 29 forks source link

Report: App crashes, suspect due to bitmap/memory overflow #1411

Closed Twinov closed 1 year ago

Twinov commented 1 year ago

I had this intermittently and finally managed to capture a stack trace from Android Studio since the app didn't seem to save any on its own. Most easily reproducible (though still not that easy) by turning on media pre-fetching and possibly lowering the file cache size, but I've had the app crash as well with pre-fetching disabled. Scroll through some threads with a lot of high resolution files and you'll eventually get a crash. Stack trace, I think the first exception is all that matters but I'll put it all here just in case:

2022-11-03 21:05:53.877 17275-17275/com.github.adamantcheese.chan.dev E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.github.adamantcheese.chan.dev, PID: 17275
    java.lang.RuntimeException: Canvas: trying to draw too large(109497240bytes) bitmap.
        at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:266)
        at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:94)
        at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:549)
        at android.widget.ImageView.onDraw(ImageView.java:1442)
        at com.google.android.material.imageview.ShapeableImageView.onDraw(ShapeableImageView.java:198)
        at android.view.View.draw(View.java:22645)
        at com.github.adamantcheese.chan.ui.view.ShapeablePostImageView.draw(ShapeablePostImageView.java:117)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1994)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at androidx.recyclerview.widget.RecyclerView.drawChild(RecyclerView.java:5204)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.draw(View.java:22648)
        at androidx.recyclerview.widget.RecyclerView.draw(RecyclerView.java:4603)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at com.github.adamantcheese.chan.controller.ui.NavigationControllerContainerLayout.dispatchDraw(NavigationControllerContainerLayout.java:253)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.draw(View.java:22648)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at androidx.drawerlayout.widget.DrawerLayout.drawChild(DrawerLayout.java:1478)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.draw(View.java:22648)
        at com.android.internal.policy.DecorView.draw(DecorView.java:820)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:534)
2022-11-03 21:05:53.877 17275-17275/com.github.adamantcheese.chan.dev E/AndroidRuntime:     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:540)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:616)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:4438)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3326)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2143)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8665)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037)
        at android.view.Choreographer.doCallbacks(Choreographer.java:845)
        at android.view.Choreographer.doFrame(Choreographer.java:780)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
2022-11-03 21:05:53.878 17275-17275/com.github.adamantcheese.chan.dev E/Kuroba-dev | UNCAUGHT: Unhandled exception:
    java.lang.RuntimeException: Canvas: trying to draw too large(109497240bytes) bitmap.
        at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:266)
        at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:94)
        at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:549)
        at android.widget.ImageView.onDraw(ImageView.java:1442)
        at com.google.android.material.imageview.ShapeableImageView.onDraw(ShapeableImageView.java:198)
        at android.view.View.draw(View.java:22645)
        at com.github.adamantcheese.chan.ui.view.ShapeablePostImageView.draw(ShapeablePostImageView.java:117)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1994)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at androidx.recyclerview.widget.RecyclerView.drawChild(RecyclerView.java:5204)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.draw(View.java:22648)
        at androidx.recyclerview.widget.RecyclerView.draw(RecyclerView.java:4603)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at com.github.adamantcheese.chan.controller.ui.NavigationControllerContainerLayout.dispatchDraw(NavigationControllerContainerLayout.java:253)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.draw(View.java:22648)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at androidx.drawerlayout.widget.DrawerLayout.drawChild(DrawerLayout.java:1478)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.updateDisplayListIfDirty(View.java:21511)
        at android.view.View.draw(View.java:22376)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
        at android.view.View.draw(View.java:22648)
        at com.android.internal.policy.DecorView.draw(DecorView.java:820)
        at android.view.View.updateDisplayListIfDirty(View.java:21520)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:534)
2022-11-03 21:05:53.878 17275-17275/com.github.adamantcheese.chan.dev E/Kuroba-dev | UNCAUGHT:     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:540)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:616)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:4438)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3326)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2143)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8665)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037)
        at android.view.Choreographer.doCallbacks(Choreographer.java:845)
        at android.view.Choreographer.doFrame(Choreographer.java:780)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Adamantcheese commented 1 year ago

I appreciate the report, I've already fixed this in my current dev environment, and you're correct it's caused by large images with prefetching on; my image loader, as a consequence of being shit, doesn't resize images to the actual size of their container before displaying them, so you get this crash as a result.