当前位置: 代码迷 >> 综合 >> Hello Stub failed to open hello Permission denied
  详细解决方案

Hello Stub failed to open hello Permission denied

热度:15   发布时间:2024-01-17 08:15:14.0

Hello Stub:failed to open /dev/hello – Permission denied

Android 6.0中 在HAL层的代码要访问/dev/hello的时候出现了

Hello Stub:failed to open /dev/hello !– Permission denied

的错误!
查阅了Google中类似的问题,解决办法:
1、添加文件权限
2、修改SELinux策略

1、添加文件权限

在android 源码目录下, system/core/rootdir/ueventd.rc文件中添加如下代码:

/dev/hello      0666    root    root

重新打包编译system.img,在adb shell 中查看权限:
ls -l /dev/hello
权限变成了666!
但是现在还不能完全解决这个问题,因为Android L以后引入了SELinux防火墙机制,每个进程对文件的访问是有规定的,所以不可忽视的一条log信息:

W system_server: type=1400 audit(0.0:35): avc: denied { read 
write } for name="hello" dev="tmpfs" ino=7189 
scontext=u:r:system_server:s0 tcontext=u:object_r:device:s0tclass=chr_file permissive=0

这句话的意思是system_server 进程想要访问device:chr_file 缺少read和write的权限!这就需要在修改SELinux的策略,赋予system_server 这个权限。

2、修改SELinux策略

在Android源码下面device\mediatek\common\sepolicy\device.te 中添加我们要访问device的定义

type    hello_device    dev_type ;

绑定文件与SELinux type,在文件device\mediatek\common\sepolicy\file_contexts中添加:

/dev/hello(/.*)?  u:object_r:hello_device:s0

添加system_server进程的访问权限;
在文件device\mediatek\common\sepolicy\system_server.te中添加:

#add by eliot_shao 2016-7-7
allow system_server hello_device:chr_file   { read write open };

这样就可以了!

现在HAL层的open就可以成功打开/dev/hello文件进行操作了。

这个过程还涉及一个调试的小技巧:

在Android运行的时候,可以通过
adb shell stop
adb shell start
关闭和打开Android的系统服务进程。
在Android stop的时候 使用

adb logcat > log.txtchmod 777 /dev/hellochown root /dev/hellochgrp root /dev/hello

可以获取系统服务启动过程中加载JNI和HAL代码的log,手动改变文件权限,方便分析。

  相关解决方案