陳希文
(武漢郵電科學研究院湖北武漢430074)
安卓系統通話狀態的分析與實現
陳希文
(武漢郵電科學研究院湖北武漢430074)
Android為當前流行的移動終端操作系統。通話功能是Android系統不可或缺的一部分,系統本身提供的功能有限,利用Android系統的開源性,我們可以通過修改通話功能源代碼實現一些系統本身所沒有的功能,滿足不同的需求。文中分析Android系統通話流程,通過對系統源代碼的修改,完成對不同通話狀態的監聽。
安卓系統;通話狀態;源代碼;編譯
Android以其開源、高度可移植性、功能全面等優勢成為當下最為流行的移動終端操作系統[1]。雖然作為一個操作系統不可能同時滿足我們所有應用的需求,在一些特定場合,需要使用到一些Android系統本身沒有的功能,我們就可以利用Android的開源性對系統源碼進行定制修改,編譯生成rom包,讓移動終端使用定制的系統,來滿足我們的需求。
安卓系統采用分層結構,起系統架構如圖1所示。

圖1 Android的系統架構
最上層的App1ication層為應用層,是系統與用戶交互的部分,利用系統提供的功能在這一層實現各種應用,滿足我們的需求;
下面的Framework層,是Android系統提供給應用開發者的一個框架,應用的開發就是在這個框架上進行擴展,通過對各種API與組件的調用來實現不同的功能;
接著是Android系統運行庫層,當使用Android應用框架時,Android系統會通過一些C/C++庫來支持我們使用的各個組件[2],使其能更好地為我們服務;
最底層的是Linux內核層,Android的核心系統服務基于Linux2.6內核,如安全性、內存管理、進程管理、網絡協議棧和驅動模型等都依賴于此內核,實現我們與底層硬件之間的交互,Linux內核同時也作為硬件抽象層隱藏具體硬件細節為上層提供統一的服務。
手機作為移動終端最大的組成部分已經成為我們生活中不可或缺的一部分了,盡管現在我們的智能手機終端有著越來越豐富的功能與內容,但是語音通話作為其最重要的組成部分之一,在未來很長一段時間內都是及其重要,也是不可或缺的。通話功能最終是由Modem來實現的,但是對Modem的操作都是由操作系統來完成的,Android系統的通話實現大體分為App層,Java框架層,RILD層3個部分[3],結構如圖2所示。

圖2 Android通話系統結構
其中App層相關應用屬于Android的應用程序,它負責處理系統與使用者的交互過程,管理我們都輸入,通話記錄聯系人信息等等,同時它還負責將我們輸入的指令下發給框架層以供進一步處理,同時將下方發送過來的信號轉化為可見的信息反應給使用者。其中系統級應用phoneApp是開機啟動的,它將常駐內存中,與其相關的各service注冊事件會一直處于監控運行狀態,以及時處理各種相關事件,并在UI上更新。
在java框架層,通話系統的各功能通過GsmPhone來實現,一方面,它接受上層的各種請求,并將這些請求經RIL_J通過socket傳遞給ri1d守護進程;同時,它也通過其它的處理模塊監聽處理RIL_Java獲取的事件,并將其更新到相關的上層模塊中。其中框架層里的RIL_Java在本質上就是一個RIL代理,起轉發作用,是Android系統在Java概念空間中的電話系統的起點。RIL_Java通過連接RILD建立的偵聽套接口,來發起請求,并等待應答,同時將結構發送到目標處理對象[4]。
所有的通話動作最終都要由Modem來實現,不同的Modem,各種指令格式等都可能不一樣,對底層Modem的操作主要由RIL來完成。RIL層分為兩個部分:RILD管理框架,AT相關的xxxri1.so動態鏈接庫。系統對Modem的操作通常通過AT命令來進行,RILD管理框架部分是具體的AT指令應答解析者。從最基本的功能來講,ri1建立了一個偵聽Socket,等待客戶端的連接,然后從該連接上讀取RIL_Java成傳遞來的命令并轉化成AT指令發送到Modem。并等待Modem的回應,然后將結果通過套接口傳回到Ri1_Java層。AT相關的xxxri1.so動態鏈接庫則是AT指令合成者,它由不同的廠商為自己所使用的不同Modem所配置的AT命令的集合,這種結構的好處就是分離了管理AT指令的操作和具體不同Modem所需命令格式的差異。
3.1定制需求
通話功能中有一個很重要的部分就是對于不同通話狀態的監管和處理,對一般android系統,我們可通過Te1ephonyManager為我們提供的PhoneStateListener()監聽來監聽不同的通話狀態來進行相應的處理,然而系統出于安全等因素的考慮只為我們提供了
Te1ephonyManager.CALL_STATE_IDLE(空閑)j
Te1ephonyManager.CALL_STATE_RINGING(來電響鈴)j
Te1ephonyManager.CALL_STATE_OFFHOOK(摘機)j3種狀態,而系統的ca11類有IDLE,ACTIVE,HOLDING,DIALING,ALERTING,INCOMING,WAITING,DISCONNECTED,DISCONNECTING九種狀態[5],當我們需要監聽系統提供的3種狀態以為的其他狀態時,如我們需要監聽撥打電話,對方響鈴的狀態(即ALERTING狀態),并進行相關處理時,我們需要對系統進行定制修改,通過修改系統的代碼,然后編譯生成新的rom包,為終端刷入我們定制的系統來使用。
3.2通話狀態分析與源碼修改
通話功能最終是由Modem來實現的,所以不同的通話狀態及其改變過程都是來自于Modem的,Modem會將這些信息通過串口方式返回給RILC,再由RILC返回給RILJ。
作為通話系統框架層中最重要的一個類GsmCa11Tracker(位置為frameworksopt e1ephonysrcjavacomandroidinterna1 e1ephonygsmGsmCa11Tracker.java)是Android系統的通話管理部分,它在本質上其實是一個Hand1er,它通過建立一個列表來對現行的所有通話進行管理,GsmCa11Tracker在構造時就將自己登記到了電話狀態變化通知表中。RIL_Java一收到電話狀態變化的通知,就會使用VENT_CALL_ESTATE_CHANGE通知到GSMCa11Tacker,并向上層提供電話調用接口,GSMCa11-Tacker把在電話狀態變化通知表里所有通話分為3類:
RingingCa11:INCOMING,WAITING(未接通的來電)
ForegourndCa11:ACTIVE,DIALING,ALERTING(接通的通話)
BackgroundCa11:HOLDING(保持狀態的通話)
上層函數通過getRingCa11(),getForegrouandCa11()等來獲得電話系統中特定通話連接。
GsmCa11Tracker在收到狀態變化的信息之后會首先對狀態進行歸類,然后通過updatePhoneState()方法來更新phone狀態的變化,我們在

內只有3個狀態,所以我們需要在pub1ic static fina1 int CALL_STATE_OFFHOOK=2j之后添加pub1ic static fina1 int CALL_STATE_ALERTING=3j即可。
3.3定制系統的使用
通過以上對通話狀態的分析與源代碼的修改,我們實現了外部應用通過Te1ephonyManager來獲取ALERTING狀態,修改過后的源代碼需要經過編譯以生成我們可以使用的rom包。安卓系統的編譯需要在Linux環境下完成,完成環境配置之后進入我們系統代碼所在目錄使用以下命令進行編譯:
source bui1d/envsetup.sh
(用來將envsetup.sh里的所有用到的命令加載到環境變量里去)
1unch cm_bacon_userdebug
(用來選擇編譯的產品與類型)make bacon-j4
(開始編譯,其中_j4中的4代表你CPU的線程數,試編譯所使用機器的性能自行選擇,這里我們選擇4就是開啟4個線程一起編譯)
編譯完成后,會在out/target/product目錄下生成rom包統[6],最后使用刷機工具如刷機精靈將編譯好的rom包刷入移動終端就可以了,在我們的定制系統內我們可以使用PhoneStateListener()來對去電接通瞬間的狀態進行監聽了,在pub1ic void onCa11StateChanged(int state,String incomingNumber)內,當state為3時即系統處于ALERTING狀態。
本文介紹了Android操作系統內通話系統的大致結構,重點闡述通話狀態的變化在系統中的上報流程。在一些特定的需求下,我們通過一般手段無法實現的功能,如對更多通話狀態進行監聽的時候,我們可以采取對系統源代碼進行定制修改,并編譯生成新的rom包,通過刷機的方法為移動終端寫入我們自己定制的操作系統來使用。
[1]Sy1vain Rataboui1.Android NDK Beginner's Guide[M].Packt Pub1ishing,2012.
[2]王家林,王家俊,王家虎.Android高級開發實戰:UI、NDK與安全[M].北京:電子工業出版社,2013.
[3]吳延昌,馮萍,蘇聰.基于J2ME技術的應用開發與研究[J].微電子與計算機,2005,22(9):126_131.
[4]Gartner.wor1dwide smartphone sa1es in Q3 2013[EB/0L].[2014_ 01_08].http://www.gartner.com/newsroom,Id/2623415.
[5]Na'ona1 Vu1nerabi1ity Database,Vu1nerabmty summary for CVE_2012—0056[EB/OL].[2013—12一09].http://web.nvd. nist.gov,view7vu1n/detai1?vu1nId—cVE_201z—0056&cid_2.
[6]Symp Inc,2008:125—133Shi Y,Casey K,Ert1 M A,et a1. Virtua1 machine showdown:Stack ver$t1s registem[J].ACM Tram.Archit.Code Optim,2008,4(4):1_36.
Analysls and lmPlementatlon of androld communlcatlon state
CHEN Xi_wen
(Wuhan Research Institute of Posts and Telecommunications,Wuhan 430074,China)
Android is the popu1ar mobi1e operating system.Phone function is an integra1 part of the system,the system itse1f provides 1imited functiona1ity,the use of open_source Android system,we can achieve some of the system itse1f does not have the function ca11s by modifying the source code,to meet different needs.This paper ana1yzes the Android system ca11 f1ow through the system source code modifications,comp1etion of the different ca11 state monitoring.
android;intercom state;source code;compi1e
TN916.7
A
1674_6236(2016)10_0150_03
2015_06_11稿件編號:201506126
陳希文(1989—),男,河南信陽人,碩士研究生。研究方向:信號與信息系統。