现象

  1. 同一个版本,业务获取不到回调值,但是我们能获取到。同一个设备,有时能回调,有时没有回调。
  2. 关采集的时候没有给回调值
  3. 自动模式下,开红外之后关采集,再打开的时候,画面正常切到白天,但是回调给的状态是开红外

思路

  • 在同一个设备中进行打印,观察何时能回调,何时没有回调

关闭采集的时候没有给回调值,有两种可能性:

  • 红外开关是在ROM中设置,可能关闭采集的时候,isp组件先关闭了,再去关红外灯的,就没法去执行业务的回调
  • 在关闭采集的时候,没有对property进行设置,isp组件中也就没有获取到当前的红外状态

过程

  1. 同一台设备中打印,有的时候有回调,有的是否没有回调,后来发现和root权限有关。没有root过就没有回调,root过就有回调。这个现象在之前创建fd的时候也遇到过,SElinux对创建fd等操作进行了权限管理。
  2. 整理红外回调的思路:ROM中设置红外开关的时候都会设置对应的property值。在isp组件中创建一个线程,对property的值轮询,如果发生了改变,就执行业务的回调。
  3. 由于isp组件可能在红外灯关闭之前就被kill掉了,而不管是手动还是自动模式,关闭采集的时候都需要关闭红外,所以直接在isp组件退出的时候,回调红外关闭的状态。
  4. isp组件需要保存上一次的值,否则很可能在关闭采集的时候,回调两次红外关闭的状态(isp组件检测到红外关闭回调一次,isp组件退出的时候回调一次)。回调红外关闭的状态,从isp组件退出的地方,修改到轮询property线程结束的地方,这样可以利用static保存上一次的值。
  5. 关闭采集的时候,发现ROM那边仅仅是把红外灯设置成关闭状态,没有更新property值,所以需要增加一句设置property的代码

解决方案

  1. SElinux权限,需要找负责ROM的人开
  2. isp组件:在更新红外状态的线程结束时,把红外状态设置成关,回调给业务
  3. rom: 在camera关闭的状态下,也要注意更新property的值

小结

  1. 不仅仅fd的创建与读写,property的读写也是由SElinux管理的,以后代码提交的时候,需要在非root的情况下也验证一下,防止出现此类问题
  2. 这种更新状态的问题,需要考虑到开关机,线程中途退出等等问题,必须要考虑全面
  3. 线程结束的时候,多思考一下,需要释放哪些资源,需要重置哪些状态等等