You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Camera释放后内存未恢复,图形内存持续累积问题求助

Android Camera 预览后图形内存无法释放的问题

问题重现步骤

  • 打开Android Camera并启动预览
  • 停止预览、释放所有资源并关闭当前Activity
  • 内存泄漏检测无异常(已修复此前存在的泄漏问题)
  • 内存占用无法恢复至Camera预览前的初始状态

现象说明

Android Profiler 图形内存变化

每次打开Camera,图形内存都会明显增长;关闭Camera后仅小幅下降,无法恢复到打开前的状态。多次执行「打开-关闭」操作后,图形内存持续累积,即使关闭Activity并释放所有Camera相关资源也无法缓解。

解决建议

1. 严格遵循Camera资源释放规范

  • 若使用旧版Camera API:
    1. 先调用 camera.stopPreview() 停止预览
    2. 调用 camera.setPreviewCallback(null) 置空预览回调
    3. 执行 camera.release() 释放Camera实例,随后立即将实例置为null
  • 若使用Camera2 API:
    1. 关闭所有CaptureSession并置空引用
    2. 调用CameraDevice.close()关闭设备,移除StateCallback
    3. 确保CameraManager的相关监听被注销

2. 清理Surface相关资源

图形内存累积多与Surface资源未彻底释放有关:

  • 若使用SurfaceView:在Activity销毁时,调用surfaceView.getHolder().getSurface().release()(注意API 24+兼容性),并置空SurfaceView引用
  • 若使用TextureView:注销SurfaceTextureListener,调用textureView.setSurfaceTexture(null),并置空TextureView实例
  • 避免在全局变量或静态类中持有Surface相关对象引用

3. 辅助触发内存回收

Android GPU内存回收依赖系统调度,可在资源释放后尝试主动触发:

// 在Camera资源释放完成后调用
System.gc();
Runtime.getRuntime().gc();

注:仅作为辅助手段,不能依赖此方法解决根本问题

4. 排查自定义/第三方预览逻辑

  • 检查预览回调中是否存在未及时回收的Bitmap、字节数组等数据,确保帧数据处理完成后立即释放
  • 若使用第三方Camera封装库,核对其资源释放逻辑是否存在遗漏,必要时替换为原生实现测试

5. 排查机型/系统层面问题

  • 在不同品牌、版本的Android机型上复现问题,确认是否为特定机型的系统bug
  • 通过adb logcat查看系统日志,搜索CameraService、SurfaceFlinger相关的警告或错误信息,定位系统层面的资源泄漏点

内容的提问来源于stack exchange,提问作者Godrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:33:39