从5.0
开始,Android开始有意支持多模机制了,但5.0
上,rild
部分还不支持,而到了6.0
,rild
已经能够支持多模啦,尽管某些细节上有待验证,但总体框架是有啦。但原生sync
下来的代码并没有配置成支持多模的,需要自己修改。
为了测试双模的有关流程,在init.rc
里增加了第二个rild
进程,同时新建ril socket
给FW
使用,
如下:
1 2 3 4 5 6 | service ril-daemon2 /system/bin/rild -c 2 class main socket rild2 stream 660 root radio socket rild-debug2 stream 660 radio system user root group radio cache inet misc audio log |
一般这样之后,就能顺利的起来第二个rild进程啦,但ps
发现只有一个rild
,细看log,发现第二个rild
在不断的重启~~~
1 2 3 4 5 6 7 8 9 10 11 12 13 | Starting service 'ril-daemon2'... Failed to bind socket 'rild-debug2': Permission denied Failed to bind socket 'rild2': Permission denied QEMU Pipe Device:rw, wait_event error Service 'ril-daemon2' (pid 2221) exited with status 255 Service 'ril-daemon2' (pid 2221) killing any children in process group Starting service 'ril-daemon2'... Failed to bind socket 'rild-debug2': Permission denied Failed to bind socket 'rild2': Permission denied QEMU Pipe Device:rw, wait_event error Service 'ril-daemon2' (pid 2228) exited with status 255 Service 'ril-daemon2' (pid 2228) killing any children in process group |
上面是kernel的log,log指明了重启的原因,init进程在启动ril-daemon2
时,创建其在init.rc
中指定的socket时,遭遇Permission denied
,如果看main log
的话,会有更清晰的打印:
1
| W/init ( 2102): type=1400 audit(0.0:59): avc: denied { create } for name="rild2" scontext=u:r:init:s0 tcontext=u:object_r:socket_device:s0 tclass=sock_file permissive=0
|
init进程无法create
名为rild2
的socket,乖乖~这才意识到,之前还没看完的SEAndroid
安全机制起作用啦,过不了权限检查,需要进行配置。
SEAndroid
是android在4.3
引入的,在之前都是permissive
,也就是机制在,但如果权限检查失败还是会让执行,不会直接deny
,只是会记录log而已。。。而从6开始(这里不是很确定,因为5.0没有进行过实际开发),强制开启啦,也就是变为enforcing
啦,那么权限过不了就会gameover,这个SEAndroid
很复杂,之前只看到一半,还没有完全搞明白机制,所以,这里,如何进行修改就有点抓瞎。。。。
大概知道权限策略配置都是在aosp\external\sepolicy\
下的文件里进行定义,由于策略规则十分复杂,目前还不是很懂,几个重要的策略文件为 *_contexts
,是用来定义所有需要限制的对象的安全上下文的。
尝试改了下,居然解决了:
修改external\sepolicy\file_contexts
,增加两个新增的socket定义
1 2 | /dev/socket/rild2 u:object_r:rild_socket:s0 /dev/socket/rild-debug2 u:object_r:rild_debug_socket:s0 |
或者,直接写为
1 2 | /dev/socket/rild[0-9] u:object_r:rild_socket:s0 /dev/socket/rild-debug[0-9] u:object_r:rild_debug_socket:s0 |
这样以后支持三模、四模都可以啦。。。。。
[备注] 另一个重要的contexts是service_contexts
文件,所有系统级service(需要add到ServiceManager
中的)都需要在这里声明权限,否则无法正常工作,这里备注下,以后可能会用到。
挖坑学习:
但是还需要了解原理,有两位大师专门分析过这块内容:
- 邓老师: http://blog.csdn.net/innost/article/details/19299937
- 罗老师:http://blog.csdn.net/luoshengyang/article/details/37613135
邓老师的讲解略深,看罗老师的分析比较容易一些。。。