1. 程式人生 > >android 中 ril 層除錯筆記和理解

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 層中啟動這個服務, 都是要把服務名稱註冊的白名單的. 就像這個網站提到的一樣:

https://groups.google.com/forum/#!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 ro.radio.use-ppp 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 
        disabled 

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 
pppd. 

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 
pid:821 
init: sys_prop: Unable to start service ctl [pppd_gprs] uid: 1001 
pid:821 

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/ 
property_service.c. 

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 
inflexible.  

在遇到服務不能啟動的時候, 可以參考這些....

另外記錄一下 ril 層的大概工作步驟:

在init.rc 中定義了 rild 服務, 給 這個程式傳遞 libreference-ril.so  庫,  和一個 能控制 模組 的裝置節點, (例如 : /dev/ttyUSB1  ,  /dev/qcqmi1 )

 libreference-ril.so 這個庫檔案可以 又廠商更名, 例如: ( libreference-ril-ubox.so )

有 了控制模組 的 裝置節點(控制代碼) 之後,  所以對 模組的 操作  + 傳送 指令 等 流程和實現, 都在  libreference-ril.so 這個庫裡面了.

現在的 4G 模組做得很方便使用,  很多工作在模組中已經做好了,  我們只需要使用幾條簡單的 指令,  告訴模組 我們需要連線 哪個服務商, (CMNET, 3GNET) , 使用 2G, 3G或者 4G 功能, 就可以了. ril 層一般會幫你把很多指令做好了,  並且會把 模組協商獲得的 IP, net gate, DNS 等解析出來, 

然後呼叫 setprop 命, 將這些資訊記錄到android 的屬性列表中,

然後就可以呼叫類似 dhcp 功能的 服務項,  將這些資訊 配置到 網路介面 ( eth1,  或者 usb1 等等)中....

這些步驟之後, 就可以上網了......

ril 庫中有很多對 模組的控制流程和步驟.  待我去研究研究再來記錄.....

這筆記適合那些 ril 新手參考......