Flutter应用Android端打开视频播放器无日志闪退如何排查?
排查方向与解决方案
一、确认进程被杀根因
- 复现问题时抓取全量系统logcat,过滤
lowmemorykiller、OOM、ActivityManager: Killing关键字,查看进程被杀前系统的内存水位、应用的adj优先级值,确认是系统低内存主动杀进程,还是未捕获的native层崩溃导致进程直接退出。 - 检查应用
AndroidManifest.xml中是否配置了android:largeHeap="true",未配置的话低内存机型的堆上限会更低,会被系统优先判定为查杀对象。
二、定位高内存占用诱因
- 视频播放链路排查:
- 确认播放器实例的生命周期管理逻辑:ExoPlayer实例是否每次进入播放页新建、退出页面时是否调用
release()方法主动释放资源。硬解码占用的显存不会计入Java堆统计,若未正确释放会导致native内存持续上涨,且不会被常规Java内存检测工具捕获。 - 排查播放场景的附加逻辑:极简Demo未复现问题,说明崩溃和主工程中与播放器联动的附加逻辑有关,逐一排查视频帧截图、自定义渲染滤镜、预加载缓存、播放埋点等Demo未集成的逻辑,每注释一块逻辑就验证一次是否复现闪退,快速缩小范围。
- 确认播放器实例的生命周期管理逻辑:ExoPlayer实例是否每次进入播放页新建、退出页面时是否调用
- 内存快照分析:用Android Studio Profiler分别抓取「进入播放页前」「播放1分钟」「退出播放页后」三个时间点的内存快照,排查是否有播放页Activity、Player实例未被回收,同时关注native内存的涨幅,若native内存持续上涨无回落,优先排查播放器so库、渲染组件的内存泄漏。
三、缺失崩溃日志补全方案
- 集成native崩溃捕获组件:当前Crashlytics未上报日志是因为如果是native崩溃或者系统主动杀进程,不会触发Java层的异常回调,Crashlytics默认不会捕获这类事件。可接入native崩溃捕获能力,复现问题后即可拿到对应的native调用栈。
- 增加进程被杀状态采集:在应用中注册
ActivityManager的进程状态监听,记录进程被杀前的内存占用、当前页面等上下文信息,辅助定位问题。
四、快速验证手段
- 在测试包中增加内存阈值告警逻辑,当应用内存占用达到1G时弹出提示,确认是否内存到达固定阈值后必现闪退。
- 单独拉出播放页面的构建逻辑,把主工程的依赖逐步移植到可复现的极简Demo中,每移植一个依赖就验证一次,直到Demo也能复现闪退,即可定位到问题依赖。
内容的提问来源于stack exchange,提问作者phaedrus
相关产品推荐
相关产品推荐

