Android Lottie 性能调优——体积、内存、帧率
APK 体积影响
SDK 本身大小
lottie-android 库大约 200KB(aar 包),对应到 APK 里约 100KB(混淆后)。这个体积在现代 App 里是可以接受的。
动画 JSON 文件
每个动画文件通常 10~50KB。但要注意:
- raw 资源有大小限制:Android 编译时 raw 单个文件不能超过 2KB(默认配置)。解决方案是把动画放到
assets/目录。 - 优化 JSON 体积:Bodymovin 导出时可以勾选简化路径、移除不可见图层。LottieFiles 在线优化工具可以进一步压缩(通常能省 30~80%)。
- 用 dotLottie 格式:dotLottie 是 ZIP 压缩包,比原始 JSON 小约 80%,而且把多个动画和资源打包成一个文件。
体积对比
| 格式 | 典型体积 | 备注 |
|---|---|---|
| Bodymovin JSON | 20~50KB | 原始矢量数据 |
| 优化后 JSON | 5~15KB | LottieFiles 在线优化 |
| dotLottie (.lottie) | 2~10KB | ZIP 压缩 |
| GIF | 200~500KB | 同等复杂度 |
| PNG 序列 | 1000~5000KB | 同等复杂度 |
渲染帧率
硬件加速
Lottie Android 默认在硬件加速的 Canvas 上渲染(大多数 Android 设备都开启了硬件加速)。如果发现动画卡顿,检查你的 Activity 或 ViewGroup 是否被设置了 layerType = LAYER_TYPE_SOFTWARE——软件加速会显著降低渲染性能。
动画复杂度
影响帧率的主要因素:
- 图层数量:单个动画超过 100 个图层可能掉帧。
- 位图资源:动画里如果用了大图,解码和缩放占 CPU。建议位图控制在 500x500 以内。
- 表达式:虽然导出时应该预烘焙,但如果 JSON 里还残留表达式,每帧都会执行——必须清理。
- 合并路径(Merge Paths):Android 端合并路径会创建离屏渲染缓冲,性能开销大。尽量避免或在动画里少用。
性能监控
可以用 Android Studio 的 Layout Inspector 和 Profiler 观察:
- Layout Inspector 里看动画渲染的 View 层级。
- Profiler 的 CPU / GPU 标签看动画播放时的帧率波动。
- Lottie 自带性能日志:开启
Lottie.setPerformanceTrackingEnabled(true)后,Logcat 会输出每层的渲染时间。
内存
主要内存消耗
LottieComposition(解析后的 JSON 对象):一份动画 JSON 解析后通常占几百 KB 内存。- 位图资源:如果动画里嵌入了位图,解码后的 Bitmap 占用内存 = 宽 × 高 × 4 字节(ARGB)。
内存管理建议
- 不要同时创建过多 LottieComposition:如果页面上有很多小动画(比如 RecyclerView 里的图标),把它们的 Composition 缓存起来复用。
- 及时取消动画:Activity / Fragment 退出时调用
cancelAnimation(),让渲染器停止工作。 - 谨慎用 URL 动态加载:URL 加载的 Composition 会被 Lottie 内部缓存,但不会自动释放。如果不再需要某个远程动画,手动清理。
- dotLottie 比多 JSON 省内存:一个 dotLottie 文件里的多段动画共享解析基础,内存效率更高。
什么时候 Lottie 不够快
如果你在 Android 端遇到以下情况,可能需要考虑其他方案:
- 需要实时骨骼动画(spine、dragonBones)—— Lottie 做不到。
- 200+ 图层的复杂 3D 动画—— Lottie 不支持 3D。
- 极高帧率要求 + 大量同时播放的动画——考虑 Unity 或 Flutter 渲染。
但对绝大多数 App 里的 Loading、图标动画、引导页、空状态动画,Lottie Android 的性能是完全够用的。