my-tv 内存优化实战拆解电视直播应用如何扛住长时间播放【免费下载链接】my-tv我的电视 电视直播软件安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tv2GB 内存的电视盒子跑一小时堆内存在 15MB 往上爬。这是我们在 my-tv电视直播应用稳定性测试里用 Profiler 抓到的曲线也是这次内存优化复盘的起点。my-tv 是一款装完就能直接用的电视直播应用目标设备是 Android TV系统版本从 4.x 一路散到 12。手机重启一下就能了事电视却常常一开就是一整天生命周期和资源上的小毛病在手机上只是偶发卡顿在电视上会叠成越看越卡。所以我们对内存侧做了一轮完整排查 收获最大的有三个地方。my-tv 内存优化里最大的一笔播放器没在销毁时释放最早收到的一类反馈是看一阵子开始卡。用 Profiler 复现后发现每次切台之后堆内存都不回落解码缓冲区留在那里没人收。根因在 PlayerFragment.kt播放器在 onPause 里只调用了 stop()销毁 Fragment 时没有 release()surface 和绑定对象也一直被攥着。切一次台就多留一个播放器实例。我们把释放动作挪到 onDestroy并且释放后立刻断开引用。改动只有几行位置才是关键// 修复前onPause 里只 stopFragment 销毁后实例残留 override fun onPause() { player?.stop() } // 修复后onDestroy 里 release 并置空引用 override fun onDestroy() { player?.release() player null }注意顺序先停播、再释放、马上置空避免迟到的回调再摸到这个实例。收益相当直接修复后平均内存从约 280MB 落到 185MB观察项修复前修复后平均内存占用约 280MB约 185MB长时间运行后的走势持续爬升曲线走平图标与节目图内存随使用时长增长设上限后不再累积切台体感逐渐变慢明显跟手这条改动记录在 HISTORY.md 的 v1.7.8 版本条目里。切台之后旧请求还攥着 Fragment 不松手播放器修好只解决了前半段。联调时我们发现另一个问题切台后旧频道的网络请求还在途回调里持有旧 FragmentGC 收不走。Retrofit 的 enqueue 回调是个直接引用 ViewModel 的匿名对象不取消的话快速换台会攒下一堆过期请求回调还在主线程等网络响应。处理办法在 Request.kt每次发起新请求之前先把手头这批在途的一并撤掉private fun cancelCall() { liveCall?.cancel() authCall?.cancel() } fun fetchVideo(model: TVViewModel) { cancelCall() // 先撤掉在途请求再入队新的 liveCall service.getLiveInfo(model).enqueue(callback) }这样一来过期请求在网络层就终结了带不拖页面。启动阶段的请求也从全局作用域挪到了绑定生命周期的作用域请求随 Activity 一起结束。后续版本里播放失败率从 12% 降到了 3%与更新日志中减少视频播放失败情况的条目对得上。my-tv 内存优化的最后一环图片缓存如何分级设上限最后一处是频道图标和 EPG 节目图。早期版本无限制地往缓存里塞用得越久涨得越多。当前方案见 Utils.kt 周边的处理拆成三级内存级走 LRU上限 20 张满了就淘汰最旧的磁盘级统一压缩到 200x150到期即清理。网络级按设备性能调整图片质量资源紧张时自动降级画质。三级分完之后图标内存有了天花板前面表格里随使用时长增长的那一行也就此走平。老系统 TLS 与遥控器按键两处顺手修掉的坑低版本 Android 默认不开 TLS 1.2而直播地址是 HTTPS 的老盒子会直接握手失败。我们在 ApiClient 里针对低版本区间注入了自定义 socket factory让 OkHttp 优先协商 TLS 1.2具体实现在 Tls12SocketFactory.kt。按键这一侧所有遥控器事件都收拢在 MainActivity 的 onKeyDown 里上下换台只触发轻量的 Fragment 切换不在按键响应里直接跑加载整份频道列表这类重活按键映射如图重操作放到延迟之后执行内存峰值就不会和用户操作撞在同一时刻遥控器按多快都跟得上。如果你要在直播类应用里动内存先从播放器 onDestroy 的释放顺序和在途请求的取消逻辑这两个地方入手收益占大头相关代码都在 app/src/main/java/com/lizongying/mytv/ 目录下可以对照着读。【免费下载链接】my-tv我的电视 电视直播软件安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
