Hello Stub failed to open hello Permission denied

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:s0
 tclass=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.txt

chmod 777 /dev/hello

chown root /dev/hello

chgrp root /dev/hello

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值