【正文】
  设备在播放视频时有异常,使用Logcat查看日志时发现了如下记录:

04-27 14:01:59.136 2825 2825 E SELinux : avc: denied { find } for service=display pid=3015 uid=1046 scontext=u:r:mediacodec:s0 tcontext=u:object_r:display_service:s0 tclass=service_manager permissive=0 
04-27 14:01:59.136 2825 2825 I auditd : avc: denied { find } for service=display pid=3015 uid=1046 scontext=u:r:mediacodec:s0 tcontext=u:object_r:display_service:s0 tclass=service_manager permissive=0

  从上方的Log中可以看出这个问题是因为mediacodec的sepolicy权限没有添加完善所致。具体的操作权限从Log中可以看到是find权限Source上下文mediacodecTarget上下文display_serviceTarget类service_manager。解决方法就是在te文件中为mediacodec添加上缺失的find权限。添加权限的格式为:

allow SourceContext TargetContext:TargetClass Permission;

  在任何1个te文件中添加权限都可以,但为了保持格式一致,我最终选择在device/intel/sepolicy/dolby/mediacodec.te文件中按上述格式添加上以下语句:

allow mediacodec display_service:service_manager find;

  重新编译bootimage并烧写到设备上进行测试,问题得到解决。

【注意】
  有时添加完一条权限后可能又会报另一种权限缺失,我们只需要按照上述方法再添加这种缺失的权限即可,直到系统不再报告sepolicy权限缺失为止。

【题外话】
  前天因为少提交了一个device/intel/cherrytrail/r2_cht_ffd/目录下的 patch,结果第二天测试组同事为设备烧入user版本的镜像后发现所有音频相关的功能都无法正常工作了,而且整个系统都非常卡。因为我平时都是使用eng版本进行测试,没有碰到过这个问题,所以第一反应就是这是权限没有添加成功导致。检查之后发现果然是这样:虽然我在device/intel/sepolicy/dolby/目录下已经为Dolby音效添加了te文件,但在上文提到的r2_cht_ffd路径下忘记了在BoardConfig.mk文件中添加以下代码,所以实际上user版本的镜像中Dolby相关的sepolicy权限配置并没有被编译

# Add sepolicy dir for Dolby audio
BOARD_SEPOLICY_DIRS += device/intel/sepolicy/dolby

  因为Dolby音效是整合到Android系统的AudioFlinger、NuPlayer、AudioServer等这些系统部件中的,所以当Dolby的权限忘记添加时就会使这些系统部件无法正常工作,从而整个Audio系统也就自然而然地挂掉了。
  为Dolby添加好上方这条语句后,音频系统就又可以正常工作了。现在想想,一不小心就搞崩了Android音频系统,也真是刺激