Android Frozen frames and Slow Rendering on analyzing Firebase Performance SDK

Viewed 1012

I have enabled performance monitoring by adding Firebase performance SDK to my apps. But I am getting high percentage of Frozen Frames and Slow rendering. Most of the screens have recycler views in it which get the data from APIs and populate the views.

I want to reduce my Frozen frame rates to around 1 to 5%. Any suggestions would be higly appreciated.

Note: I changed the layout structure from Linear/Relative to ConstraintLayout which reduced the rate by appx. 2+%.

Here is a snippet of one of my activities:

HomeActivity.kt

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_home)

    (application as App).getAdUtilInstance()?.let { setupViewPager(it) }

    drawerIv.setOnClickListener {
        startActivity(Intent(this@HomeActivity,
            MenuActivity::class.java))
    }

    searchIv.setOnClickListener {
        startActivity(Intent(this@HomeActivity,
            SearchActivity::class.java))
    }

    loadExitAd()

    val clevertapDefaultInstance =
        CleverTapAPI.getDefaultInstance(applicationContext)
    clevertapDefaultInstance.setInAppNotificationButtonListener(this)

    checkForNotifications()
    if (intent.hasExtra("TAB")) {
        val tabNumber: Int = intent.getIntExtra("TAB", 0)
        setCurrentItem(tabNumber)
    }
}

private fun setupViewPager(adUtility: AdUtility) {


    tab_bar.setOnTabClickedListener(OnTabClickedListener { view, pos ->
        when (pos) {
            0 -> {
                
                if (homeConstraintGroup.visibility == View.GONE) {
                    showToolbar()
                }
                viewPager.currentItem = 0
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.HOME)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.HOME)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
            }
            1 -> {
                Log.d("123__", "Movies")
                if (homeConstraintGroup.visibility == View.GONE) {
                    showToolbar()
                }
                viewPager.currentItem = 1
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.MOVIES)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.MOVIES)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
            }
            2 -> {
                Log.d("123__", "Tv shows")
                if (homeConstraintGroup.visibility == View.GONE) {
                    showToolbar()
                }
                viewPager.currentItem = 2
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.TV_SHOWS)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.TV_SHOWS)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
            }
            3 -> {
                Log.d("123__", "Ott")
                hideToolbar()
                viewPager.currentItem = 3
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.OTT)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.OTT)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
            }
            5 -> {
                Log.d("123__", "Music")
                if (homeConstraintGroup.visibility == View.GONE) {
                    showToolbar()
                }
                viewPager.currentItem = 4
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.MUSIC)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.MUSIC)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)

            }

            6 -> {
                Log.d("123__", "News")
                if (homeConstraintGroup.visibility == View.GONE) {
                    showToolbar()
                }
                viewPager.currentItem = 5
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.NEWS)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.NEWS)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
            }

            7 -> {
                Log.d("123__", "Lifestyle")
                if (homeConstraintGroup.visibility == View.GONE) {
                    showToolbar()
                }
                viewPager.currentItem = 6
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.LIFESTYLE)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.LIFESTYLE)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
            }
            8 -> {
                Log.d("123__", "Sports")
                if (homeConstraintGroup.visibility == View.GONE) {
                    showToolbar()
                }
                viewPager.currentItem = 7
                val bundle = Bundle()
                bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.SPORTS)
                AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)

                val ctBundle = Bundle()
                ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.SPORTS)
                AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
            }
        }
    })

    viewPager.addOnPageChangeListener(object : OnPageChangeListener {
        override fun onPageScrolled(
            position: Int,
            positionOffset: Float,
            positionOffsetPixels: Int
        ) {
        }

        override fun onPageSelected(position: Int) {
        }

        override fun onPageScrollStateChanged(state: Int) {}
    })


    val adapter = ViewPagerAdapter(supportFragmentManager)
    homeFragment = HomeFragment()
    moviesFragment = MoviesFragment()
    tvShowsFragment = TvShowsFragment()
    ottFragment = OttFragment()
    newsFragment = NewsFragment()
    musicFragment = MusicFragment()
    sportsFragment = SportsFragment()
    lifestyleFragment = LifestyleFragment()
    adapter.addFragment(homeFragment)
    adapter.addFragment(moviesFragment)
    adapter.addFragment(tvShowsFragment)
    adapter.addFragment(ottFragment)
    adapter.addFragment(musicFragment)
    adapter.addFragment(newsFragment)
    adapter.addFragment(lifestyleFragment)
    adapter.addFragment(sportsFragment)
    viewPager.adapter = adapter
}

activity_home.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"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/home_screen_background">

    <androidx.constraintlayout.widget.Group
        android:id="@+id/homeConstraintGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        app:constraint_referenced_ids="appLogo, appNameLogo, searchIv, drawerIv" />

        <ImageView
            android:id="@+id/appLogo"
            android:layout_gravity="center_vertical"
            android:src="@drawable/livetv_logo_small"
            android:padding="10dp"
            android:layout_marginEnd="10dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_width="50dp"
            android:layout_height="50dp"/>
        <ImageView
            android:id="@+id/appNameLogo"
            android:layout_gravity="center_vertical"
            android:src="@drawable/livetv_text_logo"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toEndOf="@+id/appLogo"
            android:layout_marginEnd="5dp"
            android:layout_marginTop="3dp"
            android:layout_width="50dp"
            android:layout_height="50dp"/>



    <ImageView
        android:id="@+id/searchIv"
        android:layout_centerVertical="true"
        android:src="@drawable/search"
        android:padding="15dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/drawerIv"
        android:layout_marginEnd="5dp"
        android:layout_width="50dp"
        android:layout_height="50dp"/>

    <ImageView
        android:id="@+id/drawerIv"
        android:layout_centerVertical="true"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:src="@drawable/menu"
        android:padding="15dp"
        android:layout_width="50dp"
        android:layout_height="50dp"/>

    <com.vk.dev.android.ExpandableBottomTabBar
        android:id="@+id/tab_bar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:background="@color/home_screen_background"
        app:max_tab_count="5"
        android:textSize="10sp"
        android:textColor="#9E9D99"
        app:selected_tab_text_color="@color/colorPrimary"
        app:itemIconTint="@drawable/bottom_selector"
        app:itemTextColor="@drawable/bottom_selector"
        app:labelVisibilityMode="labeled"
        app:tab_resource="@xml/bottombar_tabs"
        app:more_icon_resource="@drawable/menu_inactive"
        />

    <com.livetv.freelivetv.movies.helpers.NonSwipeableViewPager
        android:id="@+id/viewPager"
        android:layout_above="@id/tab_bar"
        app:layout_constraintTop_toBottomOf="@+id/appLogo"
        app:layout_constraintBottom_toTopOf="@+id/tab_bar"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_width="0dp"
        android:layout_height="0dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Below is the screenshot showing their respective percentages on various screens. Frozen Frames and Slow Rendering percentage

0 Answers
Related