從原始程式碼角度深入解析Telephony的架構設計與實現原理,全面揭示Android系統的通訊機制!
Android 智慧型手機的爆發式成長和逐步從一般手機轉向Android 智慧型手機的廠商,催生了大量的從業人員需求,熟悉Android 智慧型手機開發,特別是熟悉Android Telephony 開發的技術人員越來越受到市場的青睞。
Telephony 模組為智慧型手機的核心套件,是區別行動OS與桌面OS的重要特色。雖然Android來自於Linux,但是在普通Linux中並不存在,對很多從Java 或Linux 開發轉型而來的人員來說,Telephony 顯得陌生而神秘,而且Telephony 由於其固有的通訊複雜度,以及與環境和硬體的較大連結性,一直是Android 智慧型手機開發中的障礙,也是所有智慧型手機專案所必須克服的難度。
作者簡介:
楊青平
資深Android系統工程師和軟體發展工程師,熱衷於Android用原始程式碼和系統原理的研究,對Android的系統架構、設計原理以及Telephony和Framework等核心功能模組的工作機制有非常深入的研究。目前就職於國內領先的Android OS提供商ThunderSoft(中科創達),擔任系統架構師。他對J2EE、UML、設計模式等相關技術,以及電信增值業務、電子商務、物聯網等重要軟體行業的運行模式、業務發展規劃也有較深入的瞭解。
作者序
時至今日,行動網際網路對人們的影響已無須多言,開放的Android 更加快了行動網際網路的繁榮,也帶動了整個產業鏈的發展。Android 智慧型手機的爆發式成長和逐步從一般手機轉向Android 智慧型手機的廠商,催生了大量的從業人員需求,熟悉Android 智慧型手機開發,特別是熟悉Android Telephony 開發的技術人員越來越受到市場的青睞。
Telephony 模組為智慧型手機的核心套件,是區別行動OS 與桌面OS 的重要特色。雖然Android 來自於Linux,但是在普通Linux 中並不存在,對很多從Java 或Linux 開發轉型而來的人員來說,Telephony 顯得陌生而神秘,而且Telephony 由於其固有的通訊複雜度,以及與環境和硬體的較大連結性,一直是Android 智慧型手機開發中的障礙,也是所有智慧型手機專案所必須克服的難度。
隨著ICT 技術的推廣和發展,在三網融合、智慧的地球(物聯網)等概念風行的形勢下,手機終端技術的發展和進步可謂日新月異;Android 不但通過市場的考驗,並有了較大的市佔率,從手機晶片廠商、手機生產廠商到各種應用開發公司、網際網路公司等,逐步形成了以Android 系統平台為核心的上下游產業鏈。正是由於Android 原始程式碼的開放,各大手機廠商才能透過深度訂製Android 系統平台,在降低研發成本的同時,快速推出具有本身特色的Android 智慧型手機產品。因此,各大手機廠商在推出新版本Android 系統平台手機上投入了極高的研發成本,其中不乏Samsung、Motorola 等國際知名公司。
目前市場上針對Android 的書籍很多,但絕大多數是以Android SDK 在應用層為基礎的開發進行講解的,深入了解Android Telephony 的書籍目前還是空白。而Telephony 基本通訊功能是手機中的核心,在訂製Android 手機的過程中也不例外,手機離開了基本通訊能力,如通話、多媒體簡訊、手機上網等功能,也就失去了它本身的意義。
在Android 手機訂製化的過程中,Telephony 有關的範圍和內容也非常多,從應用層到框架層,再到RIL 與Modem 無線通訊模組的互動,所有部分均有不同程度的訂製和最佳化,因此,在Android 手機平台訂製化研發的過程中,需要對Android Telephony 有全面而深入的了解。本書以Android 4.0.3 原始程式碼為基礎,全面、深入地解析了Android Telephony 有關的主要內容,其中包含Call 通話、ServiceState 連線網路服務狀態、DataConnection 手機上網資料連接以及SMS&MMS 簡訊和多媒體簡訊的應用等,並且詳細解析Android RIL 的執行機制。
如果你是一名Android 經驗豐富的資深使用者,能夠快速架設Android 原始程式碼編譯環境以及熟練Android 開發的基礎知識和技巧,那麼可以跳過第一部分,直接閱讀後面四部分;但如果你是一名Android 初學者,請一定從第1 章的基礎理論知識開始學習。
楊青平
時至今日,行動網際網路對人們的影響已無須多言,開放的Android 更加快了行動網際網路的繁榮,也帶動了整個產業鏈的發展。Android 智慧型手機的爆發式成長和逐步從一般手機轉向Android 智慧型手機的廠商,催生了大量的從業人員需求,熟悉Android 智慧型手機開發,特別是熟悉Android Telephony 開發的技術人員越來越受到市場的青睞。
Telephony 模組為智慧型手機的核心套件,是區別行動OS 與桌面OS 的重要特色。雖然Android 來自於Linux,但是在普通Linux 中並不存在,對很多從Java 或Linux 開發轉型而來的人員來說,Telephony 顯得陌生而...
目錄
PART 1 基礎篇
第01章 初識Android
1.1 智慧型手機的系統結構
1.2 Android 系統架構
1.2.1 應用層
1.2.2 應用框架層
1.2.3 系統執行函數庫層
1.2.4 核心層
1.3 Android Telephony 框架結構
1.3.1 系統執行函數庫層的HAL 層
1.3.2 簡析HAL 結構
1.3.3 Android 為什麼引用HAL
1.3.4 Android 中HAL 的執行結構
1.4 本章小結
第02章 架設Android 原始程式碼編譯環境
2.1 Ubuntu Linux 作業系統及工具安裝
2.1.1 PC 設定建議
2.1.2 Ubuntu 安裝光碟的製作
2.1.3 Ubuntu 安裝過程
2.1.4 Ubuntu 系統工具套件更新升級
2.1.5 Java 執行環境JDK 安裝及設定
2.1.6 Android SDK 的下載和設定
2.1.7 使用Android SDK 啟動虛擬裝置
2.2 Android 原始程式碼下載及編譯過程
2.2.1 工作目錄設定
2.2.2 原始程式碼下載
2.2.3 整體編譯Android 原始程式碼
2.2.4 單一模組隨選編譯
2.2.5 編譯產生本機Android SDK
2.3 Android 常用工具使用及相關技巧說明
2.3.1 使用本機編譯成功的鏡像檔案啟動Android 模擬器
2.3.2 Android 偵錯工具adb 的使用方法
2.3.3 進入Android 虛擬裝置主控台模擬簡訊、來電等功能
2.4 Eclipse 設定及使用
2.4.1 Android 開發套件ADT下載及設定
2.4.2 建立Android 原始程式碼Java 專案
2.4.3 格式化Android Java 原始程式碼
2.5 使用Source Insight 方便閱讀C/C++ 程式
2.5.1 安裝Wine
2.5.2 安裝Source Insight
2.5.3 設定Source Insight C/C++ 專案
2.6 本章小結
第03章 主要技術準備
3.1 何謂同步和非同步
3.2 Handler 訊息處理機制
3.2.1 Handler 概念分析
3.2.2 Handler 特性
3.2.3 常用Handler 訊息處理機制介紹
3.2.4 Handler 的作用
3.3 AIDL 跨應用服務
3.3.1 AIDL 概念分析
3.3.2 AIDL 服務提供方
3.3.3 AIDL 服務呼叫方
3.4 廣播
3.4.1 Android 系統中的廣播
3.4.2 Broadcast 接收
3.4.3 Broadcast 發送
3.5 本章小結
PART 2 Telephony 通話功能
第04章 架設Android 原始程式碼編譯環境
4.1 通話相關主要原始程式碼整理及簡要說明
4.2 電話主動呼叫流程分析
4.2.1 執行Android 虛擬裝置
4.2.2 撥號介面DialtactsActivity 的onCreate 方法
4.2.3 DialpadFragment 撥號鍵Tab 表單
4.2.4 尋找撥號統一入口OutgoingCallBroadcaster
4.2.5 CallController 撥號placeCall 方法
4.2.6 Phone 幫助類別PhoneUtils 靜態placeCall 方法
4.2.7 通話大管家CallManager
4.2.8 Phone 物件的dial 撥號方法
4.2.9 Call 狀態追蹤者GsmCallTracker
4.2.10 RIL 訊息的出入口RIL.java
4.2.11 啟動通話主介面InCallScreen
4.2.12 撥號流程歸納
4.3 電話被動接收來電流程分析
4.3.1 Android 虛擬裝置模擬接收來電
4.3.2 RegistrantList 訊息處理機制
4.3.3 GsmCallTracker 回應RIL 的Call 狀態變化通知
4.3.4 RIL.java 的getCurrentCalls 方法
4.3.5 GsmCallTracker 回應訊息通知
4.3.6 handlePollCalls 發出來電通知
4.3.7 GSMPhone 的通知方法notifyNewRingingConnection
4.3.8 CallManager 回應來電訊息通知
4.3.9 CallNotifier 回應來電通知
4.3.10 InCallScreen 展現來電介面
4.3.11 來電流程歸納
4.4 通話關鍵流程
4.4.1 建立Android 通話模型
4.4.2 AT 指令發送流程
4.4.3 通話狀態變化流程
4.4.4 本機主動掛斷通話流程
4.4.5 通話對方中斷通話連接流程
4.5 本章小結
第05章 深入解析Telephony 通話應用機制
5.1 Phone 應用的關鍵程式解析
5.2 認識通話主介面InCallScreen
5.2.1 InCallScreen 中的主要方法
5.2.2 單例模式的Activity 通話介面
5.2.3 Layout 版面配置說明
5.3 通話主介面InCallScreen
5.3.1 onCreate—執行Activity
5.3.2 onNewIntent—單例InCallScreen 載入入口
5.3.3 internalResolveIntent—進入InCallScreen 處理Intent 的唯一方法
5.3.4 onResume—顯示InCallScreen 通話介面
5.3.5 handleMessage—Handler 訊息回應方法
5.3.6 onSuppServiceFailed—顯示通話服務失敗提示訊息
5.3.7 updateScreen—更新通話介面
5.3.8 onDisconnect—中斷通話連接
5.3.9 handleOnscreenButtonClick—回應通話控制按鈕點擊事件
5.3.10 InCallScreen 通話介面執行機制歸納
5.4 通話資訊展示CallCard
5.4.1 兩路通話版面配置View 控制項
5.4.2 updateState—更新CallCard
5.4.3 displayMainCallStatus—顯示/ 更新第一線通話資訊
5.4.4 displayOnHoldCallStatus—顯示/ 更新第二線通話資訊
5.4.5 修改通話資訊展示的想法及原則
5.5 通話控制InCallTouchUi
5.5.1 View 版面配置控制項
5.5.2 updateState—更新InCallTouchUi
5.5.3 MultiWaveView—來電控制接聽、拒接介面
5.5.4 HeadSet—回應無線事件
5.5.5 修改來電介面的想法及原則
5.6 通話功能中必不可少的DTMF
5.6.1 什麼是DTMF
5.6.2 DTMFTwelveKeyDialer 的版面配置
5.6.3 如何顯示DTMF 介面
5.6.4 Tone 音發送流程
5.7 Phone 應用的載入入口PhoneApp 類別
5.7.1 PhoneApp 類別屬性及方法
5.7.2 onCreate—PhoneApp 應用載入入口
5.7.3 PowerManager—PhoneApp 電源管理
5.7.4 Sensor—PhoneApp 感應器的應用
5.7.5 MediaButtonBroadcastReceiver—接收耳機HOOK 鍵廣播事件
5.7.6 PhoneAppBroadcastReceiver—接收Phone 應用雜項廣播事件
5.8 Handler 訊息處理的後台工作者CallNotifier
5.8.1 CallNotifier 的本質
5.8.2 Handler 訊息註冊和回應機制
5.8.3 onNewRingingConnection—接收到新來電的後台處理
5.8.4 onPhoneStateChanged—通話狀態變化的後台處理
5.8.5 onDisconnect—通話連接中斷的後台處理
5.9 本章小結
第06章 手機通話功能框架層實現機制
6.1 Telephony Frameworks 層解析
6.1.1 通話功能相關程式檔案
6.1.2 通話功能關鍵類別
6.1.3 Telephony 通訊能力模型
6.2 GSMPhone 物件詳解
6.2.1 GSMPhone 類別層次繼承關係
6.2.2 GSMPhone 類別程式結構解析
6.2.3 PhoneFactory 工廠方法實現類別
6.2.4 PhoneProxy 代理模式實現類別
6.2.5 GSMPhone 類別的組合邏輯關係
6.2.6 GSMPhone 類別的Handler 訊息處理機制
6.2.7 GSMPhone 類別通話管理實現機制
6.3 CallTracker 執行機制
6.3.1 GsmCallTracker 類別程式結構解析
6.3.2 GsmCallTracker 的Handler 訊息處理機制
6.3.3 GsmCallTracker 與RIL 物件的互動機制
6.4 以GsmCall 為核心的通話管理模型
6.4.1 GsmCall 類別程式結構解析
6.4.2 GsmConnection 類別程式結構解析
6.4.3 DriverCall 與GsmCall、GsmConnection 的關係
6.5 GsmCallTracker 類別的 handlePollCalls 方法處理邏輯
6.5.1 初始化操作
6.5.2 更新通話相關資訊
6.5.3 根據最新的通話狀態發出通知
6.5.4 更新手機狀態
6.6 GsmCallTracker 通話連接中斷的處理機制
6.6.1 本機主動掛斷通話的處理機制
6.6.2 通話對方中斷通話連接的處理機制
6.7 Android 虛擬裝置上驗證GSM 手機的通話模型
6.7.1 增加記錄檔輸出
6.7.2 執行Android 虛擬裝置並分析記錄檔
6.8 通話大管家CallManager
6.8.1 CallManager 的本質
6.8.2 Handler 訊息註冊及執行機制
6.8.3 如何取得通話基本資訊
6.9 通話計時實例分析
6.9.1 記錄通話的開始時間
6.9.2 記錄通話的結束時間
6.9.3 Phone 應用計算通話時長
6.10 Handler 訊息處理機制
6.10.1 Handler 訊息的註冊過程
6.10.2 Handler 訊息的接收和回應過程
6.11 實戰—來電防火牆
6.11.1 應用原理分析
6.11.2 在onNewRingingConnection 方法加入攔截請求
6.12 本章小結
PART 3 Telephony 通訊功能
第07章 網路服務狀態執行機制
7.1 什麼是ServiceState
7.2 初識ServiceState 實體類別
7.2.1 ServiceState 類別的實質
7.2.2 ServiceState 類別關鍵常數及屬性
7.2.3 ServiceState 類別關鍵方法
7.3 ServiceStateTracker 執行機制詳解
7.3.1 ServiceStateTracker 抽象類別為核心的類別圖
7.3.2 ServiceStateTracker 程式結構
7.3.3 ServiceStateTracker 的Handler 訊息處理機制
7.3.4 ServiceStateTracker 與RIL 物件的互動機制
7.4 handlePollStateResult 方法處理邏輯
7.4.1 RIL 傳回查詢結果的例外判斷和處理
7.4.2 處理4 個不同網路服務查詢傳回的結果
7.4.3 用pollStateDone 方法完成收尾工作
7.5 ServiceState 最佳實作
7.5.1 取得電信業者資訊
7.5.2 狀態列手機訊號即時變化
7.6 實戰—飛航模式的實現
7.6.1 飛航模式的設定入口
7.6.2 Radio 無線通訊模組的開啟或關閉
7.7 本章小結
第08章 Android 手機上網實現機制
8.1 Android 網路整體結構
8.2 什麼是DataConnection
8.2.1 DataConnection 類別定義及子類別
8.2.2 DataConnection 類別關鍵屬性
8.2.3 DataConnection 類別的方法
8.2.4 5 個資料連線物件的狀態轉換
8.3 StateMachine 狀態機
8.3.1 State 設計模式
8.3.2 StateMachine 核心類別
8.3.3 StateMachine 執行機制
8.3.4 DataConnection 使用State 模式的執行機制
8.4 什麼是APN
8.4.1 APN 設定關鍵欄位
8.4.2 Android 支援的APN 型態
8.4.3 如何在Android 中新增APN 設定
8.5 開機自動建立default 預設資料連接
8.5.1 如何檢視手機上網的基本參數設定
8.5.2 初始化ApnContext
8.5.3 建立DataConnection 資料連接
8.5.4 啟動DataConnection 資料連接
8.6 DataConnectionTracker 執行機制
8.6.1 初始化ApnContext 操作
8.6.2 開機建立default 預設的資料連接
8.6.3 關閉資料連接
8.6.4 迴圈更新網路連接狀態資訊
8.6.5 APN 資料庫設定資訊變化的觀察者
8.7 取得Android 手機上網資料封包
8.7.1 使用tcpdump 工具抓取TCP/IP 資料封包
8.7.2 使用Wireshark 軟體分析TCP/IP 資料封包
8.8 MMS 多媒體簡訊資料連接的實現
8.8.1 建立和關閉多媒體簡訊資料連接
8.8.2 如何支援多種型態網路連接
8.9 實戰—手機上網資料總開關的實現
8.10 本章小結
第09章 深入解析簡訊發送和接收流程
9.1 MMS 應用主要原始程式碼整理及簡要說明
9.2 主動發送簡訊流程分析
9.2.1 進入簡訊階段清單介面
9.2.2 簡訊編輯介面
9.2.3 SmsMessageSender 簡訊發送處理邏輯
9.2.4 Telephony Frameworks 層中的SmsManager 類別
9.2.5 IccSmsInterfaceManager 服務發送簡訊
9.2.6 SMSDispatcher 簡訊分發器
9.2.7 主動發送簡訊流程歸納
9.3 簡訊發送狀態相關處理機制
9.3.1 如何判斷簡訊是否成功發送到簡訊中心
9.3.2 如何判斷簡訊接收方已經成功收取簡訊
9.4 簡訊接收流程分析
9.4.1 簡訊接收的開始
9.4.2 進入簡訊分發器SMSDispatcher
9.4.3 接收並處理新簡訊Broadcast 廣播
9.4.4 簡訊接收流程歸納
9.5 多媒體簡訊發送和接收關鍵流程
9.5.1 多媒體簡訊傳輸過程中的關鍵類別
9.5.2 TransactionService 為核心的多媒體簡訊傳輸機制
9.5.3 Transaction 物件執行多媒體簡訊傳輸
9.5.4 以WAP PUSH 為基礎的多媒體簡訊接收與下載
9.6 本章小結
PART 4 深入解析Android RIL
第10章 Android RIL 框架結構及RILJ 執行機制
10.1 Android RIL 關鍵處理流程
10.1.1 Android RIL 框架結構
10.1.2 Android RIL 的資料互動
10.2 認識RILJ
10.2.1 RILJ 核心類別圖
10.2.2 RILJ 關鍵屬性
10.2.3 RILJ 關鍵方法
10.2.4 RILJ 執行機制
10.3 認識RILRequest 類別
10.3.1 RILRequest 類別的關鍵屬性
10.3.2 RILRequest 類別的方法
10.4 解析RILJ 發出RIL 請求流程
10.4.1 send 方法發送Handler 訊息
10.4.2 RILSender 接收和處理Handler 訊息
10.5 解析RILJ 接收Response 訊息處理流程
10.5.1 RILReceiver 內部類別執行機制
10.5.2 Solicited Response 訊息處理方法processSolicited
10.5.3 UnSolicited Response 訊息處理方法processUnsolicited
10.6 本章小結
第11章 RILC 系統結構及LibRIL 執行機制
11.1 RILC 主要程式目錄結構
11.2 解析RILC 執行機制
11.2.1 RILC 啟動過程
11.2.2 RILC 執行過程
11.3 初識RILC 中的執行環境LibRIL
11.3.1 LibRIL 主要檔案及作用
11.3.2 重點結構說明
11.4 LibRIL 執行環境載入過程
11.4.1 開啟ril_event 事件監聽入口RIL_startEventLoop
11.4.2 RIL_register 函數引用三方RIL_RadioFunctions
11.5 執行狀態中ril_event 事件處理機制
11.5.1 認識ril_event 結構
11.5.2 RIL 事件生命週期控制的處理函數
11.5.3 ril_event_loop 處理機制
11.6 詳解LibRIL 執行機制
11.6.1 RILJ 與LibRIL 建立Socket 連接過程
11.6.2 Solicited 訊息的互動流程和處理機制
11.7 本章小結
第12章 Reference-RIL 執行框架
12.1 Reference-RIL 執行機制
12.1.1 RIL_Init 函數初始化Reference-RIL
12.1.2 onRequest 接收LibRIL 的請求呼叫
12.1.3 UnSolicited 訊息處理邏輯
12.2 AT 指令
12.2.1 如何新增AT 指令
12.2.2 Android Telephony 常用AT 指令
12.3 Android RIL 層執行框架和機制歸納
12.3.1 歸納Solicited 訊息處理流程
12.3.2 歸納UnSolicited 訊息處理流程
12.4 本章小結
PART 5 系統服務
第13章 Telephony 提供的系統服務
13.1 System Service 系統服務類別圖
13.2 詳解PhoneInterfaceManager 實現機制
13.2.1 ITelephony.aidl 介面定義
13.2.2 PhoneInterfaceManager 服務建立過程
13.2.3 PhoneInterfaceManager 服務使用實例分析
13.3 詳解TelephonyRegistry 實現機制
13.3.1 系統服務的建立入口
13.3.2 TelephonyRegistry 關鍵方法
13.3.3 listen 方法處理邏輯
13.3.4 notifyCallState 方法發出通話狀態變化通知
13.3.5 觸發TelephonyRegistry 發出通知機制
13.3.6 TelephonyRegistry 系統服務使用實例分析
13.4 簡述TelephonyManager 實現機制
13.5 本章小結
PART 1 基礎篇
第01章 初識Android
1.1 智慧型手機的系統結構
1.2 Android 系統架構
1.2.1 應用層
1.2.2 應用框架層
1.2.3 系統執行函數庫層
1.2.4 核心層
1.3 Android Telephony 框架結構
1.3.1 系統執行函數庫層的HAL 層
1.3.2 簡析HAL 結構
1.3.3 Android 為什麼引用HAL
1.3.4 Android 中HAL 的執行結構
1.4 本章小結
第02章 架設Android 原始程式碼編譯環境
2.1 Ubuntu Linux 作業系統及工具安裝
2.1.1 PC 設定建議
2.1.2 Ubuntu 安裝光碟的製作
2.1.3 Ubuntu 安裝過程
2.1.4 Ubuntu 系統工...