版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Android Telephony原理解析與開發(fā)指南第一章 初識Android1.1 Smart Phone智能手機的系統(tǒng)結(jié)構(gòu)1.2 Android系統(tǒng)架構(gòu)1.2.1 應(yīng)用層(Applications)1.2.2 應(yīng)用框架層(Frameworks)1.2.3 系統(tǒng)運行庫層(User Libraries)1.2.4 核心層(Linux Kernel)1.3 Android Telephony框架結(jié)構(gòu)1.4 本章小結(jié)1.1 Smart Phone智能手機的系統(tǒng)結(jié)構(gòu)隨著手機芯片處理能力的提升、上網(wǎng)能力的擴展和發(fā)展(藍牙、Wi-Fi、4G網(wǎng)絡(luò)),手機應(yīng)用得到非常廣泛的擴大和發(fā)展。在Smart Phon
2、e的硬件設(shè)計上,采用處理能力比較強大的處理器作為AP應(yīng)用處理器,來支持開放手機操作系統(tǒng)及操作系統(tǒng)之上的擴展應(yīng)用,由此可見智能手機發(fā)展的趨勢和方向。1.2 Android系統(tǒng)架構(gòu)Android手機操作系統(tǒng)是一個分層的基于Linux Kernel智能手機操作系統(tǒng),共有分為4層,從上到下分別是:Applications(應(yīng)用層)Framework(應(yīng)用框架層)Libraries(系統(tǒng)運行庫層)Linux Kernel(核心層)1.2 Android系統(tǒng)架構(gòu)應(yīng)用層包括了Android各種應(yīng)用程序,這些應(yīng)用程序是使用Java語言開發(fā),并運行在Dalvik虛擬機上,在Android系統(tǒng)架構(gòu)中的第一層。在A
3、ndroid源碼和SDK中,Google已經(jīng)捆綁和發(fā)布一些核心應(yīng)用及源代碼,如Dialer、MMS、日歷、Google地圖、瀏覽器、聯(lián)系人等應(yīng)用。1.2.1 應(yīng)用層(Applications)1.2 Android系統(tǒng)架構(gòu)應(yīng)用框架層是Google發(fā)布的核心應(yīng)用時所使用的API框架,開發(fā)人員可以使用這些框架提供的API來快速開發(fā)自己的應(yīng)用程序,Android中主要的一些組件如下:Views(視圖)Resource Manager(資源管理器)Notification Manager (通知管理器)Activity Manager(Activity管理器)1.2.2 應(yīng)用框架層(Framework
4、s)1.2 Android系統(tǒng)架構(gòu)Android系統(tǒng)架構(gòu)中的第三層為系統(tǒng)運行庫層(User Libraries),這一層主要包含了手機系統(tǒng)平臺必須的C/C+核心庫、Dalvik虛擬機運行環(huán)境和HAL子層。1.C/C+核心庫,如libc(系統(tǒng)C庫)、Media Framework(多媒體庫)、OpenGL、SQLite、WebKit、SSL2.Dalvik虛擬機運行環(huán)境每一個Android應(yīng)用程序都運行在Dalvik虛擬機之上,且每一個應(yīng)用程序都有自己獨立運行的進程空間;Dalvik虛擬機只執(zhí)行DEX可執(zhí)行文件。1.2.3 系統(tǒng)運行庫層(User Libraries)1.2 Android系統(tǒng)架
5、構(gòu)Android 基于Linux Kernel 提供核心系統(tǒng)服務(wù),例如文件管理、內(nèi)存管理、進程管理、網(wǎng)絡(luò)堆棧、驅(qū)動模型等操作系統(tǒng)的基本服務(wù)能力。Linux Kernel內(nèi)核同時也作為硬件和軟件之間的抽象層,需要一些與移動設(shè)備相關(guān)驅(qū)動程序支持,主要的驅(qū)動有:Display Driver(顯示驅(qū)動)、Keyboard Driver(鍵盤驅(qū)動)、Audio Driver(音頻驅(qū)動)、Power Management(電源管理)、Binder IPC驅(qū)動、Bluetooth Driver(藍牙驅(qū)動)、WIFI Driver(Wi-Fi驅(qū)動)、Camera Driver(照相機驅(qū)動)等1.2.4 核心層
6、(Linux Kernel)1.3 Android Telephony框架結(jié)構(gòu)1.3 Android Telephony框架結(jié)構(gòu)Android Telephony的業(yè)務(wù)應(yīng)用跨越了AP和BP,AP與BP相互通信,符合前面介紹的Smart Phone智能手機硬件基本結(jié)構(gòu)Android系統(tǒng)在AP應(yīng)用處理器上運行,而Telephony運行在Linux Kernel之上的User Space空間。Android Telephony也采用了分層結(jié)構(gòu)的設(shè)計,共跨越了三層Applications、Framework和User Libraries層,與Android操作系統(tǒng)整體分層結(jié)構(gòu)保持一致;Android
7、Telephony從上到下工分三層,Telephony應(yīng)用、Telephony框架、RIL(Radio Interface Layer,無線通信接口層,主要位于User Libraries層中的HAL層中,什么是HAL,接下來詳細介紹)。BP SoftWare在BP基帶處理器上運行,主要負責實際的無線通信能力處理,不在本書討論的范圍。1.3 Android Telephony框架結(jié)構(gòu)了解Android HAL的設(shè)計與實現(xiàn)1.4 本章小結(jié)還記得Smart Phone智能手機基本硬件中的AP和BP主從處理器結(jié)構(gòu)嗎?基于Android平臺手機也符合Smart Phone的體系結(jié)構(gòu),Android是基
8、于Linux Kernel運行在AP上的智能手機操作系統(tǒng),同時也是一個分層的操作系統(tǒng)平臺,從上到下主要分為4層;在AP上運行的Telephony相關(guān)應(yīng)用與Android整體分層結(jié)構(gòu)是保持一致,每層中的Telephony相關(guān)內(nèi)容都是本書重點講述的內(nèi)容。Android手機中的基本通信能力跨越了AP和BP,AP和BP的相互協(xié)作完成了基本的通信功能,AP上的各種Telephony應(yīng)用,通過豐富的界面展示了通信相關(guān)的各種形式和狀態(tài),也可通過界面向BP發(fā)起通信能力相關(guān)的控制,且BP中負責實施具體的通信能力;這里提出一個問題,請讀者結(jié)合本章內(nèi)容思考:Android Telephony處于在整個Android
9、智能手機平臺什么位置,HAL是什么?通過本章的學(xué)習(xí),你清楚了嗎?Android Telephony原理解析與開發(fā)指南第二章 搭建Android源代碼編譯調(diào)試環(huán)境2.1 Ubuntu Linux操作系統(tǒng)及工具安裝2.1.1 PC配置建議2.1.2 Ubuntu安裝光盤制作&安裝過程2.1.3 安裝OpenJDK2.1.4 Ubuntu系統(tǒng)工具包更新升級2.2 Android源代碼下載及編譯過程2.2.1 源代碼下載2.2.2 編譯Android 源代碼2.2.3 編譯單個模塊第二章 搭建Android源代碼編譯調(diào)試環(huán)境2.3 Android Studio及SDK2.3.1 下載和配置Androi
10、d Studio2.3.2 Android SDK下載及配置和使用2.3.3 使用Android SDK啟動Android虛擬設(shè)備2.3.4 Android調(diào)試工具adb的使用方法2.3.5 相關(guān)技巧匯總說明2.4 在Google手機上調(diào)試Android源碼2.4.1 Google手機對應(yīng)編譯選項2.4.2 Google手機刷入工廠鏡像2.4.3 編譯本地鏡像并刷入Google手機2.4.4 Google手機上調(diào)試Android源碼2.5 本章小結(jié)2.1 Ubuntu Linux操作系統(tǒng)及工具安裝CPU類型:英特爾酷睿i5處理器或i7處理器內(nèi)存:8GB或更大容量內(nèi)存硬盤容量:500GB或1T顯
11、卡:集成顯卡或其他獨立顯卡2.1.1 PC配置建議2.1 Ubuntu Linux操作系統(tǒng)及工具安裝選用64位Ubuntu 17.10桌面版操作系統(tǒng)Ubuntu向?qū)桨惭b過程,其中的關(guān)鍵是磁盤合理分區(qū)。 目前PC市場上硬盤都較大,2T已成為基本配置,本例中的/ 根目錄掛載分區(qū)包括了/home用戶數(shù)據(jù)分區(qū)(讀者也可以分配獨立的/home分區(qū)掛載點),在Android編譯環(huán)境中,源代碼的保存和編譯都在此空間進行,所以需要較大空間,因此將除去swap交換分區(qū)占用的磁盤空間剩余的磁盤空間都分配到此掛載分區(qū)。2.1.2 Ubuntu安裝光盤制作&安裝過程2.1 Ubuntu Linux操作系統(tǒng)及工具安裝
12、注意編譯Android源碼需要選擇不同的JDK。編譯Android O源碼需要OpenJDK 8,Ubuntu 17.10系統(tǒng)中安裝和驗證OpenJDK的命令如下:$ sudo apt-get update$ sudo apt-get install openjdk-8-jdk$ java -versionopenjdk version 1.8.0_151OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu-b12)OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode
13、)2.1.3 安裝OpenJDK2.1 Ubuntu Linux操作系統(tǒng)及工具安裝編譯Android O源碼還需要更新和安裝Ubuntu的系統(tǒng)工具包,其Linux命令為:$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g+-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev lib
14、xml2-utils xsltproc unzip因網(wǎng)絡(luò)異?;蚱渌惓G闆r下,這些工具包可能不能完全下載和更新,那就需要在執(zhí)行完此命令以后,再次執(zhí)行此命令驗證工具包是否完整安裝和更新0 upgraded, 0 newly installed, 0 to remove and 247 not upgraded. 說明所有的包沒有遺漏,都已經(jīng)安裝完成,如每個工具包提示均已完成更新和安裝,便可進入下一步操作,否則我們繼續(xù)執(zhí)行此命令更新和安裝剩余未完成的Ubuntu系統(tǒng)工具包。2.1.4 Ubuntu系統(tǒng)工具包更新升級2.2 Android源代碼下載及編譯過程步驟一:下載并配置repo$ sudo a
15、pt-get install python$ curl /git-repo-downloads/repo repo$ chmod a+x repo注意:在/用戶主目錄下新建一個bin目錄,并將此目錄設(shè)置在PATH目錄中;我們將保存常用的一些腳本或二進制可執(zhí)行程序在此目錄下,不必再更新系統(tǒng)環(huán)境變量就能在任意目錄執(zhí)行這些腳本或可執(zhí)行程序。$ mkdir /bin$ vi /.bashrc在文件最后一行增加PATH=/bin:$PATH,保存退出$ source .bashrc/立即生效配置的PATH目錄$ mv repo /bin/2.2.1 下載源碼2.2 Android源代碼下載及編譯過程步驟
16、二:配置git個人信息$ git config -global telephony$ git config -global user.email telephony查看配置的git信息$ cat /.gitconfigusername = telephonyemail = telephonycolorui = auto2.2.1 下載源碼2.2 Android源代碼下載及編譯過程步驟三:獲取源碼分支并下載$ repo init -u /platform/manifest* new tag android-8.0.0_r4 - android-8.0.0_r4 * new tag android
17、-8.0.0_r7 - android-8.0.0_r7 * new tag android-8.0.0_r9 - android-8.0.0_r9 * new tag android-8.1.0_r1 - android-8.1.0_r1可根據(jù)實際情況,選擇最新的Android源碼分支下載$ repo init -u /platform/manifest -b android-8.1.0_r1repo has been initialized in /home/android/Oreo$ repo sync j8/開始下載2.2.1 下載源碼2.2 Android源代碼下載及編譯過程環(huán)境變量
18、初始化設(shè)置$ source build/envsetup.sh /或者. build/envsetup.sh 加載編譯腳本/使用第二種方法需要注意build前有一個空格including device/asus/fugu/vendorsetup.shincluding device/generic/car/vendorsetup.shincluding device/generic/mini-emulator-arm64/vendorsetup.shincluding device/huawei/angler/vendorsetup.shincluding device/lge/bullhea
19、d/vendorsetup.shincluding sdk/bash_completion/adb.bash2.2.2 編譯Android源碼2.2 Android源代碼下載及編譯過程選擇編譯產(chǎn)品$ lunch Youre building on LinuxLunch menu. pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 28. aosp_angler-userdebug 29. aosp_bullhead-userdebug 30. aosp_bullhead_svelte-userdebugWhich would you like? a
20、osp_arm-eng aosp_arm64-eng2.2.2 編譯Android源碼2.2 Android源代碼下載及編譯過程編譯信息確認并開始編譯=PLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=8.1.0 /Android O版本TARGET_PRODUCT=aosp_arm64 /lunch選擇aosp_arm64-engTARGET_BUILD_VARIANT=engBUILD_ID=OPM1.171019.011 /編譯號OUT_DIR=outAUX_OS_VARIANT_LIST=$ make j82.2.2 編譯Android源碼2.
21、2 Android源代碼下載及編譯過程$ mmm packages/service/Telephony/ /編譯TeleService應(yīng)用$ mmm frameworks/base/ /編譯framework.jar$ cd packages/service/Telephony /TeleService應(yīng)用代碼目錄$ mm /編譯TeleService模塊$ cd $oreo$ cd frameworks/base /進入framework代碼目錄$ mm /編譯framework$ cd $oreo$ make TeleService /編譯TeleService應(yīng)用$ make frame
22、work /編譯framework.jar應(yīng)用2.2.3 編譯單個模塊2.3 Android Studio及SDKAndroid Studio的下載地址:/studio/index.html,Google提供了Windows 32/64、Mac和Linux不同的4個平臺版本供我們下載和使用。選擇Linux版本,下載android-studio-ide-171.4443003-linux.zip文件到本地。$ unzip android-studio-ide-171.4443003-linux.zip$ cd android-studio/bin$ ./studio.sh/啟動Android S
23、tudio2.3.1 下載和配置Android Studio2.3 Android Studio及SDK(1)第一次啟動Android Studio將啟動安裝向?qū)?,將在線更新Android SDK、Gradle等工具包,要關(guān)閉啟動安裝向?qū)?,可修改bin目錄下的perties配置文件,增加一行配置信息如下:disable.android.first.run=true(2)每次啟動Android Studio都需要進入android-studio/bin目錄,再運行studio.sh腳本,操作較多,比較省事的辦法是增加一個desktop圖標,在Ubuntu Activity菜單中方便啟動,具體的操
24、作如下:$ sudo vi /usr/share/applications/androidstudio.desktop/需要root權(quán)限增加以下配置信息Desktop EntryName=androidstudioComment=androidstudioType=ApplicationTerminal=falseIcon=/home/android/tools/android-studio/bin/studio.pngExec=/home/android/tools/android-studio/bin/studio.sh鼠標左鍵單擊Ubuntu Activity,輸入androidstud
25、io即可匹配出Android Studio應(yīng)用,鼠標左鍵單擊Android Studio圖標即可啟動它了。2.3.1 下載和配置Android Studio2.3 Android Studio及SDKAndroid SDK的下載頁面與Android Studio在同一個頁面:/studio/index.html,Google提供了Windows、Mac和Linux三個平臺的版本供我們下載和使用。同樣選擇Linux版本,下載sdk-tools-linux-3859397.zip到本地(1)此版本的Android SDK是基本的 Android 命令行工具,可以使用此工具中包含的sdkmanage
26、r工具下載和更新其他的SDK工具包。(2)使用Android Studio通過界面的方式管理更加方便的管理Android SDK。啟動Android Studio,在Configure彈出的菜單中選擇SDK Manager或者在Android Studio File菜單-Settings界面中,進入Android SDK管理界面。(3)SDK Manager界面列出了Android已經(jīng)發(fā)布的所有SDK版本,選擇安裝的Android SDK版本越多,下載和安裝時間就越長,需要的磁盤空間就越大;讀者可以根據(jù)自己的興趣和需要選擇下載。(4)Android SDK安裝完成后,還請記錄SDK中對應(yīng)工具的
27、PATH路徑。2.3.2 Android SDK下載及配置和使用2.3 Android Studio及SDK啟動Android Studio,Tools菜單-Android選項-AVD Manager,打開AVD Manager,通過界面向?qū)降牟僮鲃?chuàng)建虛擬設(shè)備。2.3.3 使用Android SDK啟動Android虛擬設(shè)備2.3 Android Studio及SDKAndroid模擬設(shè)備啟動完成后,會默認5554端口連接到計算機,這時可運行adb devices命令查看連接到本地計算機上的Android設(shè)備列表,詳情如下:$ adb devicesList of devices attac
28、hed emulator-5554device /device狀態(tài)為正常情況,可查看模擬器運行日志查看虛擬機運行日志:adb logcat查看應(yīng)用日志,可結(jié)合|grep過濾匹配自己想查看的日志內(nèi)容。adb logcat b radio查看RIL日志。2.3.4 Android調(diào)試工具adb的使用方法2.3 Android Studio及SDK1 adb logcat日志輸出腳本我們在開發(fā)、調(diào)試Android代碼過程中使用最多的就是adb命令,通過它我們可以獲取到想要的日志信息,幫助我們分析、定位程序邏輯。查看main日志的命令:adb logcat vthreadtime查看radio日志的命
29、令:adb logcat -vtime bradio查看event日志的命令:adb logcat -vtime -b events2.3.5 相關(guān)技巧匯總2.3 Android Studio及SDK2 查找代碼腳本面對Android浩瀚的代碼量,如何能快速的找到一些關(guān)鍵字呢?Android源碼中已經(jīng)給您準備了對應(yīng)的腳本工具,就在源碼主目錄下的build/envsetup.sh文件中。$ gedit build/envsetup.shfunction jgrep() /查找并匹配java文件文件中對應(yīng)的關(guān)鍵字 find . -name .repo -prune -o -name .git -p
30、rune -o -name out -prune -o -type f -name *.java -exec grep -color -n $ +function cgrep() /查找并匹配c相關(guān)文件文件中對應(yīng)的關(guān)鍵字 find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f ( -name *.c -o -name *.cc -o -name *.cpp -o -name *.h -o -name *.hpp ) -exec grep -color -n $ +2.3.5 相關(guān)技巧匯總2.4
31、在Google手機上調(diào)試Android源碼2.4.1 Google手機對應(yīng)編譯選項終端代碼名稱編譯選項Pixel XLmarlinaosp_marlin-userdebugPixelsailfishaosp_sailfish-userdebugHiKey(開發(fā)板)hikeyhikey-userdebugNexus 6Pangleraosp_angler-userdebugNexus 5Xbullheadaosp_bullhead-userdebugNexus 6shamuaosp_shamu-userdebug2.4 在Google手機上調(diào)試Android源碼2.4.2 Google手機刷入工
32、廠鏡像Google Nexus和Pixel系列手機的工廠鏡像文件的下載地址:/android/images,Nexus 6P手機對應(yīng)的Factory Images是angler 8.1.0 (OPM1.171019.011, Dec 2017),即Nexus 6P手機Android 8.1.0工廠刷機鏡像。2.4 在Google手機上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機1. 下載Google手機對應(yīng)的驅(qū)動文件Driver Binaries/android/drivers,選擇Nexus 6P (angler) binaries for Android 8.1.0
33、 (OPM1.171019.011)的兩個Driver文件Vendor image和Qualcomm,對應(yīng)的文件名分別是:huawei-angler-opm1.171019.011-41db8ed5.tgz和qcom-angler-opm1.171019.011-f7e511bb.tgz,解壓后是兩個Shell腳本:extract-huawei-angler.sh和extract-qcom-angler.sh,并將這兩個文件拷貝到Android O源碼的主目錄下。2.4 在Google手機上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機2. Driver Binaries
34、導(dǎo)入到Android 8.1.0 源碼工程/android/drivers,選擇Nexus 6P (angler) binaries for Android 8.1.0 (OPM1.171019.011)的兩個Driver文件Vendor image和Qualcomm,對應(yīng)的文件名分別是:huawei-angler-opm1.171019.011-41db8ed5.tgz和qcom-angler-opm1.171019.011-f7e511bb.tgz,解壓后是兩個Shell腳本:extract-huawei-angler.sh和extract-qcom-angler.sh,并將這兩個文件拷貝
35、到Android O源碼的主目錄下。2.4 在Google手機上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機3. 使用angler編譯選項重新編譯前面的編譯Android源碼,lunch選項是aosp_arm64-eng,而現(xiàn)在導(dǎo)入了Nexus 6P的驅(qū)動文件后,編譯Nexus 6P手機對應(yīng)的鏡像文件,在lunch的時候需要選擇aosp_angler-userdebug,并以全新的方式編譯整個代碼,最簡單的方式就是刪除保存編譯結(jié)果的out目錄。2.4 在Google手機上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機4. fastboot刷入本地編
36、譯出的鏡像文件$ sudo s /一定要使用root賬號刷機,否則沒有權(quán)限,fastboot將刷機失敗# fastboot flash boot boot.img# fastboot flash system system.img# fastboot flash vendor vendor.img # fastboot flash userdata userdata.img# fastboot reboot2.4 在Google手機上調(diào)試Android源碼2.4.4 Google手機上調(diào)試Android源碼選擇com.android.phone進程加載的代碼入口文件PhoneApp.java,
37、作為修改實例,其相對路徑為:packages/services/Telephony/src/com/android/phone/PhoneApp.java。在Android Studio連續(xù)快速的兩次按下右Shift按鍵,輸入PhoneApp.java將快速匹配出該文件,在代碼中的onCreate方法增加一行打印日志的代碼來驗證代碼修改后是否能成功運行在Google手機上,代碼修改和編譯詳情如下:Overridepublic void onCreate() android.util.Log.d(Android, My Code run on the Nexus 6P);$ cd $oreo$
38、mmm packages/services/Telephony/100% 10/10 Install: out/target/product/angler/system/priv-app/TeleService/TeleService.apk2.4 在Google手機上調(diào)試Android源碼2.4.4 Google手機上調(diào)試Android源碼TeleService.apk,需要將此文件push到Nexus 6P手機上運行,再此之前還需要remount手機,只有remount成功以后才能push apk系統(tǒng)應(yīng)用、系統(tǒng)jar包、so動態(tài)庫等文件到手機/system掛載點。具體操作如下:$ adb
39、rootrestarting adbd as root$ adb remountdm_verity is enabled on the system partition.Use adb disable-verity to disable verity.If you do not, remount may succeed, however, you will still not be able to write to these volumes.remount succeeded$ adb disable-verityVerity disabled on /systemNow reboot yo
40、ur device for settings to take effect/需要重啟手機$ adb reboot$ adb rootrestarting adbd as root$ adb remount$ remount succeeded2.4 在Google手機上調(diào)試Android源碼2.4.4 Google手機上調(diào)試Android源碼進入out/target/product/angler/system/priv-app/TeleService/目錄查證編譯后文件更新的情況,除了TeleService.apk文件更新,還有oat目錄也同時更新了,該目錄下有TeleService.odex
41、和TeleService.vdex,這兩個文件同樣需要安裝到Nexus 6P手機上對應(yīng)的目錄,否則我們的修改不會生效。具體操作如下:$ tree out/target/product/angler/system/priv-app/TeleService/oatout/target/product/angler/system/priv-app/TeleService/oat arm64 TeleService.odex TeleService.vdex$ adb push out/target/product/angler/system/priv-app/TeleService/TeleServ
42、ice.apk /system/priv-app/TeleService/out/target/product/angler/system/priv-app/TeleService/TeleService.apk: 1 file pushed. 21.0 MB/s (7691558 bytes in 0.350s)$ adb push out/target/product/angler/system/priv-app/TeleService/oat /system/priv-app/TeleService/ /重點關(guān)注push的目錄沒有oatout/target/product/angler/
43、system/priv-app/TeleService/oat/: 2 files pushed. 10.9 MB/s (2032058 bytes in 0.178s)$ adb reboot /重啟手機或是kill com.android.phone的進程重啟Android Telephony原理解析與開發(fā)指南第三章 深入解析通話流程3.1 撥號流程分析3.1.1 打開Nexus 6P手機的撥號盤3.1.2 進入撥號界面DialtactsActivity3.1.3 DialpadFragment撥號盤3.1.4 ITelecomService接收撥號請求服務(wù)3.1.5 CallsManag
44、er撥號流程處理3.1.6 IInCallService服務(wù)的響應(yīng)過程3.1.7 繼續(xù)分析CallsManager.placeOutgoingCall3.1.8 Telecom應(yīng)用撥號流程回顧與總結(jié)3.1.9 IConnectionService服務(wù)響應(yīng)過程3.1.10 Telecom Adapter接收消息回調(diào)3.1.11 撥號流程總結(jié)第三章 深入解析通話流程3.2 來電流程分析3.2.1 分析radio來電日志3.2.2 UNSOL_RESPONSE_CALL_STATE_CHANGED消息處理3.2.3 擴展RegistrantList消息處理機制3.2.4 GsmCdmaCallTra
45、cker消息處理3.2.5 ITelecomService處理來電消息3.2.6 來電流程總結(jié)3.3 通話總結(jié)3.3.1 通話關(guān)鍵代碼匯總3.3.2 通話狀態(tài)更新消息上報流程3.3.3 控制通話消息下發(fā)流程3.4 建立ANDROID通話模型3.5 本章小結(jié)3.1 撥號流程分析通過數(shù)據(jù)線將Nexus 6P手機連接到計算機,打開Ubuntu命令行,首先使用adb devices查看和確認手機與計算機連接是否成功,然后使用adb logcat相關(guān)命令查看Nexus 6P手機的運行日志)$ adb logcat -vtime -b eventsI/am_new_intent(797):0,695785
46、39,51,com.android.dialer/.app.DialtactsActivity,ent.action.MAIN,NULL,NULL,270532608點擊電話按鈕進入撥號界面,ActivityManagerService將啟動com.android.dialer 包下的DialtactsActivity3.1.1 打開Nexus 6P手機的撥號盤3.1 撥號流程分析查看DialtactsActivity的onClick方法,發(fā)現(xiàn)撥號浮動按鈕的響應(yīng)事件為調(diào)用當前類的showDialpadFragment方法,從而可以得知彈出撥號盤對應(yīng)的代碼是DialpadFragment.jav
47、a需要重點關(guān)注:packages/apps/Dialer/java/com/android/dialer/app/DialtactsActivity.java和dialtacts_activity.xml代碼代碼庫packages/apps/Dialer將編譯出Dialer.apk應(yīng)用程序,統(tǒng)一稱為Dialer應(yīng)用3.1.2 進入撥號界面DialtactsActivity3.1 撥號流程分析Dialer應(yīng)用中(com.android.dialer進程內(nèi))的撥號流程主要完成的任務(wù)是:DialpadFragment提供用戶撥號的交互界面CallIntentBuilder創(chuàng)建撥號請求的intent對
48、象TelecomManager繼續(xù)傳遞撥號請求intent對象3.1.3 DialpadFragment撥號盤3.1 撥號流程分析3.1.3 DialpadFragment撥號盤3.1 撥號流程分析ITelecomService的接口服務(wù)實現(xiàn)邏輯是TelecomServiceImpl.java,其代碼文件的詳細路徑是:packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java。代碼庫packages/services/Telecomm,編譯Telecom.apk應(yīng)用程序,統(tǒng)一稱為Teleco
49、m應(yīng)用。3.1.4 ITelecomService接收撥號請求服務(wù)3.1 撥號流程分析packages/services/Telecomm/AndroidManifest.xml文件服務(wù)定義的關(guān)鍵信息/指定運行進程為system_server系統(tǒng)進程 3.1.4 ITelecomService接收撥號請求服務(wù)跟進TelecomServiceImpl.java中的placeCall方法中的邏輯,將響應(yīng)Dialer應(yīng)用發(fā)起的跨進程服務(wù)接口調(diào)用,最終調(diào)用調(diào)用了CallsManager對象startOutgoingCall和placeOutgoingCall兩個方法。3.1 撥號流程分析3.1.5 C
50、allsManager撥號流程處理Telecom應(yīng)用中完成了第一次的bind Service和對應(yīng)Service的接口調(diào)用,對bindToService流程進行回顧和總結(jié)3.1 撥號流程分析3.1.5 CallsManager撥號流程處理總結(jié)Telecom應(yīng)用中的撥號流程3.1 撥號流程分析3.1.6 IInCallService服務(wù)的響應(yīng)過程InCallService的onBind流程3.1 撥號流程分析3.1.6 IInCallService服務(wù)的響應(yīng)過程InCallService的setInCallAdapter流程3.1 撥號流程分析3.1.6 IInCallService服務(wù)的響應(yīng)過
51、程IInCallService的addCall流程3.1 撥號流程分析3.1.7 繼續(xù)分析CallsManager.placeOutgoingCall撥號流程中Telecom第二次bind Service與第一次bind Service的處理過程非常相似,分三步走:bind ServiceaddConnectionServiceAdaptercreateConnection第二次bind Service的服務(wù)對象為: SERVICE_INTERFACE ,即“android.telecom.ConnectionService”3.1 撥號流程分析3.1.8 Telecom應(yīng)用撥號流程回顧與總結(jié)
52、撥號流程跟蹤到這一步,已經(jīng)涉及到三個應(yīng)用的消息傳遞Dialer、Telecom和TeleService,可見流程復(fù)雜和漫長,消息類型又相近,比如,兩次服務(wù)的bind過程,幾個Call對象的創(chuàng)建、轉(zhuǎn)換和傳遞,各種Listener消息回調(diào)等等。Telecom應(yīng)用CallsManager對象的startOutgoingCall和placeOutgoingCall方法,兩次bind 綁定不同的服務(wù),并且過程也非常相似,分三步走,總結(jié)如下:bind ServicesetInCallAdapter/addConnectionServiceAdapteraddCall/createConnection3.1
53、 撥號流程分析3.1.9 IConnectionService服務(wù)響應(yīng)過程TeleService應(yīng)用中的撥號流程3.1 撥號流程分析3.1.10 Telecom Adapter接收消息回調(diào)3.1 撥號流程分析3.1.11撥號流程總結(jié)撥號流程,需要把撥號請求發(fā)送到RIL層,我們跟蹤到了五個代碼庫和三個Android系統(tǒng)應(yīng)用Dialer、Telecom、TeleService,需要我們重點掌握以下幾點。撥號入口DialpadFragment第一次跨進程訪問Telecom應(yīng)用第一次bind ServiceTelecom應(yīng)用第二次bind ServiceAdapter第一次回調(diào)Telecom應(yīng)用中的撥
54、號流程Dialer和TeleService應(yīng)用中對應(yīng)服務(wù)的響應(yīng)3.2 來電流程分析3.2.1 分析radio來電日志I/RILQ (604): (0/604):RIL0event qcril_qmi_voice_all_call_status_ind_hdlr: call state INCOMING for conn id 1I/RILQ (604): (0/604):RIL0event qcril_qmi_voice_voip_create_call_info_entry: Created call info entry 0 x7a49883000 with call android id
55、 1, qmi id 1, media id 7D/RILJ (1109): UNSL GET_CURRENT_CALLS SUB0D/RILJ (1109): 4185 RIL - TeleService - Telecom - Dialer一層一層上報通話狀態(tài)為通話中的消息處理和發(fā)送過程,重點掌握以下幾點:三個應(yīng)用的Call信息傳遞RegistrantList消息處理TelephonyConnection對象的Listener注冊IConnectionServiceAdapter接口匯總IInCallService接口匯總3.3 通話總結(jié)3.3.3 控制通話消息下發(fā)流程我們在通話界面,想更
56、改當前通話狀態(tài),比如掛斷/接聽當前接收到來電,掛斷或保持通當前通話等操作,我們可以理解為控制通話消息下發(fā)的過程,從Dialer - Telecom - TeleService - RIL - Modem通話控制消息一層一層的下發(fā),最終交給Modem處理具體的通話控制三個應(yīng)用的控制消息傳遞IInCallAdapter接口匯總IConnectionService接口匯總3.4 建立Android通話模型Android通話模型3.4 建立Android通話模型3.4.1 系統(tǒng)的分層Dialer、Telecom和TeleService三大應(yīng)用可理解為:Dialer應(yīng)用是普通的Android App應(yīng)用
57、,其運行進程的用戶信息和進程信息也能說明此問題;Telecom應(yīng)用運行在system_server進程上,其進程用戶名為system系統(tǒng)用戶,說明它是在Android Framework框架層;TeleService應(yīng)用運行的進程名是com.android.phone,其進程的用戶名是radio,承載著Telephony Call協(xié)議棧,同樣可以認為它運行在Android Framework框架層;最后是RIL它運行在HAL硬件抽象層。3.4 建立Android通話模型3.4.2 交互方式 Dialer、Telecom、TeleService和RIL都是通過服務(wù)進行交互的,圖3-16中,它們之
58、間有箭頭連接的都是通過Service跨進程的接口調(diào)用實現(xiàn)的。Dialer與TeleService之間沒有直接的消息傳遞,都是通過Telecom進行消息中轉(zhuǎn),Telecom與RIL同樣沒有直接的消息傳遞,通過TeleService進行消息中轉(zhuǎn)。 通過Service進行跨進程接口調(diào)用實現(xiàn)消息,Service接口調(diào)用本身就是同步的接口調(diào)用,在Service端的實現(xiàn)將轉(zhuǎn)換為異步的方式處理,待消息處理完成后,在使用回調(diào)的接口傳遞消息處理的結(jié)果。3.4 建立Android通話模型3.4.3 對通話相關(guān)流程分解根據(jù)消息的傳遞方向,可分解成兩大類:第一類控制通話消息下發(fā)流程:應(yīng)用層通過框架層向RIL層發(fā)起通話
59、管理和控制相關(guān)RIL請求,RIL層轉(zhuǎn)換成對應(yīng)的消息發(fā)送給Modem執(zhí)行,其中包括撥號、接聽電話、拒接電話、保持、恢復(fù)通話等;第二類通話狀態(tài)更新消息上報流程:RIL層接收到Modem的Call狀態(tài)變化通知,通過框架層向應(yīng)用層發(fā)起通話狀態(tài)變化通知,包括來電、電話接通、進入通話中等通話狀態(tài)改變。3.5 本章小結(jié)本章根據(jù)通話的主要四個流程結(jié)合代碼進行了詳細的解析和總結(jié):主動撥號流程被動接收來電流程本地主動控制通話狀態(tài)流程通話狀態(tài)變更消息上報流程這些通話相關(guān)流程之間有什么關(guān)系或者規(guī)律呢?建立Android通話模型可以回答這個問題,在學(xué)習(xí)Telephony過程中,一定要掌握和理解這個模型。2.4 在Goo
60、gle手機上調(diào)試Android源碼2.4.4 Google手機上調(diào)試Android源碼日志驗證代碼修改內(nèi)容$ mlog |grep -i nexus 6p/mlog -s Android02-26 00:01:28.077 4671 4671 D Android : My Code run on the Nexus 6P“02-26 00:01:28.077”:以手機上時間為準的時間戳“Android”:是打印日志的TAG“My Code run on the Nexus 6P”:是日志打印內(nèi)容到此,我們已經(jīng)成功搭建了Android源代碼調(diào)試環(huán)境,從Android官網(wǎng)下載Android8.1.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建師范大學(xué)《學(xué)校團體心理輔導(dǎo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年二級建造師實務(wù)集訓(xùn)模擬題二-答案
- 財務(wù)管理-旅行社清算報告模板
- 診所虧損原因財務(wù)分析報告模板
- 福建師范大學(xué)《環(huán)境工程學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《公共管理類專業(yè)導(dǎo)論》2021-2022學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《德育原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江省杭州市2022年中考英語真題(含答案)
- 規(guī)范學(xué)習(xí)考試題目(低壓電器)
- 特色活動教學(xué)論文評比活動方案總結(jié)
- 國網(wǎng)新安規(guī)培訓(xùn)考試題及答案
- 5.1+走近老師(課件)2024-2025學(xué)年七年級道德與法治上冊統(tǒng)編版
- 湖南省長沙市2023-2024學(xué)年八年級上學(xué)期期中考試數(shù)學(xué)試卷(含答案)
- 山西省運城市2024-2025學(xué)年高二上學(xué)期10月月考英語試題
- 【班主任工作】2024-2025學(xué)年秋季安全主題班會教育周記錄
- 2024年云南合和(集團)股份限公司招聘3人高頻500題難、易錯點模擬試題附帶答案詳解
- 2024-2030年中國蛋及蛋制品行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- +陜西省渭南市富平縣2023-2024學(xué)年九年級上學(xué)期摸底數(shù)學(xué)試卷
- 2023年法律職業(yè)資格《客觀題卷一》真題及答案
- 《探究與實踐 交通運輸在全球經(jīng)濟發(fā)展中的作用》課件-2024-2025學(xué)年七年級地理上冊湘教版
- 《信息技術(shù)基礎(chǔ)與應(yīng)用(第2版)(上冊)》高職全套教學(xué)課件
評論
0/150
提交評論