隨著移動通信技術的快速發展以及人們對手機功能需求的不斷提高,智能手機逐漸成為人們的日常消費品,智能手機的用戶也與日俱增。為了方便人們的生活,追求雙網雙待已成為手機研發的一種普遍現象。雙網雙待解決了一部手機可以同時接入兩個網絡的難題,的優點是保證了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所示。
圖1中GSM網絡和CDMA網絡分別擁有一套獨立的RIL處理機制,從而可以根據上層不同的Phone服務執行framework層以及RIL層的相應處理,真正實現雙網的協同工作,達到同一手機中雙網雙卡之間互不干擾的效果。
3Android平臺雙網雙待軟件設計
Android平臺雙網雙待功能設計主要涉及到Android軟件平臺的四大功能模塊,分別是Linux內核層、本機庫/運行時、應用程序框架層以及應用程序層。其中在應用程序層利用Android的各種組件API實現PhoneApp并在Linux內核層提供相應的底層驅動。Android系統架構如圖2所示。
(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所示。
在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所示。
呼叫(call)構建于電話服務的基本架構之上。
與呼叫相關的主要用戶接口,其實就是基于ITelephony接口實現Phone應用中的"Phone"服務,通過TelephonyManager提供訪問接口。此服務內部通過PhonyFactory獲取的GSMPhone/CDMAPhone來訪問RIL,提供諸如撥號、接通、掛斷、保持通話等服務功能。Android雙網雙待呼叫部分的結構如圖5所示。
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,通過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雙網同時待機的狀態圖。
5結語
利用Android原有系統架構和本身包含一些Java核心應用程序,通過添加一套新的支持CDMA的RIL來實現基于Android平臺的雙網雙待設計,使得一部手機同時維護兩套獨立的RIL,既支持GSM又支持CDMA,分別對雙SIM卡進行各自獨立的處理,極大地方便了廣大Android手機用戶。Android作為目前被給予厚望的智能手機操作系統,實現雙網雙待必將為其贏得更廣闊的發展空間以及更多的擁護者,也將為未來的發展奠定堅實的基礎。盡管本方案的部分設計還不完善,許多細節的實現還有待解決。但隨著Google對Android版本的不斷升級以及Android應用的不斷豐富,基于Android平臺的雙網雙待設計將會不斷地完善與發展。