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