ReadYouApp / ReadYouApp/ReadYou

Crash after fresh install when importing OPML file: Canvas trying to draw too large bitmap

Open
#953 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Kotlin
Stars
7.5k
Forks
330
PR merge metrics
No merged PRs in 30d

Description

1. Environment

2. Describe the bug

After installing Read You (v0.11.1), I tried importing an OPML file exported from Fluent Reader on my PC. The app crashed immediately, throwing a java.lang.RuntimeException due to the Canvas attempting to draw a bitmap that’s too large (140935168 bytes). This happened right after a fresh install, and the file works fine in other apps.

3. Stack Trace

java.lang.RuntimeException: Canvas: trying to draw too large(140935168bytes) bitmap.
	at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:266)
	at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:97)
	at androidx.compose.ui.graphics.AndroidCanvas.drawImageRect-HPBpro0(AndroidCanvas.android.kt:93)
	at androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawImage-AZ2fEMs(CanvasDrawScope.kt:34)
	at androidx.compose.ui.node.LayoutNodeDrawScope.drawImage-AZ2fEMs(LayoutNodeDrawScope.kt:25)
	at androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-AZ2fEMs$default(DrawScope.kt:103)
	at androidx.compose.ui.graphics.painter.BitmapPainter.onDraw(BitmapPainter.kt:51)
	at androidx.compose.ui.graphics.painter.Painter.draw-x_KDEd0(Painter.kt:123)
	at coil.compose.CrossfadePainter.drawPainter(CrossfadePainter.kt:127)
	at coil.compose.CrossfadePainter.onDraw(CrossfadePainter.kt:80)
	at androidx.compose.ui.graphics.painter.Painter.draw-x_KDEd0(Painter.kt:123)
	at coil.compose.AsyncImagePainter.onDraw(AsyncImagePainter.kt:46)
	at androidx.compose.ui.graphics.painter.Painter.draw-x_KDEd0(Painter.kt:123)
	at androidx.compose.ui.draw.PainterNode.draw(PainterModifier.kt:182)
	at androidx.compose.ui.node.LayoutNodeDrawScope.drawDirect-eZhPAX0$ui_release(LayoutNodeDrawScope.kt:50)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:53)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:28)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:6)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:9)
	at androidx.compose.ui.node.NodeCoordinator$drawBlock$1$1.invoke(NodeCoordinator.kt:9)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:114)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:48)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:136)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:3)
	at androidx.compose.ui.node.NodeCoordinator$drawBlock$1.invoke(NodeCoordinator.kt:32)
	at androidx.compose.ui.platform.GraphicsLayerOwnerLayer$recordLambda$1.invoke(GraphicsLayerOwnerLayer.android.kt:23)
	at androidx.compose.ui.graphics.layer.GraphicsLayerV29.record(GraphicsLayerV29.android.kt:35)
	at androidx.compose.ui.graphics.layer.GraphicsLayer.recordInternal(AndroidGraphicsLayer.android.kt:44)
	at androidx.compose.ui.platform.GraphicsLayerOwnerLayer.updateDisplayList(GraphicsLayerOwnerLayer.android.kt:137)
	at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:100)
	at android.view.View.draw(View.java:23901)
	at android.view.View.updateDisplayListIfDirty(View.java:22767)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
	at android.view.View.updateDisplayListIfDirty(View.java:22714)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
	at android.view.View.updateDisplayListIfDirty(View.java:22714)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
	at android.view.View.updateDisplayListIfDirty(View.java:22714)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
	at android.view.View.updateDisplayListIfDirty(View.java:22714)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
	at android.view.View.updateDisplayListIfDirty(View.java:22714)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
	at android.view.View.updateDisplayListIfDirty(View.java:22714)
	at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:602)
	at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:608)
	at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:684)
	at android.view.ViewRootImpl.draw(ViewRootImpl.java:5440)
	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:5148)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4212)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2919)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10491)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1108)
	at android.view.Choreographer.doCallbacks(Choreographer.java:866)
	at android.view.Choreographer.doFrame(Choreographer.java:797)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1092)
	at android.os.Handler.handleCallback(Handler.java:938)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:226)
	at android.os.Looper.loop(Looper.java:313)
	at android.app.ActivityThread.main(ActivityThread.java:8669)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the crash by importing the Fluent Reader OPML file on Android 12 after a fresh install, then trace the import flow to the image rendering path shown in the stack trace, including Coil's AsyncImagePainter and Compose canvas drawing. Done means the OPML import completes without the oversized-bitmap crash on the reported versions and device conditions.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin
Domain
mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.