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

Fatal Exception: java.lang.OutOfMemoryError #2445

Closed XtreeIvI closed 8 months ago

XtreeIvI commented 8 months ago

Description: Loading indicator animation play correctly, but on some older devices it is causing OutOfMemoryError exception.

Lib Version:

6.2.0

Device Brand:Samsung Model:Galaxy S6 Edge Orientation:Portrait RAM free: 482.58 MB Disk free: 1.49 GB Operating System Version:Android 7.0 Orientation:Portrait Rooted:No

Stack Trace:

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 14745612 byte allocation with 10525824 free bytes and 10MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(VMRuntime.java) at android.graphics.Bitmap.nativeCreate(Bitmap.java) at android.graphics.Bitmap.createBitmap(Bitmap.java:977) at android.graphics.Bitmap.createBitmap(Bitmap.java:948) at android.graphics.Bitmap.createBitmap(Bitmap.java:915) at com.airbnb.lottie.LottieDrawable.ensureSoftwareRenderingBitmap(LottieDrawable.java:1711) at com.airbnb.lottie.LottieDrawable.renderAndDrawAsBitmap(LottieDrawable.java:1664) at com.airbnb.lottie.LottieDrawable.draw(LottieDrawable.java:673) at android.widget.ImageView.onDraw(ImageView.java:1286) at android.view.View.draw(View.java:18318) at android.view.View.updateDisplayListIfDirty(View.java:17296) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.draw(View.java:18321) at android.view.View.updateDisplayListIfDirty(View.java:17296) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.draw(View.java:18321) at android.view.View.updateDisplayListIfDirty(View.java:17296) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at androidx.fragment.app.FragmentContainerView.drawChild(FragmentContainerView.kt:240) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.fragment.app.FragmentContainerView.dispatchDraw(FragmentContainerView.kt:230) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at androidx.fragment.app.FragmentContainerView.drawChild(FragmentContainerView.kt:240) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.fragment.app.FragmentContainerView.dispatchDraw(FragmentContainerView.kt:230) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1994) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at androidx.fragment.app.FragmentContainerView.drawChild(FragmentContainerView.kt:240) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.fragment.app.FragmentContainerView.dispatchDraw(FragmentContainerView.kt:230) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at androidx.fragment.app.FragmentContainerView.drawChild(FragmentContainerView.kt:240) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.fragment.app.FragmentContainerView.dispatchDraw(FragmentContainerView.kt:230) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1994) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at androidx.fragment.app.FragmentContainerView.drawChild(FragmentContainerView.kt:240) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.fragment.app.FragmentContainerView.dispatchDraw(FragmentContainerView.kt:230) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at androidx.fragment.app.FragmentContainerView.drawChild(FragmentContainerView.kt:240) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at androidx.fragment.app.FragmentContainerView.dispatchDraw(FragmentContainerView.kt:230) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.draw(View.java:18321) at android.view.View.updateDisplayListIfDirty(View.java:17296) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.updateDisplayListIfDirty(View.java:17291) at android.view.View.draw(View.java:18080) at android.view.ViewGroup.drawChild(ViewGroup.java:3966) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752) at android.view.View.draw(View.java:18321) at com.android.internal.policy.DecorView.draw(DecorView.java:919) at android.view.View.updateDisplayListIfDirty(View.java:17296) at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:692) at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:698) at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:806) at android.view.ViewRootImpl.draw(ViewRootImpl.java:3128) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2924) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2516) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1515) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7091) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927) at android.view.Choreographer.doCallbacks(Choreographer.java:702) at android.view.Choreographer.doFrame(Choreographer.java:638) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6682) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

Animation:
res/raw

loading_indicator.json

gpeal commented 8 months ago

OOMs happen wherever memory is allocated that pushes your app over the memory limit. The root cause could be elsewhere in your app or the fact that your animation has too many or too large of bitmaps. There isn't anything Lottie itself can do about that.