android 中 ril 层调试笔记和理解

 这段时间一直在弄android5.0 , 对 SELinux有了一定的了解,  上周是在折腾 4G 模块, 搞 ril  层的东西.

以前没有好好理解 ril 层是怎样工作的, 以前在网上看关于 ril 的文章, 感觉看不懂, 后来忙其它方面的东西, 没有深入了解 ril 层的内容.

这周有时间, 终于对ril的功能有了个真实大概了解.

由于android5.0 的安全审核机制,  在调试模块的时候, 没有像以前那样方便, 总要设置很多东西, 如果设置不正确, 可能会走弯路, 于是我打算用 android4.4.3版本来测试.

在实际调试的时候, 发现 android4.4.3 的安全机制也是 相对于 android4.4.2 有提高的, 但是没有 android5.0那么严格.

在android4.4.3 及以后的系统, 在 init.rc中定义一个服务 , 然后想在 ril 层中启动这个服务, 都是要把服务名称注册的白名单的. 就像这个网站提到的一样:!topic/android-platform/ajAxn-hYd6w

We're trying to setup Android to use PPP over a GPRS connection on the 
Omapzoom platform and have run into a question regarding UID 
permissions to startup a service in init.rc. 

To enable ppp the following property is set in init.rc: 

setprop yes 

After doing this, the Java Telephony framework expects a service named 
"pppd_gprs" to be available to be started. This service is the ppp 
daemon, setting up the ppp link. So, we added the service in init.rc: 

service pppd_gprs /etc/init.gprs-pppd 
        user root 
        group radio cache inet misc 

Sidenote: the init.gprs-pppd script eventually starts up the ppp 
daemon, but is used as a wrapper to capture the exit status of the 

However, now that the service is defined, the java telephony stack 
complains that the user radio (uid 1001) is not permitted to start the 
pppd_gprs service: 

<3>init: sys_prop: Unable to start service ctl [pppd_gprs] uid: 1001 
init: sys_prop: Unable to start service ctl [pppd_gprs] uid: 1001 

Since the telephony stack has to be uid 1001, permissions has to be 
added. After some code-crawling we found a working hack to this 
problem. In order to allow the Radio user to start pppd we could add 
an entry to the control_perms “whitelist” in /system/core/init/ 

Like this: 

 * White list of UID that are allowed to start/stop services. 
 * Currently there are no user apps that require. 
struct { 
    const char *service; 
    unsigned int uid; 
} control_perms[] = { 
     {"pppd_gprs", AID_RADIO }, 
     {NULL, 0 } 

So, here's the question: 
Is hardcoding like this really the only way of giving permissions for 
a non-root user to start a service ? If so, that seems very 

在遇到服务不能启动的时候, 可以参考这些....

另外记录一下 ril 层的大概工作步骤:

在init.rc 中定义了 rild 服务, 给 这个程序传递  库,  和一个 能控制 模块 的设备节点, (例如 : /dev/ttyUSB1  ,  /dev/qcqmi1 ) 这个库文件可以 又厂商更名, 例如: ( )

有 了控制模块 的 设备节点(句柄) 之后,  所以对 模块的 操作  + 发送 指令 等 流程和实现, 都在 这个库里面了.

现在的 4G 模块做得很方便使用,  很多工作在模块中已经做好了,  我们只需要使用几条简单的 指令,  告诉模块 我们需要连接 哪个服务商, (CMNET, 3GNET) , 使用 2G, 3G或者 4G 功能, 就可以了. ril 层一般会帮你把很多指令做好了,  并且会把 模块协商获得的 IP, net gate, DNS 等解析出来, 

然后调用 setprop 命, 将这些信息记录到android 的属性列表中,

然后就可以调用类似 dhcp 功能的 服务项,  将这些信息 配置到 网络接口 ( eth1,  或者 usb1 等等)中....

这些步骤之后, 就可以上网了......

ril 库中有很多对 模块的控制流程和步骤.  待我去研究研究再来记录.....

这笔记适合那些 ril 新手参考......

上一篇Android5 Lollipop 中关于 SELinux 安全机制调试笔记
下一篇3G pppd and set up dns
想对作者说点什么? 我来说一句