随着移动通信技术的快速发展以及人们对手机功能需求的不断提高,智能手机逐渐成为人们的日常消费品,智能手机的用户也与日俱增。为了方便人们的生活,追求双网双待已成为手机研发的一种普遍现象。双网双待解决了一部手机可以同时接入两个网络的难题,最大的优点是保证了GSM与CDMA两种网络在同一手机中同时工作,真正实现了两网自由连通。双网的连通还具有差异化优势,可以将CDMA较高的接入速度和通信保密等强大功能体现在终端方面,使双网双待手机用户能够尽享CDMA网络支持的丰富多彩的数据增值业务。同时GSM与CDMA两网的和谐整合将为手机厂商带来巨大的市场价值。Android作为当前众多智能手机系统平台的后起之秀,以其优势正逐渐获得广大手机开发人员和手机消费者的青睐。实现双网双待也必将成为Android不断创新和发展的重要因素。Android系统由嵌入式Linux和Java构成,因此基于Android系统平台的双网双待设计区别于其他手机对双网双待的实现,它充分地利用了Android平台清晰的系统架构、简易的工作原理和已经实现的部分Phone核心应用程序进行双网双待的功能扩展,提高了Android平台双网双待设计的效率。1Android操作系统介绍Android是Google于2007年11月份宣布的基于Linux2.6.23平台的开源手机操作系统,号称是首个为移动终端打造的真正开放和完整的移动软件。Google重新设计了AndroidJava虚拟机和系统,使得Android的Java应用更接近于底层系统,效率更高;另外使用虚拟机技术使得Android的应用在被监控的情况下运行,安全性更高。Android包括移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍,具有平台标准化、用户可定制以及服务免费等特色,是一个对第三方软件完全开放的平台,突破了iPhone等只能添加为数不多的固定软件的枷锁;同时与WindowsMobile、Symbian、iPhoneOS等厂商不同,Android操作系统免费向开发人员提供,大大节省了开发成本。Android平台由操作系统、中间件、用户界面和应用软件组成。Linux内核层用来提供系统的底层服务,位于硬件和其他软件之间。Android运行库包含一组核心库和Dalvik虚拟机,Android提供丰富的类库支持且大部分为开源代码,如采用嵌入式数据库SQLite.应用框架层为Android开发人员提供了访问框架应用程序接口的全部权限,采用结构化设计简化了组件间的重用。在应用程序层,Android本身附带了一些核心的应用程序,大大简化了Android应用程序的开发。因此,利用Android平台更易于开发具有双网双待功能的智能手机系统,同时也便于在原有系统的基础上进行不断的完善和功能扩展。2Android平台双网双待框架设计Android平台上实现的双网双待手机是将GSM网络和CDMA网络相结合,使得一部手机可同时插入两张不同网络的号卡,并同时处于开机状态,用户无需切换网络,即可任意拨打、接听和收发短信,且这些手机均可支持中国电信自有的增值业务,使商务人士尽享移动办公的自由以及休息娱乐的乐趣。此外,用户还可预设接听和拨打电话的顺序,使用起来非常方便。基于Android系统平台的双网双待的设计,充分结合了Android2.1版本之后在framework层上已经实现的双卡处理机制,设计方案主要侧重于RIL及ARM(modem)侧的实现机制。通过在RIL上依样建立一套新的处理机制,将双卡分别进行处理。比如,打电话的时候,发送哪套请求就先选择向哪套机制发送请求,然后还在这套机制中等待消息的返回。Android平台双网双待框架如图1所示。图1Android平台双网双待框架图1中GSM网络和CDMA网络分别拥有一套独立的RIL处理机制,从而可以根据上层不同的Phone服务执行framework层以及RIL层的相应处理,真正实现双网的协同工作,达到同一手机中双网双卡之间互不干扰的效果。3Android平台双网双待软件设计Android平台双网双待功能设计主要涉及到Android软件平台的四大功能模块,分别是Linux内核层、本机库/运行时、应用程序框架层以及应用程序层。其中在应用程序层利用Android的各种组件API实现PhoneApp并在Linux内核层提供相应的底层驱动。Android系统架构如图2所示。图2Android系统架构(1)Linux内核。Android系统平台是基于优化的Linux内核来开发的,主要添加了一个名为Goldfish的虚拟CPU以及Android运行所需的特定驱动代码。该层用来提供系统的底层服务,提供诸如内存管理、进程管理、设备驱动、安全管理、电源管理等驱动模块,作为一个虚拟的中间层,该层位于硬件与其他软件层之间,采用YAFFS2文件系统,同时也是手机软硬件的连接层。在系统开发中,也需要针对自身的硬件模块添加对应的驱动,如Phone驱动、GPRS驱动、GPS驱动、液晶和触摸板驱动等。(2)本机库/Android运行时。这些共享库都是利用C和C++语言编写的,且针对电话使用的特定的硬件架构进行了编译,并已由手机制造商预先安装到手机上。本机库主要包含:标准C函数库、媒体功能库、浏览器引擎、2D和3D图形库及SQLite引擎等。开发者利用这些功能可以方便地开发出人机界面友好的应用程序接口,极大地缩短了开发过程。Android运行时包含一组Java内核库和Dalvik虚拟机,它们有效地优化了Java程序的运行过程。(3)应用程序框架层。Android应用程序开发是基于框架和组件的,该层提供了在创建应用程序时需要使用的各种高级构建块,因此在该层中,开发人员拥有访问框架API的全部权限,在开发应用程序时调用Android本身自带的许多组件,也可以开发新的组件,并将该组件放入应用程序框架中,以供自己和其它应用程序调用,这样的模块大大提高了应用程序的开发效率。(4)应用程序层。Android本身包含一些由Java开发的核心应用程序,如桌面、短信收发程序、日历、电话通讯录、浏览器、E-mail客户端等,开发者还可以在此基础上开发出更多具有特色的Android应用程序,如特效相机、播放器、充电相框等。3.1Android双网双待实现方案在GSM单模状态下通过添加一套支持CDMA的无线接口层RIL来实现双网双待机制的方案如图3所示。图3Android双网双待电话部分结构在PhoneAPP中new一个GSMPhone和一个CDMAPhone,分别对应两种framework(不同的CallTracker)和RIL(不同的RIL),实现单模向双网双待的改进。图中CallLiST主要用来管理两个电话之间的切换,以避免如挂掉某一个通话却导致另一个的通话也结束等一系列界面显示出错问题。CallList模块管理两个电话以及这两个电话所有的通话,通过一个CallList表来存储两个电话的所有呼叫。上层界面调用这个CallList表来处理两个电话的切换。在framework中new一个CallList的类来存储phone的多个电话以便上层显示。CallList类中包含attached(),detach(),update(),clear(),get-CurrentCall(),getDefault()等方法。使得两个Phone的Call得到控制。挂掉的时候就从表中删除,来电话的时候加入表中。上层显示的时候,只要调用CallList中的最后存入Call就不会出现界面出错的情况。在包含GSM网络和CDMA网络的双网双待模块中,因为有了CDMA部分的整合不少代码已经发生改变,原来的CallTracker只被GSM使用,在这里改为CallTracker和GsmCallTracker,抽象出CallTracker基类,使其也可以被CDMA利用;GSMCall变成GsmCall,更加符合统一的命名规则;另外,比如pppd的启动部分,也从Java框架层放到RIL层。3.2AndroidRIL层的改进在Android系统中RIL是电话系统的本地实现,它提供了Android电话服务(android.telephony)与无线电硬件之间的抽象层,主要负责AT命令的发送和响应解析,这也是电话服务的实现基础。另外,RIL还负责数据的可靠传输。因此RIL在Android电话部分起核心作用。本方案设计过程中主要涉及到RIL以下四个部分的修改:(1)由于本方案维护两个RIL实例,因此RIL实例管理者(RILinstanceManager)需要各自负责与androidtelephony通过socket进行连接。每个RIL实例针对各自的SIM卡提供专用的通信通道来进行modem侧的通信服务。(2)无线电仲裁管理者(RadioServiceArbitrationManager),这是实现双网双待方案中新增加的模块,主要用来为每个RIL实例进行语音和短消息业务的仲裁,数据服务的仲裁由MODEM来进行。(3)RIL事件分配机(RILEventDispatcher),用于分配RIL请求及AMSS事件到通信服务管理模块进行的处理。(4)无线电服务管理者(RadioServiceManager),Android通话应用首先需要通过子系统信息来从framework层获得通话服务,然后每个SIM卡子系统将会映射到一个特定的RIL实例ID上,服务管理将使用RIL实例的ID来识别子系统ID中DSSAPI的参数。3.3Android双网双待通话机制的实现Android系统电话服务的实现基础是RIL.在Android单模状态下的RIL同TI等平台类似,均使用了Google默认的参考接口,也就是通过打开modem侧提供的串口或者USB虚拟串口向modem侧发送AT指令的方式,进行实际的无线通信。比如,UI上层向RIL层发送RIL_REQUEST_DIAL请求,RIL层在接收到该请求的时候,通过串口向modem发送AT***命令,发起呼叫,当然,最终真正实现通话的是modem侧的功能,此时,与Android就无关了。Android平台RIL与modem的工作原理如图4所示。图4RIL与modem的工作原理呼叫(call)构建于电话服务的基本架构之上。与呼叫相关的主要用户接口,其实就是基于ITelephony接口实现Phone应用中的Phone服务,通过TelephonyManager提供访问接口。此服务内部通过PhonyFactory获取的GSMPhone/CDMAPhone来访问RIL,提供诸如拨号、接通、挂断、保持通话等服务功能。Android双网双待呼叫部分的结构如图5所示。图5android双网双待呼叫部分结构Android系统双网双待呼叫部分的实现,从GSMPhone/CDMAPhone到对应RIL的路径中间主要涉及几个关键数据结构,即GSMCall/CDMACall、CallNotifiter、GSMConnection/CDMAConnection、CallTracker等类。其中GSMCall和CDMAPhone都继承Call基类,提供基本的呼叫控制结构以及呼叫状态,如Hold、Active等信息,每个接通的GSMCall/CDMACall都拥有一个或多个(conferencecall)GSMConnection/CDMAConnection结构,用于维护呼叫时长等相关信息。CallTracker是呼叫模块的核心,它提供与呼叫相关的接口,如通话、挂断等。GSMPhone/CDMAPhone拥有CallTracker的实例,并封装相应的接口,这个接口通过调用GSMPhone/CDMAPhone中的CommandsInterface实现,即提交的RIL封装。除此之外,CallTracker还维护当前的GSMCall和CDMACall列表,保持对所有呼叫状态的追踪,提供对来去电等呼叫状态的管理。实现追踪的方法为pollCallsWhenSafe,通过Comman