陳希文
(武漢郵電科學(xué)研究院湖北武漢430074)
安卓系統(tǒng)通話狀態(tài)的分析與實現(xiàn)
陳希文
(武漢郵電科學(xué)研究院湖北武漢430074)
Android為當(dāng)前流行的移動終端操作系統(tǒng)。通話功能是Android系統(tǒng)不可或缺的一部分,系統(tǒng)本身提供的功能有限,利用Android系統(tǒng)的開源性,我們可以通過修改通話功能源代碼實現(xiàn)一些系統(tǒng)本身所沒有的功能,滿足不同的需求。文中分析Android系統(tǒng)通話流程,通過對系統(tǒng)源代碼的修改,完成對不同通話狀態(tài)的監(jiān)聽。
安卓系統(tǒng);通話狀態(tài);源代碼;編譯
Android以其開源、高度可移植性、功能全面等優(yōu)勢成為當(dāng)下最為流行的移動終端操作系統(tǒng)[1]。雖然作為一個操作系統(tǒng)不可能同時滿足我們所有應(yīng)用的需求,在一些特定場合,需要使用到一些Android系統(tǒng)本身沒有的功能,我們就可以利用Android的開源性對系統(tǒng)源碼進(jìn)行定制修改,編譯生成rom包,讓移動終端使用定制的系統(tǒng),來滿足我們的需求。
安卓系統(tǒng)采用分層結(jié)構(gòu),起系統(tǒng)架構(gòu)如圖1所示。
圖1 Android的系統(tǒng)架構(gòu)
最上層的App1ication層為應(yīng)用層,是系統(tǒng)與用戶交互的部分,利用系統(tǒng)提供的功能在這一層實現(xiàn)各種應(yīng)用,滿足我們的需求;
下面的Framework層,是Android系統(tǒng)提供給應(yīng)用開發(fā)者的一個框架,應(yīng)用的開發(fā)就是在這個框架上進(jìn)行擴(kuò)展,通過對各種API與組件的調(diào)用來實現(xiàn)不同的功能;
接著是Android系統(tǒng)運(yùn)行庫層,當(dāng)使用Android應(yīng)用框架時,Android系統(tǒng)會通過一些C/C++庫來支持我們使用的各個組件[2],使其能更好地為我們服務(wù);
最底層的是Linux內(nèi)核層,Android的核心系統(tǒng)服務(wù)基于Linux2.6內(nèi)核,如安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動模型等都依賴于此內(nèi)核,實現(xiàn)我們與底層硬件之間的交互,Linux內(nèi)核同時也作為硬件抽象層隱藏具體硬件細(xì)節(jié)為上層提供統(tǒng)一的服務(wù)。
手機(jī)作為移動終端最大的組成部分已經(jīng)成為我們生活中不可或缺的一部分了,盡管現(xiàn)在我們的智能手機(jī)終端有著越來越豐富的功能與內(nèi)容,但是語音通話作為其最重要的組成部分之一,在未來很長一段時間內(nèi)都是及其重要,也是不可或缺的。通話功能最終是由Modem來實現(xiàn)的,但是對Modem的操作都是由操作系統(tǒng)來完成的,Android系統(tǒng)的通話實現(xiàn)大體分為App層,Java框架層,RILD層3個部分[3],結(jié)構(gòu)如圖2所示。
圖2 Android通話系統(tǒng)結(jié)構(gòu)
其中App層相關(guān)應(yīng)用屬于Android的應(yīng)用程序,它負(fù)責(zé)處理系統(tǒng)與使用者的交互過程,管理我們都輸入,通話記錄聯(lián)系人信息等等,同時它還負(fù)責(zé)將我們輸入的指令下發(fā)給框架層以供進(jìn)一步處理,同時將下方發(fā)送過來的信號轉(zhuǎn)化為可見的信息反應(yīng)給使用者。其中系統(tǒng)級應(yīng)用phoneApp是開機(jī)啟動的,它將常駐內(nèi)存中,與其相關(guān)的各service注冊事件會一直處于監(jiān)控運(yùn)行狀態(tài),以及時處理各種相關(guān)事件,并在UI上更新。
在java框架層,通話系統(tǒng)的各功能通過GsmPhone來實現(xiàn),一方面,它接受上層的各種請求,并將這些請求經(jīng)RIL_J通過socket傳遞給ri1d守護(hù)進(jìn)程;同時,它也通過其它的處理模塊監(jiān)聽處理RIL_Java獲取的事件,并將其更新到相關(guān)的上層模塊中。其中框架層里的RIL_Java在本質(zhì)上就是一個RIL代理,起轉(zhuǎn)發(fā)作用,是Android系統(tǒng)在Java概念空間中的電話系統(tǒng)的起點(diǎn)。RIL_Java通過連接RILD建立的偵聽套接口,來發(fā)起請求,并等待應(yīng)答,同時將結(jié)構(gòu)發(fā)送到目標(biāo)處理對象[4]。
所有的通話動作最終都要由Modem來實現(xiàn),不同的Modem,各種指令格式等都可能不一樣,對底層Modem的操作主要由RIL來完成。RIL層分為兩個部分:RILD管理框架,AT相關(guān)的xxxri1.so動態(tài)鏈接庫。系統(tǒng)對Modem的操作通常通過AT命令來進(jìn)行,RILD管理框架部分是具體的AT指令應(yīng)答解析者。從最基本的功能來講,ri1建立了一個偵聽Socket,等待客戶端的連接,然后從該連接上讀取RIL_Java成傳遞來的命令并轉(zhuǎn)化成AT指令發(fā)送到Modem。并等待Modem的回應(yīng),然后將結(jié)果通過套接口傳回到Ri1_Java層。AT相關(guān)的xxxri1.so動態(tài)鏈接庫則是AT指令合成者,它由不同的廠商為自己所使用的不同Modem所配置的AT命令的集合,這種結(jié)構(gòu)的好處就是分離了管理AT指令的操作和具體不同Modem所需命令格式的差異。
3.1定制需求
通話功能中有一個很重要的部分就是對于不同通話狀態(tài)的監(jiān)管和處理,對一般android系統(tǒng),我們可通過Te1ephonyManager為我們提供的PhoneStateListener()監(jiān)聽來監(jiān)聽不同的通話狀態(tài)來進(jìn)行相應(yīng)的處理,然而系統(tǒng)出于安全等因素的考慮只為我們提供了
Te1ephonyManager.CALL_STATE_IDLE(空閑)j
Te1ephonyManager.CALL_STATE_RINGING(來電響鈴)j
Te1ephonyManager.CALL_STATE_OFFHOOK(摘機(jī))j3種狀態(tài),而系統(tǒng)的ca11類有IDLE,ACTIVE,HOLDING,DIALING,ALERTING,INCOMING,WAITING,DISCONNECTED,DISCONNECTING九種狀態(tài)[5],當(dāng)我們需要監(jiān)聽系統(tǒng)提供的3種狀態(tài)以為的其他狀態(tài)時,如我們需要監(jiān)聽撥打電話,對方響鈴的狀態(tài)(即ALERTING狀態(tài)),并進(jìn)行相關(guān)處理時,我們需要對系統(tǒng)進(jìn)行定制修改,通過修改系統(tǒng)的代碼,然后編譯生成新的rom包,為終端刷入我們定制的系統(tǒng)來使用。
3.2通話狀態(tài)分析與源碼修改
通話功能最終是由Modem來實現(xiàn)的,所以不同的通話狀態(tài)及其改變過程都是來自于Modem的,Modem會將這些信息通過串口方式返回給RILC,再由RILC返回給RILJ。
作為通話系統(tǒng)框架層中最重要的一個類GsmCa11Tracker(位置為frameworksopt e1ephonysrcjavacomandroidinterna1 e1ephonygsmGsmCa11Tracker.java)是Android系統(tǒng)的通話管理部分,它在本質(zhì)上其實是一個Hand1er,它通過建立一個列表來對現(xiàn)行的所有通話進(jìn)行管理,GsmCa11Tracker在構(gòu)造時就將自己登記到了電話狀態(tài)變化通知表中。RIL_Java一收到電話狀態(tài)變化的通知,就會使用VENT_CALL_ESTATE_CHANGE通知到GSMCa11Tacker,并向上層提供電話調(diào)用接口,GSMCa11-Tacker把在電話狀態(tài)變化通知表里所有通話分為3類:
RingingCa11:INCOMING,WAITING(未接通的來電)
ForegourndCa11:ACTIVE,DIALING,ALERTING(接通的通話)
BackgroundCa11:HOLDING(保持狀態(tài)的通話)
上層函數(shù)通過getRingCa11(),getForegrouandCa11()等來獲得電話系統(tǒng)中特定通話連接。
GsmCa11Tracker在收到狀態(tài)變化的信息之后會首先對狀態(tài)進(jìn)行歸類,然后通過updatePhoneState()方法來更新phone狀態(tài)的變化,我們在
內(nèi)只有3個狀態(tài),所以我們需要在pub1ic static fina1 int CALL_STATE_OFFHOOK=2j之后添加pub1ic static fina1 int CALL_STATE_ALERTING=3j即可。
3.3定制系統(tǒng)的使用
通過以上對通話狀態(tài)的分析與源代碼的修改,我們實現(xiàn)了外部應(yīng)用通過Te1ephonyManager來獲取ALERTING狀態(tài),修改過后的源代碼需要經(jīng)過編譯以生成我們可以使用的rom包。安卓系統(tǒng)的編譯需要在Linux環(huán)境下完成,完成環(huán)境配置之后進(jìn)入我們系統(tǒng)代碼所在目錄使用以下命令進(jìn)行編譯:
source bui1d/envsetup.sh
(用來將envsetup.sh里的所有用到的命令加載到環(huán)境變量里去)
1unch cm_bacon_userdebug
(用來選擇編譯的產(chǎn)品與類型)make bacon-j4
(開始編譯,其中_j4中的4代表你CPU的線程數(shù),試編譯所使用機(jī)器的性能自行選擇,這里我們選擇4就是開啟4個線程一起編譯)
編譯完成后,會在out/target/product目錄下生成rom包統(tǒng)[6],最后使用刷機(jī)工具如刷機(jī)精靈將編譯好的rom包刷入移動終端就可以了,在我們的定制系統(tǒng)內(nèi)我們可以使用PhoneStateListener()來對去電接通瞬間的狀態(tài)進(jìn)行監(jiān)聽了,在pub1ic void onCa11StateChanged(int state,String incomingNumber)內(nèi),當(dāng)state為3時即系統(tǒng)處于ALERTING狀態(tài)。
本文介紹了Android操作系統(tǒng)內(nèi)通話系統(tǒng)的大致結(jié)構(gòu),重點(diǎn)闡述通話狀態(tài)的變化在系統(tǒng)中的上報流程。在一些特定的需求下,我們通過一般手段無法實現(xiàn)的功能,如對更多通話狀態(tài)進(jìn)行監(jiān)聽的時候,我們可以采取對系統(tǒng)源代碼進(jìn)行定制修改,并編譯生成新的rom包,通過刷機(jī)的方法為移動終端寫入我們自己定制的操作系統(tǒng)來使用。
[1]Sy1vain Rataboui1.Android NDK Beginner's Guide[M].Packt Pub1ishing,2012.
[2]王家林,王家俊,王家虎.Android高級開發(fā)實戰(zhàn):UI、NDK與安全[M].北京:電子工業(yè)出版社,2013.
[3]吳延昌,馮萍,蘇聰.基于J2ME技術(shù)的應(yīng)用開發(fā)與研究[J].微電子與計算機(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—),男,河南信陽人,碩士研究生。研究方向:信號與信息系統(tǒng)。