airbnb / lottie-android

Render After Effects animations natively on Android and iOS, Web, and React Native
http://airbnb.io/lottie/
Apache License 2.0
34.95k stars 5.4k forks source link

[ANR] com.airbnb.lottie.LottieAnimationView.<clinit> (LottieAnimationView.java) #2204

Closed pmpavan closed 1 year ago

pmpavan commented 1 year ago

Lottie is supported and developed on nights and weekends. Issues from Lottie sponsors will be prioritized.

Describe the bug We are seeing some ANRs related to LottieAnimation view initialisation in low end device and we are unable to reproduce it.

stacktrace -

"main" tid=1 Runnable

#00  pc 0x000000000053a6e0  /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+128)
  #01  pc 0x00000000006f0e04  /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+236)
  #02  pc 0x00000000006fe690  /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+208)
  #03  pc 0x000000000040295c  /apex/com.android.art/lib64/libart.so (art::Thread::RunCheckpointFunction()+140)
  #04  pc 0x000000000075c0d0  /apex/com.android.art/lib64/libart.so (artTestSuspendFromCode+48)
  #05  pc 0x000000000043ff3c  /apex/com.android.art/lib64/libart.so (art_quick_test_suspend+156)
  at java.lang.Class.isAnonymousClass (Class.java)
  at java.lang.Class.getSimpleName (Class.java:1249)
  at com.airbnb.lottie.LottieAnimationView.<clinit> (LottieAnimationView.java:71)
  at java.lang.reflect.Constructor.newInstance0 (Constructor.java)
  at java.lang.reflect.Constructor.newInstance (Constructor.java:343)
  at android.view.LayoutInflater.createView (LayoutInflater.java:876)
  at android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:1064)
  at android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:1019)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:1181)
  at android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:1142)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:1184)
  at android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:1142)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:1184)
  at android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:1142)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:1184)
  at android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:1142)
  at android.view.LayoutInflater.inflate (LayoutInflater.java:701)
  at android.view.LayoutInflater.inflate (LayoutInflater.java:553)
  at androidx.databinding.DataBindingUtil.inflate (DataBindingUtil.java:126)
  at androidx.databinding.DataBindingUtil.inflate (DataBindingUtil.java:95)
  at redacted.BaseFragment.inflate (BaseFragment.kt:51)
  at redacted.AFragment.onCreateView (HomeFragment.java:375)
  at redacted.BFragment.onCreateView (CatalogsFragment.java:215)
  at androidx.fragment.app.Fragment.performCreateView (Fragment.java:3104)
  at androidx.fragment.app.FragmentStateManager.createView (FragmentStateManager.java:524)
  at androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java:261)
  at androidx.fragment.app.FragmentManager.executeOpsTogether (FragmentManager.java:1890)
  at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute (FragmentManager.java:1808)
  at androidx.fragment.app.FragmentManager.execPendingActions (FragmentManager.java:1751)
  at androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java:2976)
  at androidx.fragment.app.FragmentManager.dispatchActivityCreated (FragmentManager.java:2886)
  at androidx.fragment.app.FragmentController.dispatchActivityCreated (FragmentController.java:263)
  at androidx.fragment.app.FragmentActivity.onStart (FragmentActivity.java:351)
  at androidx.appcompat.app.AppCompatActivity.onStart (AppCompatActivity.java:246)
  at redacted.core.impl.BaseActivity.onStart (BaseActivity.java:162)
  at android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1455)
  at android.app.Activity.performStart (Activity.java:8388)
  at android.app.ActivityThread.handleStartActivity (ActivityThread.java:3946)
  at android.app.servertransaction.TransactionExecutor.performLifecycleSequence (TransactionExecutor.java:221)
  at android.app.servertransaction.TransactionExecutor.cycleToPath (TransactionExecutor.java:201)
  at android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:173)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2423)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loopOnce (Looper.java:233)
  at android.os.Looper.loop (Looper.java:334)
  at android.app.ActivityThread.main (ActivityThread.java:8348)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:582)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1065)

Steps To Reproduce We inflate the LottieAnimationView programatically like below.

fun createLottieView(): LottieAnimationView {
        val lottieView = LottieAnimationView(context)
        val params = LinearLayout.LayoutParams(dpToPx(31), dpToPx(31))
        params.leftMargin = dpToPx(4)
        lottieView.layoutParams = params
        lottieView.setAnimationFromUrl(url)
        lottieView.setFailureListener { e: Throwable? ->
            val param =
                LinearLayout.LayoutParams(dpToPx(40), dpToPx(40))
            lottieView.setPadding(dpToPx(10), dpToPx(10), dpToPx(10), dpToPx(10))
            param.leftMargin = dpToPx(0)
            lottieView.layoutParams = param
        }
        lottieView.setFallbackResource(R.drawable.ic_microphone)
        lottieView.addAnimatorListener(object : Animator.AnimatorListener {
            override fun onAnimationStart(p0: Animator?) {
            }

            override fun onAnimationEnd(p0: Animator?) {
            }

            override fun onAnimationCancel(p0: Animator?) {
            }

            override fun onAnimationRepeat(p0: Animator?) {
            }

        })
        return lottieView
    }

Expected- No ANRs should happen

gpeal commented 1 year ago

I think this is unrelated to Lottie and likely specific. Likely something else was going on that caused it to be slow and it happened to ANR here by coincidence.