bulat-icon  articles  

[+]  Articles


Android RIL Architecture

by Gomathi Sankar



The Article explains about the building blocks of Android telephony and how it works.


Android telephony architecture

Android RIL Architecture
Android RIL Architecture

Application: All the telephony related applications like Dialer, Call tracker, SMS, MMS, GPRS, Antenna signal indicator and etc, will come into this section. All these applications will be started during the android boot up. These applications will be tied up with the Android telephony framework services. The telephony framework provides APIs to access the Phone.


Framework services: Telephony framework will be initialized and started during the system start up. All the queries from the application through API will directed to the Radio interface Layer of Android by these services. The service will keep tracking of all the unsolicited commands from the modem. Unsolicited commands are the commands initiated from the modem.


Radio Interface Layer: It is the bridge between Android phone framework services and the hardware. In other words, it is the protocol stack for Telephone. The RIL consist of two primary components.


  1. RIL Daemon
  2. Vendor RIL


RIL Daemon

RILD will be initialized during the Android system start up. It will read the system property to find which library has to be used for Vendor RIL, provide the appropriate input for vendor RIL and finally calls RIL_Init function of Vendor RIL to map all the Vendor RIL functions to the upper layer. Each vendor RIL has RIL_Init function.


Vendor RIL

It is a library specific to each modem. In other words, we can call it as a driver to function the modem. The RIL daemon will call the RIL_Init function with the device location (eg: /dev/ttyS0). It will initiate the modem and returns theRIL_RadioFunctions structure contains the handles of radio functions

type structure { 




RIL_Supports supports;



} RIL_RadioFunctions;


RIL_version : Version of Android RIL


onRequest : Call to Vendor RIL to make a RIL_REQUEST. It must be completed with a call to RIL_onRequestComplete().It will always be called from the same thread, so returning here implies that the radio is ready to process another command (whether or not the previous command has completed)


supports   : Return current radio state.RADIO_STATE_UNAVAILABLE should be the initial state


getVersion: Version of Vendor RIL


There are two forms of communications in Android RIL


Solicited Commands :


These are commands initiated from the upper layer. Like, Dialing/Send SMS are the solicited commands from the upper layer to the RIL. OnRequestis the function for sending the solicited commands from the upper layer


The following diagram describes the solicited call in Android

Solicited call in Android
Solicited call in Android

Each onRequest call should end with RIL_onRequestComplete. It is to send the response for the previous onRequest and to intimate we are ready for the next command. Refer ril.h for all the solicited commands


Unsolicited commands


These are the commands initiated from the modem to the upper layer. Like, Receive Call /Receive SMS are the commands. The Vendor RIL has to continuously monitor the device for unsolicited command from the modem.


The following diagram describes the unsolicited call in Android

Unsolicited call in Android
Unsolicited call in Android

Implementation of Vendor RIL


Android is providing the basic vendor RIL with minimum feature set (reference-ril). It is good to start with that reference code. Compile the Vendor RIL as a shared library with the following style


libril-<companyname>-<RIL version>.so


libril - all the Vendor ril library should start with this


Vendor RIL Configuration :


Replace the following line in the init.rc file


serviceril-daemon /system/bin/rild




serviceril-daemon /system/bin/rild -l /system/lib/libreference-ril.so — -d/dev/ttySx


Commands after "-" will be input for Vendor ril.


Here is sample log of Sending a SMS


D/SMS     ( 1962): SMS send size=0time=1319439322559

D/RILJ    ( 1962): [0312]> SEND_SMS

D/RIL     ( 1814): onRequest: SEND_SMS

D/AT      ( 1814): MUX[primary]: AT> AT+CMGS=14

D/AT      ( 1814): MUX[primary]: AT<>

D/AT      ( 1814): AT> 0001000a814978045948000002c834^Z

D/AT      ( 1814): MUX[primary]: AT< Q: 31,0

D/AT      ( 1814): MUX[primary]: AT< +CUSD: 0,”Your Last Call charge IS Rs  0.5000  AND CURRENT Balance IS  47.8770 AND EXP IS  25/09/21. Love Spl 6 Caller tunes for Jd

D/RILC    ( 1814): Unsolicited Response!!!

D/RILJ    ( 1962): [UNSL]< UNSOL_ON_USSD 0

D/AT      ( 1814): MUX[primary]: AT< “,15

D/AT      ( 1814): MUX[primary]: AT< +CMGS: 219

D/AT      ( 1814): MUX[primary]: AT< OK