1.研究的背景和意义。
1.1安卓RIL简介
Android RIL(无线电接口层)在无线基带调制解调器和电话应用程序之间提供了一个抽象层。在Android RIL层,电话应用的各种情况,比如:双SIM卡;电话、短信、彩信、PS数据服务、PIN/PUK码和其他3G网络服务。
RIL层在Android系统中处于硬件抽象层,运行在独立的守护进程中,主要提供对框架层和基带接口的适配,具有良好的独立性。RIL层的通信机制是与框架层接口的Socket通信,内部线程主要使用管道,默认与基带接口使用AT命令。除此之外,其代码由C和C完成,对第三方库的依赖较少,因此Android RIL层具有良好的可移植性。
1.2移植安卓RIL的意义
目前,许多系统基于L I N U X平台,如:
PC(LINUX操作系统)、QT、路由器平台(如O p e n W r t系统)等。都需要连接3 G网络。但是这些平台的原生功能中并没有独立的RIL接口层,因此开发一套基于LINUX的独立应用,以基带支持各种3G网络相关业务是很有意义的。Android RIL具有良好的稳定性和独立性。以及3G网络服务的完整性,将其移植到独立的RIL层,用于LINUX通用平台,可以方便所有基于LINUX的平台完成各种电话应用的开发。
2.2 . RIL层分析。安卓系统
2.1 RIL层在Android系统中的地位
RIL位于Android系统的硬件抽象层。它主要通过套接字通信连接到框架层。对框架层发送的消息进行解析后,向基带发送相应的AT指令,并将基带返回的AT指令的响应封装成消息返回给框架层。位置如图1所示。
2.2安卓RIL工作原理
2.2.1安卓RIL代码描述
ril主要由RILD(radio interface layerdaemon)守护进程和两个动态库组成:Android项目源代码目录中的librefrence_ril.so和libril.so,硬件/ril目录中包含RIL代码,主要文件描述如表1所示。
2.2.2安卓RIL工作原理
Rild以一个主函数作为整个RIL层的入口点,负责初始化。libril.so库包含了主要的消息循环过程,主要负责与框架层交互。接收到框架层命令后,调用相应的函数进行处理,然后将命令响应结果发送回客户端进程。
Librefrence _ ril.so主要提供各种具体业务的AT指令的封装和解析接口,可以被libril调用,可以通过AT_COM与基带交互。具体工作线程如图2所示。
3.移植安卓RIL层功能
通过对Android RIL层的代码分析,RIL层主要使用基于linux的POSIX Thread(pthread)多线程编程和socket IPC通信,移植过程中无需考虑。需要移植的是,RIL层依赖于Android系统的功能。
3.1移植安卓系统属性
属性是系统的一个重要特征。属性数据由init进程维护,用于管理系统的全局配置和状态。每个属性对应一对键值。
在RIL层,对系统属性的依赖比较小,所以不需要移植所有的Android系统属性机制。RIL层主要需要在RILD初始化时从系统属性中读取reference-ril.so路径、at设备路径、网卡设备等信息,在运行时将从网络中动态获取的IP、DNS等信息写入相应的系统属性中。
根据你所在的具体系统,你可以把需要的信息写入系统保存全局共享参数的机制,根据你所在系统的配置方式,获取需要的参数。因为RIL层需要获取的参数非常有限,所以还可以配置RIL层独有的配置文件,通过配置分析RIL层的配置文件,替换安卓系统属性机制。你甚至可以指挥
安卓。m k机制是Android平台上makefile封装的一种独特的编译机制。在一般的linux平台上,通常每个模块都有自己的Makefile文件。所以我们需要根据。/libril./reference-ril和。/rild文件夹中的Android。
Mk内容写在相应的Makefile中。本质上,Android.mk是Makefile的一部分,所以移植编译后的文件非常简单。/RIL和。/referenceRIL的Android.mk描述了libril.so和libreferenceril。
so两个动态库的生成和安装路径.rild中的/Android.mk描述了rild守护进程的生成和安装路径,链接libril.so库。
3.3移植包裹消息
从上面对Android RIL层功能的分析,发现框架层和RIL层的交互是通过socket消息传递的。作为IPC通信的数据单元,消息被包裹容器封装以存储序列化数据。因此,在迁移过程中,完成相同的消息机制是整个迁移的核心任务。源代码位于Frameworks/base/libs/binder/parcel . CPP中.
对源代码的分析表明:1 .整个读写都是在内存中进行的,主要由malloc()等内存操作动态分配。realloc()。memcpy()根据数据大小要求。这些接口都是标准C提供的,移植性很好;2.Binder通信中的数据对象都是封装成包裹格式进行传输的,传输的类型包括IBinder。Filedescriptor等。这些数据在传输过程中需要特殊处理,对移植有很大的依赖性。幸运的是,RIL部分没有不需要Binder通信,所以这部分代码可以从中删除,降低了移植的难度。所以只需要实现普通数据的消息封装即可。在Parcel中,为读取和写入普通数据定义了以下方法:
数据的基本消息封装通过这些方法写入和读取包裹。因为AT指令和AT响应的参数都是Int和String数据,所以操作这两种数据的方法主要用在RIL层。所以用C代码实现了一个容器,里面包含writeInt(int)、readInt()、WriteString(String)和readString()是非常简单的处理数据的方法,所以模拟Android是可行的通过我们自己实现的类来实现RIL层的消息机制。
3.4开发框架层
综上所述,将Android RIL移植到基于LINUX的通用平台上是完全可以实现的。RIL只能支持一个套接字连接,一切都是串行处理的。要让它在多任务系统上工作而不互相阻塞,需要封装在更高层。安卓的移动通信相关的业务流程和策略控制都是在框架层用JAVA代码实现的。在Android中称为Telephony,Telephony为上层应用提供并行访问接口。但是一般的LINUX平台不运行JAVA虚拟机,所以AndroidTelephony无法移植,需要开发一个相当于Android Telephony的框架层。
该框架主要用于连接RIL层和应用程序。该框架分为客户端和服务器端。客户端封装成共享库,为应用程序提供函数接口。该函数通过socket与服务器通信。服务器可以支持多个客户端同时连接,序列化客户端对RILD的请求,并将RILD返回的结果异步返回给相应的请求客户端。为了避免阻塞,服务器由三个线程实现,如图3所示。线程一(accept_thread):接收上层应用发送的消息,对应用访问的客户端进行排序,并将发送的消息存储在链表data_queue中;线程2 (sender_thread):将应用消息写入RIL层的接口,依次从链表data_queue中取出消息,依次写入RIL层的接口;线程3 (receiver_thread):将RIL的响应写回应用程序。从RIL层接口读取消息,确定其所属的应用描述符,并写入。
4.搭建验证平台
OpenWrt系统是运行在嵌入式设备上的LINUX系统,主要实现路由器功能,所以PSDATA是其最基础的业务。将OpenWrt系统移植到ARM开发板,加载基带模块。通过移植的RIL层代码,开发板成功接入3G网络。驱动程序将/dev/device枚举为AT_COM,以便与RIL层通信。创建一个网卡设备作为网络通信设备,如图4所示。写一个应用创建一个SOCKET,连接到框架层的服务器,在应用中把PS数据请求写入Parcel。
系统成功ping通网络,验证了移植的RIL层在LINUX平台上运行良好。
5.摘要
在基于LINU X的通用平台上,通过移植成功实现了RIL层的功能和框架层的应用。Android RIL定义了100多种基带通信服务,如电话、短信、PS数据等。在该平台上,可以根据功能需求将所需的请求发送到RIL层,简单、方便、高效地完成这些已定义的服务。移植的RIL层通过基带连接所有的LINUX平台,实现了通用性。
标签:RIL层系统层