Issue in Android 5.1 with View Binding

Hi, we are having some issues with the player in Android 5.1

We can reproduce this on Emulator with Android 5.1, we are integrating view binding and the app is crashing.

Here is the stacktrace

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.riivi.riivi/com.riivi.riivi.ui.player.PlayerActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class com.bitmovin.player.PlayerView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
        at android.app.ActivityThread.access$800(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class com.bitmovin.player.PlayerView
        at android.view.LayoutInflater.createView(LayoutInflater.java:633)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
        at com.riivi.riivi.databinding.ActivityPlayerBinding.inflate(ActivityPlayerBinding.java:153)
        at com.riivi.riivi.databinding.ActivityPlayerBinding.inflate(ActivityPlayerBinding.java:147)
        at com.riivi.riivi.ui.player.PlayerActivity.onCreate(PlayerActivity.kt:130)
        at android.app.Activity.performCreate(Activity.java:5990)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
        at android.app.ActivityThread.access$800(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
        at android.view.LayoutInflater.createView(LayoutInflater.java:607)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
        at com.riivi.riivi.databinding.ActivityPlayerBinding.inflate(ActivityPlayerBinding.java:153) 
        at com.riivi.riivi.databinding.ActivityPlayerBinding.inflate(ActivityPlayerBinding.java:147) 
        at com.riivi.riivi.ui.player.PlayerActivity.onCreate(PlayerActivity.kt:130) 
        at android.app.Activity.performCreate(Activity.java:5990) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
        at android.app.ActivityThread.access$800(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
     Caused by: java.lang.NoClassDefFoundError: com.google.android.exoplayer2.ExoPlayer$Builder$$ExternalSyntheticLambda7
        at com.google.android.exoplayer2.ExoPlayer$Builder.<init>(ExoPlayer.java:458)
        at com.google.android.exoplayer2.SimpleExoPlayer$Builder.<init>(SimpleExoPlayer.java:75)
        at com.bitmovin.player.s1.r.a(SourceFile:7)
        at com.bitmovin.player.v.e.<init>(SourceFile:82)
        at com.bitmovin.player.v.f.a(SourceFile:3)
        at com.bitmovin.player.v.f.a(SourceFile:1)
        at com.bitmovin.player.v.f.get(SourceFile:1)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at com.bitmovin.player.a.d.a(SourceFile:1)
        at com.bitmovin.player.a.d.get(SourceFile:1)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at com.bitmovin.player.r.d.getPlayer(SourceFile:1)
        at com.bitmovin.player.a.c.a(SourceFile:87)
        at com.bitmovin.player.a.c.a(SourceFile:55)
        at com.bitmovin.player.api.Player$Companion.create(SourceFile:1)
        at com.bitmovin.player.PlayerView.<init>(SourceFile:690)
        at com.bitmovin.player.PlayerView.<init>(SourceFile:342)
        at java.lang.reflect.Constructor.newInstance(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
        at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
        at com.riivi.riivi.databinding.ActivityPlayerBinding.inflate(ActivityPlayerBinding.java:153) 
        at com.riivi.riivi.databinding.ActivityPlayerBinding.inflate(ActivityPlayerBinding.java:147) 
        at com.riivi.riivi.ui.player.PlayerActivity.onCreate(PlayerActivity.kt:130) 
        at android.app.Activity.performCreate(Activity.java:5990) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
        at android.app.ActivityThread.access$800(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
2022-09-30 10:13:35.249 3934-4004/com.riivi.riivi D/EGL_emulation: eglMakeCurrent: 0x72bad25ba0: ver 2 0 (tinfo 0x72baf65b00)

Here is the XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/parentPlayer"
    android:animateLayoutChanges="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.bitmovin.player.PlayerView
        android:id="@+id/bitmovinPlayerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </com.bitmovin.player.PlayerView>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent">

        <RelativeLayout
            android:layout_width="400dp"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:background="@android:color/transparent"
            android:id="@+id/playerContainer">


        </RelativeLayout>

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/playerUI"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:animateLayoutChanges="true"
        android:focusable="true">

        <ImageButton
            android:id="@+id/playButton"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_centerInParent="true"
            android:background="@android:color/transparent"
            android:contentDescription="@null"
            android:foreground="@drawable/ripple_button_player"
            android:insetLeft="0dp"
            android:insetTop="0dp"
            android:insetRight="0dp"
            android:insetBottom="0dp"
            android:src="@drawable/ic_play_button" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/buttonBack"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:insetLeft="0dp"
            android:insetTop="0dp"
            android:insetRight="0dp"
            android:insetBottom="0dp"
            app:backgroundTint="@android:color/transparent"
            app:cornerRadius="25dp"
            app:icon="@drawable/ic_button_back"
            app:iconGravity="textStart"
            app:iconPadding="0dp"
            app:iconSize="50dp"
            app:iconTint="@android:color/white"
            app:rippleColor="@color/brand_primary_opacity_input" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/buttonToStart"
            style="@style/Widget.MaterialComponents.Button.TextButton.Icon"
            android:layout_width="186dp"
            android:layout_height="52dp"
            android:layout_marginStart="21dp"
            android:layout_marginTop="8dp"
            android:layout_toEndOf="@+id/buttonBack"
            android:contentDescription="@null"
            android:text="@string/fromBeginning"
            android:textAllCaps="false"
            android:textColor="@android:color/white"
            android:textSize="14sp"
            android:visibility="gone"
            app:backgroundTint="#14FFFFFF"
            app:cornerRadius="21dp"
            app:icon="@drawable/ic_goback"
            app:iconSize="14dp"
            app:iconTint="@android:color/white"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:rippleColor="@color/brand_primary_opacity_input"
            app:shapeAppearance="@style/fromBeginning"
            tools:visibility="visible" />

        <ImageView
            android:id="@+id/riiviLogo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_marginTop="12dp"
            android:layout_marginEnd="16dp"
            android:src="@drawable/ic_riivi_logo_player" />

        <TextView
            android:id="@+id/playerTitle"
            style="@style/PlayerTitle"
            android:layout_width="wrap_content"
            android:layout_height="28dp"
            android:layout_above="@+id/playerSerieTitle"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:gravity="center_vertical|start"
            tools:text="Título de Contenido" />

        <TextView
            android:id="@+id/playerSerieTitle"
            style="@style/PlayerSerieTitle"
            android:layout_width="wrap_content"
            android:layout_height="24dp"
            android:gravity="center_vertical|start"
            android:layout_above="@+id/playerControl"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:text=""
            android:visibility="gone"
            tools:text="Título de Contenido" />

        <com.google.android.material.card.MaterialCardView
            android:id="@+id/buttonNextEp"
            style="@null"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/playerControl"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="16dp"
            android:clickable="true"
            android:focusable="true"
            android:visibility="gone"
            android:layout_marginTop="6dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="0dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:visibility="visible">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/selector_button_next_ep">

                <FrameLayout
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:background="@android:color/transparent"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintTop_toTopOf="parent">

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:background="@android:color/transparent">

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:fontFamily="@font/poppins_semibold"
                            android:gravity="center"
                            android:padding="6dp"
                            android:background="@android:color/transparent"
                            android:layout_marginTop="4dp"
                            android:layout_marginBottom="4dp"
                            android:layout_marginStart="8dp"
                            android:text="@string/btnNextEpisode"
                            android:textColor="@android:color/white"
                            android:textSize="16sp"
                            android:textStyle="bold" />

                        <ImageView
                            android:layout_width="20dp"
                            android:layout_height="20dp"
                            android:layout_gravity="center_vertical"
                            android:layout_marginStart="8dp"
                            android:layout_marginEnd="8dp"
                            android:background="@drawable/ic_play_margin_left" />
                    </LinearLayout>

                </FrameLayout>
            </androidx.constraintlayout.widget.ConstraintLayout>

        </com.google.android.material.card.MaterialCardView>

        <RelativeLayout
            android:id="@+id/thumbnail"
            android:layout_above="@+id/playerControl"
            android:layout_width="102dp"
            android:layout_height="62dp"
            android:visibility="invisible"
            android:background="@drawable/thumbnail_frame">

            <ImageView
                android:id="@+id/thumbnailImg"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerInParent="true"
                android:layout_margin="2dp"
                android:scaleType="centerCrop" />
        </RelativeLayout>

        <LinearLayout
            android:id="@+id/playerControl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:layout_marginTop="8dp"
            android:gravity="center_horizontal"
            android:orientation="vertical"
            android:layout_alignParentBottom="true">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/positionView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="14sp"
                    android:textStyle="bold"
                    android:paddingStart="16dp"
                    android:paddingEnd="4dp"
                    android:includeFontPadding="false"
                    android:textColor="@android:color/white"
                    android:text="00:00" />

                <SeekBar
                    android:id="@+id/seekbar"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="14dp"
                    android:paddingTop="5dp"
                    android:paddingBottom="5dp"
                    android:background="@android:color/transparent"
                    android:thumb="@drawable/ic_thumb"
                    android:progressDrawable="@drawable/gradient_player_seekbar"
                    tools:progress="30"
                    tools:secondaryProgress="40"/>

                <TextView
                    android:id="@+id/durationView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="14sp"
                    android:textStyle="bold"
                    android:paddingStart="4dp"
                    android:paddingEnd="16dp"
                    android:includeFontPadding="false"
                    android:textColor="@android:color/white"
                    android:text="00:00" />

            </LinearLayout>

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <ImageButton
                    android:id="@+id/buttonSubtitle"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_marginStart="12dp"
                    android:background="@android:color/transparent"
                    android:foreground="@drawable/ripple_button_player"
                    android:visibility="gone"
                    android:src="@drawable/ic_subs"
                    tools:visibility="visible"/>

                <androidx.mediarouter.app.MediaRouteButton
                    android:id="@+id/buttonChromecast"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_alignParentEnd="true"
                    android:layout_marginEnd="16dp"
                    android:background="@android:color/transparent"
                    android:foreground="@drawable/ripple_button_player"
                    android:src="@drawable/ic_chromecast"
                    android:visibility="gone"
                    tools:visibility="visible" />

            </RelativeLayout>

        </LinearLayout>

    </RelativeLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/containerSuggestEpisode"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="?attr/selectableItemBackground"
            android:clickable="true"
            android:focusable="true"
            android:orientation="vertical"
            android:visibility="gone"
            tools:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0">

            <include
                android:id="@+id/itemSuggestEpisode"
                layout="@layout/item_suggest_episode"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="visible" />
        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>

    <RelativeLayout
        android:id="@+id/loader"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black">

        <com.airbnb.lottie.LottieAnimationView
            android:id="@+id/loaderLottie"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:layout_centerInParent="true"
            android:background="@android:color/transparent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:lottie_autoPlay="true"
            app:lottie_fileName="loader.json"
            app:lottie_loop="true"
            app:lottie_speed="1" />

    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Thanks in advance

Hi @gledezma,

sorry for the late response, I didn’t find any time to look into this earlier.

I think what you might be experiencing is not necessarily an issue with view binding but a conflict with an additional third party dependency causing problems with a lambda invocation within the underlaying ExoPlayer fork.
Similar issues have been reported on the ExoPlayer repository, e.g. Crash ExoPlayer.Builder in android version 5 and 6 (android api 21 and 23) · Issue #9704 · google/ExoPlayer · GitHub. In that case it was related to the com.google.guava dependency.

Can you please double check your other third party dependencies and see if removing any of them fixes the problem?

If not it would be great if you could provide a minimal reproducible sample repository so we can look into it in more detail.

Cheers, Lukas

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.