From 这里

摘要:为实现Android 平台上的双网双待功能,研究Android 平台的系统架构以及Android framework 层上已经实现的双卡处理机制。提出一种在无线接口层( RIL) 上依样建立一套新的RIL Driver 处理机制,从而将双卡分别进行处理的方法。实现基于Android系统平台的GSM 和CDMA 双网双待机制,对Android 系统平台和主要的Phone 应用模块进行了详细的分析。结果表明,在Android系统原有架构基础上进行双网双待设计,具有简单、易扩展的优点,且更好地满足广大Android 手机用户的需求。

  0 引言

智能手机逐渐成为人们的日常消费品,智能手机的用户也与日俱增。为了方便人们的生活,追求双网双待已成为手机研发的一种普遍现象。双网双待解决了一部手机可以同时接入两个网络的难题,最大的优点是保证了GSM 与CDMA 两种网络在同一手机中同时工作,真正实现了两网自由连通。双网的连通还具有差异化优势,可以将CDMA 较高的接入速度和通信保密等强大功能体现在终端方面,使双网双待手机用户能够尽享CDMA 网络支持的丰富多彩的数据增值业务。同时GSM 与CDMA 两网的和谐整合将为手机厂商带来巨大的市场价值。

  Android 作为当前众多智能手机系统平台的后起之秀,以其优势正逐渐获得广大手机开发人员和手机消费者的青睐。实现双网双待也必将成为Android 不断创新和发展的重要因素。

  Android 系统由嵌入式Linux 和Java 构成,因此基于Android 系统平台的双网双待设计区别于其他手机对双网双待的实现,它充分地利用了Android 平台清晰的系统架构、简易的工作原理和已经实现的部分Phone 核心应用程序进行双网双待的功能扩展,提高了Android 平台双网双待设计的效率。

  1 Android 操作系统介绍

  Android 是Google 于2007 年11 月份宣布的基于Linux 2. 6. 23平台的开源手机操作系统,号称是首个为移动终端打造的真正开放和完整的移动软件。Google 重新设计了Android Java 虚拟机和系统,使得Android 的Java 应用更接近于底层系统,效率更高; 另外使用虚拟机技术使得Android 的应用在被监控的情况下运行,安全性更高。Android 包括移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍,具有平台标准化、用户可定制以及服务免费等特色,是一个对第三方软件完全开放的平台,突破了iPhone 等只能添加为数不多的固定软件的枷锁; 同时与Windows Mobile、Symbian、iPhone OS 等厂商不同,Android 操作系统免费向开发人员提供,大大节省了开发成本。

  Android 平台由操作系统、中间件、用户界面和应用软件组成。Linux 内核层用来提供系统的底层服务,位于硬件和其他软件之间。Android 运行库包含一组核心库和Dalvik 虚拟机,Android 提供丰富的类库支持且大部分为开源代码,如采用嵌入式数据库SQLite.应用框架层为Android 开发人员提供了访问框架应用程序接口的全部权限,采用结构化设计简化了组件间的重用。在应用程序层,Android 本身附带了一些核心的应用程序,大大简化了Android 应用程序的开发。

  因此,利用Android 平台更易于开发具有双网双待功能的智能手机系统,同时也便于在原有系统的基础上进行不断的完善和功能扩展。

  2 Android 平台双网双待框架设计

  Android 平台上实现的双网双待手机是将GSM 网络和CDMA网络相结合,使得一部手机可同时插入两张不同网络的号卡,并同时处于开机状态,用户无需切换网络,即可任意拨打、接听和收发短信,且这些手机均可支持中国电信自有的增值业务,使商务人士尽享移动办公的自由以及休息娱乐的乐趣。此外,用户还可预设接听和拨打电话的顺序,使用起来非常方便。

ARM( modem) 侧的实现机制。通过在RIL 上依样建立一套新的处理机制,将双卡分别进行处理。

  比如,打电话的时候,发送哪套请求就先选择向哪套机制发送请求,然后还在这套机制中等待消息的返回。Android 平台双网双待框架如图1 所示。

android双卡api 双卡安卓手机_android双卡api

图1 Android 平台双网双待框架

  图1 中GSM 网络和CDMA 网络分别拥有一套独立的RIL处理机制,从而可以根据上层不同的Phone 服务执行framework层以及RIL 层的相应处理,真正实现双网的协同工作,达到同一手机中双网双卡之间互不干扰的效果。

  3 Android 平台双网双待软件设计

  Android 平台双网双待功能设计主要涉及到Android 软件平台的四大功能模块,分别是Linux 内核层、本机库/运行时、应用程序框架层以及应用程序层。其中在应用程序层利用Android的各种组件API 实现PhoneApp 并在Linux 内核层提供相应的底层驱动。Android 系统架构如图2 所示。

android双卡api 双卡安卓手机_平台_02

图2 Android 系统架构

( 1) Linux 内核。

CPU 以及Android 运行所需的特定驱动代码。该层用来提供系统的底层服务,提供诸如内存管理、进程管理、设备驱动、安全管理、电源管理等驱动模块,作为一个虚拟的中间层,该层位于硬件与其他软件层之间,采用YAFFS2 文件系统,同时也是手机软硬件的连接层。在系统开发中,也需要针对自身的硬件模块添加对应的驱动,如Phone 驱动、GPRS 驱动、GPS 驱动、液晶和触摸板驱动等。

  ( 2) 本机库/Android 运行时。

人机界面友好的应用程序接口,极大地缩短了开发过程。

  Android 运行时包含一组Java 内核库和Dalvik 虚拟机,它们有效地优化了Java 程序的运行过程。

  ( 3) 应用程序框架层。

  Android 应用程序开发是基于框架和组件的,该层提供了在创建应用程序时需要使用的各种高级构建块,因此在该层中,开发人员拥有访问框架API 的全部权限,在开发应用程序时调用Android 本身自带的许多组件,也可以开发新的组件,并将该组件放入应用程序框架中,以供自己和其它应用程序调用,这样的模块大大提高了应用程序的开发效率。

  ( 4) 应用程序层。

相机、播放器、充电相框等。

  3. 1 Android 双网双待实现方案

  在GSM 单模状态下通过添加一套支持CDMA 的无线接口层RIL 来实现双网双待机制的方案如图3 所示。

android双卡api 双卡安卓手机_手机_03

图3 Android 双网双待电话部分结构

  在PhoneAPP 中new 一个GSMPhone 和一个CDMAPhone,分别对应两种framework ( 不同的CallTracker) 和RIL ( 不同的RIL) ,实现单模向双网双待的改进。

ST

  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. 2 Android RIL 层的改进

  在Android 系统中RIL 是电话系统的本地实现,它提供了Android 电话服务( android. telephony) 与无线电硬件之间的抽象层,主要负责AT 命令的发送和响应解析,这也是电话服务的实现基础。另外,RIL 还负责数据的可靠传输。因此RIL 在Android电话部分起核心作用。本方案设计过程中主要涉及到RIL以下四个部分的修改:

socket

  ( 2) 无线电仲裁管理者( Radio Service Arbitration Manager),这是实现双网双待方案中新增加的模块,主要用来为每个RIL 实例进行语音和短消息业务的仲裁,数据服务的仲裁由MODEM 来进行。

AMSS 事件到通信服务管理模块进行的处理。

  ( 4) 无线电服务管理者( Radio Service Manager) ,Android 通话应用首先需要通过子系统信息来从framework 层获得通话服务,然后每个SIM 卡子系统将会映射到一个特定的RIL 实例ID上,服务管理将使用RIL 实例的ID 来识别子系统ID 中DSS API的参数。



3. 3 Android 双网双待通话机制的实现

串口或者USB 虚拟串口向modem 侧发送AT 指令的方式,进行实际的无线通信。比如,UI上层向RIL 层发送RIL_REQUEST_DIAL 请求,RIL 层在接收到该请求的时候,通过串口向modem 发送"AT***"命令,发起呼叫,当然,最终真正实现通话的是modem 侧的功能,此时,与Android 就无关了。Android 平台RIL 与modem 的工作原理如图4 所示。

android双卡api 双卡安卓手机_电话_04

图4 RIL 与modem 的工作原理

  呼叫( call) 构建于电话服务的基本架构之上。

  与呼叫相关的主要用户接口,其实就是基于ITelephony 接口实现Phone 应用中的"Phone"服务,通过TelephonyManager 提供访问接口。此服务内部通过PhonyFactory 获取的GSMPhone /CDMAPhone 来访问RIL,提供诸如拨号、接通、挂断、保持通话等服务功能。Android 双网双待呼叫部分的结构如图5 所示。

android双卡api 双卡安卓手机_android_05

图5 android 双网双待呼叫部分结构

  Android 系统双网双待呼叫部分的实现,从GSMPhone /CDMAPhone到对应RIL 的路径中间主要涉及几个关键数据结构,即GSMCall /CDMACall、CallNotifiter、GSMConnection /CDMAConnection、CallTracker 等类。

  其中GSMCall 和CDMAPhone 都继承Call 基类,提供基本的呼叫控制结构以及呼叫状态,如Hold、Active 等信息,每个接通的GSMCall / CDMACall 都拥有一个或多个( conference call)GSMConnection /CDMAConnection 结构,用于维护呼叫时长等相关信息。CallTracker 是呼叫模块的核心,它提供与呼叫相关的接口,如通话、挂断等。GSMPhone /CDMAPhone 拥有CallTracker的实例,并封装相应的接口,这个接口通过调用GSMPhone /CDMAPhone中的CommandsInterface 实现,即提交的RIL 封装。

  除此之外,CallTracker 还维护当前的GSMCall 和CDMACall列表,保持对所有呼叫状态的追踪,提供对来去电等呼叫状态的管理。实现追踪的方法为pollCallsWhenSafe,通过CommandsInterface的getCurrentCalls 接口获取当前活动的呼叫列表。这一操作的底层实现为AT + CLCC( 不同的Modem 实现可能不同) ,这是从Modem 获取呼叫状态列表的主要接口。回调通过ENENT_ POLL _ CALLS-RESULT 完成,回调函数为handlePollCalls,这是获取Modem 中实际呼叫信息的核心方法,也是Tracker的含义所在。handlePollCalls 完成实际的追踪功能,根据底层上报的Outgoing、Incomming 以及Active、Hold 等状态更新Call列表的信息,每个呼叫在其生命周期内的状态转换,在Call-Tracker 中都可得到体现,并将这些变化信息及时通知其关注者,也就是实现Phone 的应用。

  4 结果分析

  基于Android 操作系统实现的双网双待功能模块设计,利用Android 通用的系统架构和设备无关的应用程序开发平台,实现了双网双待单通系统电话部分的框架设计和上层Phone 应用程序设计。改进后的Android 系统平台同时支持GSM 和CDMA两种网络同时待机,这大大方便了许多拥有两张手机卡并且不在同一制式网络的用户。图6 为Android 系统平台上GSM和CDMA 双网同时待机的状态图。

android双卡api 双卡安卓手机_android双卡api_06

图6 GSM 和CDMA 双网同时待机界面

  5 结语

  利用Android 原有系统架构和本身包含一些Java 核心应用程序,通过添加一套新的支持CDMA 的RIL 来实现基于Android平台的双网双待设计,使得一部手机同时维护两套独立的RIL,既支持GSM 又支持CDMA,分别对双SIM 卡进行各自独立的处理,极大地方便了广大Android 手机用户。Android 作为目前被给予厚望的智能手机操作系统,实现双网双待必将为其赢得更广阔的发展空间以及更多的拥护者,也将为未来的发展奠定坚实的基础。尽管本方案的部分设计还不完善,许多细节的实现还有待解决。但随着Google 对Android 版本的不断升级以及Android 应用的不断丰富,基于Android 平台的双网双待设计将会不断地完善与发展。