ReadYouApp / ReadYouApp/ReadYou
Crash after fresh install when importing OPML file: Canvas trying to draw too large bitmap
Nobody has claimed this yet.
- 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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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