Android 6.0 增加 rild 实例无法启动

5.0开始,Android开始有意支持多模机制了,但5.0上,rild部分还不支持,而到了6.0rild已经能够支持多模啦,尽管某些细节上有待验证,但总体框架是有啦。但原生sync下来的代码并没有配置成支持多模的,需要自己修改。

为了测试双模的有关流程,在init.rc里增加了第二个rild进程,同时新建ril socketFW使用,

如下:

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中的)都需要在这里声明权限,否则无法正常工作,这里备注下,以后可能会用到。

挖坑学习:但是还需要了解原理,有两位大师专门分析过这块内容:

邓老师的讲解略深,看罗老师的分析比较容易一些。。。