APP下载

Android RIL 兼容问题研究

2015-11-28杨明赵

山西电子技术 2015年1期
关键词:二进制调用厂商

杨 倩,杨明赵

(1.重庆理工大学电子信息与自动化学院,重庆 400054;2.重邮信通信科技术有限公司,重庆 400065)

目前的智能设备在硬件上多采用双cpu 的架构,一个是基带处理器,主要处理数字信号、语音信号的编码解码以及无线通信协议,另一个是应用处理器,运行操作系统和各种应用程序。基带处理器、射频和其它外围芯片作为一个模块,成为无线通信modem,应用程序通过AT 命令接口与之交互[4]。

Modem 厂家AT 命令实现各不相同,RIL 正是为了解决适配问题而产生的。本文主要针对Android RIL,通过分析其设计思路,阐述各个modem 厂家在设计RIL 层如何保证兼容性,减少维护成本。

1 框架分析

图1 Android Telephony 子系统

图是Android Telephony 子系统的主要架构,运行Phone APP 的Telephony 框架通过socket 与运行于RIL Daemon 进程的RIL 层进行通信,Android RIL 层是连接Telephony 应用框架和modem 之间的桥梁,将RIL 层更进一步划分成RIL daemon 和vendor RIL 两部分:

图2 Android RIL 层框架

RIL daemon(简称RILD)包含了RIL 层的主要框架,主要功能包括:

1)根据参数,加载特定vendor RIL 库;

2)监听来自Telephony 层的请求消息,分发到vendor RIL;

3)提供回调接口,vendor RIL 可以调用该接口发送结果或者主动上报消息到telephony 层。

vendor RIL 由modem 厂商根据各自的modem 的实际情况来实现,主要内容包括:

1)厂商特有的设备初始化;

2)将AT 交互序列封装成C 接口。

2 问题

从设计架构来看,Android RIL 的设计初衷是modem 厂商只是进行Vendor RIL 实现,而不用去修改RILD,但实际情况是,由于Android 完全开源,很多厂商未遵循该“规则”而进行随意定制,Android 目前除了运行在智能手机外,还被广泛运用于平板电脑、车载系统等,在智能手机上,modem 一般情况下是内置在设备内,而在其他情况下,往往是将modem以外接模块的形式通过USB 等接口接入系统。在智能手机上,因为一般出厂后不会更换modem,厂家尚且可以对RIL进行深度定制,比如支持双卡双待,必需对RIL 框架进行一定的修改;但在其他场景下,需要modem 容易更换,这就要求只能对vendor RIL 进行修改,这就需要RIL 在设计的时候考虑兼容性,终端厂商能够通过根据需要加载不同vendor RIL 即与不同的modem 对接,达到额外的工作最小化目的,减少维护成本。

然而,modem 厂商既需要考虑像手机这样的深度定制需求,又要考虑支持其他情况的一般接口需求,为了减少维护成本,这些定制需求最好能够共享同一版本的vendor RIL,也就是说,需要保证未经定制的RILD 和深度定制过的RILD能够加载和使用同样的vendor RIL 库,保证二进制接口的兼容。要达到该目的,需要对RIL 层进行深入的分析。

3 接口分析

RILD 通过dlopen 加载vendor RIL,通过RIL_Init 接口,交换双方互相访问的回调接口,这些接口是保证双方二进制兼容的重要部分:RIL_RadioFunctions * RIL_Init(const struct RIL_Env *,int,char **)

参数中,RIL_Env 结构体包含了RILD 的提供调用接口,返回值RIL_RadioFunctions 结构体包含了vendor RIL 提供的调用接口。这两个结构体是RILD 和Vendor RIL 之间仅有的桥梁,由于RILD 和Vendor RIL 库是单独编译和链接,要保证所实现的Vendor RIL 与RILD 能够良好的二进制接口兼容,能够在不同的Android 平台上让modem 更加方便地与各种设备对接,需要保证以上这些二进制结构类型不能做任何修改,包括RIL_Init 函数定义、RIL_Env、RIL_RadioFunctions 两个结构体的定义以及其内部的函数指针类型和对应的参数和返回值类型的定义,因为这些结构在RILD 和Vendor RIL 双方共用,一旦这些结构题被单独一方修改,由于双方是单独编译和链接,这个阶段不会产生任何问题,在运行过程中就很可能产生“段错误”。

4 深度定制问题解决方案

前面介绍了一般情况的下的定制需要注意的问题,在实际开发过程中,会有一些特殊定制需求,比如说,目前市场上有一些“双卡双待”手机,modem 可以使用两张sim 卡,使用不同的网络,这要求具有RILD 可以对两张卡进行单独的控制并维护单独的状态机,下面是针对这样需求绘制的简单架构图:

图3 Android 双卡定制RIL 层

对比前面的图2 可以看出,相比前面的普通的单卡情况各种通道数量都增长了一倍,设计过程面临更多的兼容性问题,这种架构需要:1)RILD 提供两个socket,处理请求和response;2)vendor RIL 也需要能够区分调用或者回调针对那一张卡的。

第一条由于socket 通信的双方都是由同一厂家负责设计和实现,所以不会对Vendor RIL 产上兼容性影响。主要问题出现在第二条,因为Android 设计并没有考虑双卡架构,通过前面的接口分析,不能修改RIL_Init、RIL_Env、RIL_RadioFunctions 相关函数的参数个数、类型等,因为这样会影响兼容性,那么要如何做才能够既保证Vendor RIL 的兼容性又保证完成定制需求呢?

在LISP 等函数式编程语言中,函数接口可以实现面向对象语言中的对象的功能,即函数可以包含其创建环境的一些信息,在函数式编程中把这种功能称为closure,C 语言不具备这样的功能,但是可以借鉴这样的思想。通过gcc 的扩展匿名函数__fn__关键字,在RIL_Init 动态创建所需要的函数,并且将其与有关数据结构关联,下面以RIL_RadioFunctions 中的onRequest 为例,描述其创建过程:

可以看到,前面的onRequestEx 函数并不是对外提供的接口,并且比对外接口多了context 参数,参数的类型可以根据需要进行修改,每次外部调用RIL_Init,都会创建符合对外接口类型的的一组类型相同的不同的接口实例,这些接口自身关联了一组数据(context),外部通过调用这些接口区分多个sim 卡,而不用修改接口破坏兼容性。当然,在实际情况中,可能不只两组接口,可能还有音频或者调试相关接口,通过MAX_CHANNEL 可以进行扩展,当然还可以通过一些宏的封装使程序更加简洁,不管怎样,通过这种方式,就解决了“双卡”功能的扩展和兼容性的问题。

5 结束语

通过对Android RIL 架构进行分析,阐述了Android RIL带来的一些兼容性问题,给出了Vendor RIL 在设计过程中的注意事项,并给出了在深度定制过程中保证兼容性的参考实现方式,为RIL 相关开发人员开发出具有良好兼容性和扩展性的产品提供参考。

[1]杨丰盛.Android 技术内幕[M].北京:机械工业出版社,2011.

[2]韩超,梁泉.Android 系统级深入开发:移植与调试[M].北京:电子工业出版社,2011.

[3]王家林.细说Android 4.0 NDK 编程[M].北京:电子工业出版社,2012.

[4]董思博,周园园,王禄禄.基于android 平台的通信系统设计与实现[J].科技传播,2011(7):226.

[5]M.Shen,J.Jiang.Design and Implementation of Radio Interface Layer in Android video Telephone System[G].International Conference on Computer Science and Network Technology (ICCSNT),Vol.3,2011.

[6]William von Hagen.The Definitive Guide to GCC[M].2nd ed.Apress,2006.

猜你喜欢

二进制调用厂商
用二进制解一道高中数学联赛数论题
玩具厂商及合作机构新年进步
核电项目物项调用管理的应用研究
有趣的进度
二进制在竞赛题中的应用
LabWindows/CVI下基于ActiveX技术的Excel调用
厂商对北京卡车市场不抱希望
基于系统调用的恶意软件检测技术研究
考虑产能约束的耐用品厂商易耗部件兼容策略
二进制宽带毫米波合成器设计与分析