accompanist: android.view.View.measure crash when using HorizontalPager after updating to Accompanist 0.19.0 and above

Describe the bug

Started getting android.view.View.measure crashes after updating to Accompanist 0.19.0+ (including 0.21.0-beta) and using a Compose view with HorizontalPager in an Android ConstraintLayout inside NestedScrollView. Everything was working fine on version 0.18.0 and below.

As far as I can tell it’s related to this line in Constraints.kt so tried setting a minimum height andfillMaxWidth() on the Compose view, but it didn’t help.

Attaching the stack trace

Fatal Exception: java.lang.IllegalArgumentException: Can't represent a size of 2147483520 in Constraints
       at androidx.compose.ui.unit.Constraints$Companion.bitsNeedForSize(Constraints.java:408)
       at androidx.compose.ui.unit.Constraints$Companion.createConstraints-Zbe2FdA$ui_unit_release(Constraints.java:368)
       at androidx.compose.ui.unit.ConstraintsKt.Constraints(ConstraintsKt.java:438)
       at androidx.compose.foundation.layout.SizeModifier.getTargetConstraints-OenEA2s(SizeModifier.java:737)
       at androidx.compose.foundation.layout.SizeModifier.measure-3p2s80s(SizeModifier.java:749)
       at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.java:39)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:100)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:99)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:126)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:88)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.java:76)
       at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.java:99)
       at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.java:71)
       at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.java:1245)
       at androidx.compose.foundation.lazy.layout.LazyLayoutPlaceablesProvider.getAndMeasure-0kLqBqw(LazyLayoutPlaceablesProvider.java:61)
       at androidx.compose.foundation.lazy.LazyMeasuredItemProvider.getAndMeasure-ZjPyQlc(LazyMeasuredItemProvider.java:45)
       at androidx.compose.foundation.lazy.LazyListMeasureKt.measureLazyList-DCyOChk(LazyListMeasureKt.java:140)
       at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.measure-3p2s80s(LazyListKt.java:230)
       at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$2.invoke-0kLqBqw(LazyLayoutKt.java:55)
       at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$2.invoke(LazyLayoutKt.java:44)
       at androidx.compose.ui.layout.SubcomposeLayoutState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayoutState.java:348)
       at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.java:51)
       at androidx.compose.foundation.layout.PaddingValuesModifier.measure-3p2s80s(PaddingValuesModifier.java:417)
       at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.java:39)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(SimpleGraphicsLayerModifier.java:306)
       at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.java:39)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.foundation.layout.FillModifier.measure-3p2s80s(FillModifier.java:658)
       at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.java:39)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:100)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:99)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:126)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:88)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.java:76)
       at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.java:99)
       at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.java:71)
       at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.java:1245)
       at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1.measure-3p2s80s(BoxKt.java:137)
       at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.java:51)
       at androidx.compose.foundation.layout.FillModifier.measure-3p2s80s(FillModifier.java:658)
       at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.java:39)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:100)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:99)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:126)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:88)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.java:76)
       at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.java:99)
       at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.java:71)
       at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.java:1245)
       at androidx.compose.ui.layout.RootMeasurePolicy.measure-3p2s80s(RootMeasurePolicy.java:38)
       at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.java:51)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.java:118)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:100)
       at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.java:99)
       at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.java:1798)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:121)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:88)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.java:76)
       at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.java:99)
       at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.java:1254)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.java:169)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.java:38)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.java:207)
       at androidx.compose.ui.platform.AndroidComposeView.onMeasure(AndroidComposeView.java:606)
       at android.view.View.measure(View.java:25785)
       at androidx.compose.ui.platform.AbstractComposeView.internalOnMeasure$ui_release(AbstractComposeView.java:302)
       at androidx.compose.ui.platform.AbstractComposeView.onMeasure(AbstractComposeView.java:289)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:25785)
       at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:811)
       at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:632)
       at androidx.constraintlayout.core.widgets.analyzer.Direct.horizontalSolvingPass(Direct.java:323)
       at androidx.constraintlayout.core.widgets.analyzer.Direct.solveHorizontalMatchConstraint(Direct.java:709)
       at androidx.constraintlayout.core.widgets.analyzer.Direct.horizontalSolvingPass(Direct.java:375)
       at androidx.constraintlayout.core.widgets.analyzer.Direct.solvingPass(Direct.java:144)
       at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.layout(ConstraintWidgetContainer.java:693)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solveLinearSystem(BasicMeasure.java:160)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:291)
       at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:120)
       at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1594)
       at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1708)
       at android.view.View.measure(View.java:25785)
       at androidx.core.widget.NestedScrollView.measureChildWithMargins(NestedScrollView.java:1656)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at androidx.core.widget.NestedScrollView.onMeasure(NestedScrollView.java:601)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:25785)
       at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:811)
       at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:632)
       at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.layout(ConstraintWidgetContainer.java:733)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solveLinearSystem(BasicMeasure.java:160)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:291)
       at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:120)
       at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1594)
       at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1708)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7043)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at com.android.internal.policy.DecorView.onMeasure(DecorView.java:832)
       at android.view.View.measure(View.java:25785)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3779)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2537)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2799)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2257)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8796)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1140)
       at android.view.Choreographer.doCallbacks(Choreographer.java:962)
       at android.view.Choreographer.doFrame(Choreographer.java:887)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1125)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:263)
       at android.app.ActivityThread.main(ActivityThread.java:8246)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)

To Reproduce

There’s no clear reproducible steps, couldn’t reproduce it myself, but seeing this crash on Crashlytics and happens all the time for some users.

Environment:

  • Accompanist version: [e.g. v0.19.0 and above]

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 7
  • Comments: 22 (2 by maintainers)

Most upvoted comments

Actually, that’s not true, we’ve had a beta out for more than a week with a fair amount of users, too, and that’s also not seeing the issue pop up! 🎉

We are facing the same issue, and can also not reproduce it locally in our production code. What’s interesting to me here is the number 2,147,483,520, which is 127 less than Int.MAX_VALUE (2,147,483,647). Int.MAX_VALUE (rebranded as Infinity in Compose’s Constraints is being guarded against in the code you linked to in your first post:

val heightVal = if (maxHeight == Infinity) minHeight else maxHeight
val heightBits = bitsNeedForSize(heightVal)

val widthVal = if (maxWidth == Infinity) minWidth else maxWidth
val widthBits = bitsNeedForSize(widthVal)

Indeed, playing around with this and giving a maxHeight of Int.MAX_VALUE - 127 leaves me with the same crash and stack trace locally. I don’t, however, have any idea how this happens.

val maxWidth = with(LocalDensity.current) { (Int.MAX_VALUE - 127).toDp() }

LazyRow {
    item {
        Box(Modifier.widthIn(0.dp, maxWidth))
    }
}

produces (as expected):

java.lang.IllegalArgumentException: Can't represent a size of 2147483520 in Constraints
  at androidx.compose.ui.unit.Constraints$Companion.bitsNeedForSize(Constraints.kt:408)
  at androidx.compose.ui.unit.Constraints$Companion.createConstraints-Zbe2FdA$ui_unit_release(Constraints.kt:371)
  at androidx.compose.ui.unit.ConstraintsKt.Constraints(Constraints.kt:438)
  at androidx.compose.foundation.layout.SizeModifier.getTargetConstraints-OenEA2s(Size.kt:706)
  at androidx.compose.foundation.layout.SizeModifier.measure-3p2s80s(Size.kt:718)
  ...

I don’t think anyone here’s been able to reproduce it locally. But we’ll be trying with v0.21.4-beta in our next release, so we’ll see if it stops popping up eventually.

got the same issue here, exactly the same 2147483520, working on this issue at this moment… (2^31 - 1 = Int.MAX_VALUE and 2^7 -1 = 127 -> link?)

@sindrenm couldn’t find a way to repro, we’re using 0.0.18 for the time being until this is fixed