material-components-android icon indicating copy to clipboard operation
material-components-android copied to clipboard

[MaterialTextView] ANR with initlization

Open raghav2945 opened this issue 3 years ago • 0 comments
trafficstars

Description: We've been using an extended version of MaterialTextView named it as AMCustomFontTextView. We are receiving a lot of ANR when using it. The constructor of MaterialTextView is where the stack points. It hangs there all the time. Sharing the Firebase captured stack-trace:

main (native): tid=1 systid=7111 
#00 pc 0x60cf4 libc.so 
#01 pc 0x1286f3 libart.so 
#02 pc 0x2e2279 libart.so 
#03 pc 0xc9561 libandroid_runtime.so 
       at android.content.res.AssetManager.nativeApplyStyle(AssetManager.java)
       at android.content.res.AssetManager.applyStyle(AssetManager.java:1169)
       at android.content.res.ResourcesImpl$ThemeImpl.obtainStyledAttributes(ResourcesImpl.java:1636)
       at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java:1763)
       at android.content.Context.obtainStyledAttributes(Context.java:803)
       at com.google.android.material.theme.overlay.MaterialThemeOverlay.obtainMaterialThemeOverlayId(MaterialThemeOverlay.java:113)
       at com.google.android.material.theme.overlay.MaterialThemeOverlay.wrap(MaterialThemeOverlay.java:67)
       at com.google.android.material.textview.MaterialTextView.<init>(MaterialTextView.java:93)
       at com.google.android.material.textview.MaterialTextView.<init>(MaterialTextView.java:88)
       at com.google.android.material.textview.MaterialTextView.<init>(MaterialTextView.java:83)
       at com.audiomack.views.AMCustomFontTextView.<init>(AMCustomFontTextView.kt:24)
       at java.lang.reflect.Constructor.newInstance0(Constructor.java)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
       at android.view.LayoutInflater.createView(LayoutInflater.java:852)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1004)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1121)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1124)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:680)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
       at com.xwray.groupie.GroupAdapter.onCreateViewHolder(GroupAdapter.java:221)
       at com.xwray.groupie.GroupAdapter.onCreateViewHolder(GroupAdapter.java:20)
       at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7295)
       at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6416)
       at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300)
       at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296)
       at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330)
       at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631)
       at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
       at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
       at com.audiomack.utils.groupie.sticky.StickyHeadersLinearLayoutManager.onLayoutChildren(StickyHeadersLinearLayoutManager.kt:136)
       at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
       at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4012)
       at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)
       at android.view.View.layout(View.java:24475)
       at android.view.ViewGroup.layout(ViewGroup.java:7383)
       at androidx.swiperefreshlayout.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:625)
       at android.view.View.layout(View.java:24475)
       at android.view.ViewGroup.layout(ViewGroup.java:7383)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
       at android.view.View.layout(View.java:24475)
       at android.view.ViewGroup.layout(ViewGroup.java:7383)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
       at android.view.View.layout(View.java:24475)
       at android.view.ViewGroup.layout(ViewGroup.java:7383)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
       at android.view.View.layout(View.java:24475)
       at android.view.ViewGroup.layout(ViewGroup.java:7383)
       at androidx.recyclerview.widget.RecyclerView$LayoutManager.layoutDecoratedWithMargins(RecyclerView.java:9878)
       at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1689)
       at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
       at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
       at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
       at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3686)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewGroup.measureChild(ViewGroup.java:7922)
       at androidx.viewpager2.widget.ViewPager2.onMeasure(ViewPager2.java:498)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:27131)
       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:374)
       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:27131)
       at androidx.core.widget.NestedScrollView.measureChildWithMargins(NestedScrollView.java:1695)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at androidx.core.widget.NestedScrollView.onMeasure(NestedScrollView.java:604)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:760)
       at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:833)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:27131)
       at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:811)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:466)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:278)
       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:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       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:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       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:27131)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
       at com.android.internal.policy.DecorView.onMeasure(DecorView.java:1175)
       at android.view.View.measure(View.java:27131)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:4187)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2936)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3204)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2618)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9971)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1010)
       at android.view.Choreographer.doCallbacks(Choreographer.java:809)
       at android.view.Choreographer.doFrame(Choreographer.java:744)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:995)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8633)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

Expected behavior: no ANR

Source code:

open class AMCustomFontTextView : MaterialTextView {

    private var customLetterspacing: Float = 0.toFloat()

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
        context,
        attrs,
        defStyle
    ) {
        init(attrs)
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init(attrs)
    }

    constructor(context: Context) : super(context)

Minimal sample app repro:

It's reproducible with all version of our application: https://play.google.com/store/search?q=audiomack&c=apps&hl=en&gl=US

<com.audiomack.views.AMCustomFontTextView
                android:id="@+id/playerActionBtnBadge"
                android:layout_width="16dp"
                android:layout_height="16dp"
                android:layout_gravity="end|top"
                android:background="@drawable/count_yellow"
                android:fontFamily="@font/opensans_bold"
                android:gravity="center"
                android:includeFontPadding="false"
                android:textColor="#ffffff"
                android:textSize="9sp"
                android:visibility="gone"
                tools:ignore="SmallSp"
                tools:text="12"
                tools:visibility="visible" />

Android API version: Android 11, 10, 8, 12

Material Library version: com.google.android.material:material:1.6.1

Device: Device on which the bug was encountered here

  1. Samsung Galaxy A11
  2. Tecno F1
  3. Itel SP591
  4. Motorola moto g Pure

raghav2945 avatar Aug 29 '22 06:08 raghav2945