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,手动改变文件权限,方便分析。