版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Android Telephony原理解析與開發(fā)指南第一章 初識(shí)Android1.1 Smart Phone智能手機(jī)的系統(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)運(yùn)行庫(kù)層(User Libraries)1.2.4 核心層(Linux Kernel)1.3 Android Telephony框架結(jié)構(gòu)1.4 本章小結(jié)1.1 Smart Phone智能手機(jī)的系統(tǒng)結(jié)構(gòu)隨著手機(jī)芯片處理能力的提升、上網(wǎng)能力的擴(kuò)展和發(fā)展(藍(lán)牙、Wi-Fi、4G網(wǎng)絡(luò)),手機(jī)應(yīng)用得到非常廣泛的擴(kuò)大和發(fā)展。在Smart Phon
2、e的硬件設(shè)計(jì)上,采用處理能力比較強(qiáng)大的處理器作為AP應(yīng)用處理器,來支持開放手機(jī)操作系統(tǒng)及操作系統(tǒng)之上的擴(kuò)展應(yīng)用,由此可見智能手機(jī)發(fā)展的趨勢(shì)和方向。1.2 Android系統(tǒng)架構(gòu)Android手機(jī)操作系統(tǒng)是一個(gè)分層的基于Linux Kernel智能手機(jī)操作系統(tǒng),共有分為4層,從上到下分別是:Applications(應(yīng)用層)Framework(應(yīng)用框架層)Libraries(系統(tǒng)運(yùn)行庫(kù)層)Linux Kernel(核心層)1.2 Android系統(tǒng)架構(gòu)應(yīng)用層包括了Android各種應(yīng)用程序,這些應(yīng)用程序是使用Java語(yǔ)言開發(fā),并運(yùn)行在Dalvik虛擬機(jī)上,在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)用時(shí)所使用的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)運(yùn)行庫(kù)層(User Libraries),這一層主要包含了手機(jī)系統(tǒng)平臺(tái)必須的C/C+核心庫(kù)、Dalvik虛擬機(jī)運(yùn)行環(huán)境和HAL子層。1.C/C+核心庫(kù),如libc(系統(tǒng)C庫(kù))、Media Framework(多媒體庫(kù))、OpenGL、SQLite、WebKit、SSL2.Dalvik虛擬機(jī)運(yùn)行環(huán)境每一個(gè)Android應(yīng)用程序都運(yùn)行在Dalvik虛擬機(jī)之上,且每一個(gè)應(yīng)用程序都有自己獨(dú)立運(yùn)行的進(jìn)程空間;Dalvik虛擬機(jī)只執(zhí)行DEX可執(zhí)行文件。1.2.3 系統(tǒng)運(yùn)行庫(kù)層(User Libraries)1.2 Android系統(tǒng)架
5、構(gòu)Android 基于Linux Kernel 提供核心系統(tǒng)服務(wù),例如文件管理、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)堆棧、驅(qū)動(dòng)模型等操作系統(tǒng)的基本服務(wù)能力。Linux Kernel內(nèi)核同時(shí)也作為硬件和軟件之間的抽象層,需要一些與移動(dòng)設(shè)備相關(guān)驅(qū)動(dòng)程序支持,主要的驅(qū)動(dòng)有:Display Driver(顯示驅(qū)動(dòng))、Keyboard Driver(鍵盤驅(qū)動(dòng))、Audio Driver(音頻驅(qū)動(dòng))、Power Management(電源管理)、Binder IPC驅(qū)動(dòng)、Bluetooth Driver(藍(lán)牙驅(qū)動(dòng))、WIFI Driver(Wi-Fi驅(qū)動(dòng))、Camera Driver(照相機(jī)驅(qū)動(dòng))等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智能手機(jī)硬件基本結(jié)構(gòu)Android系統(tǒng)在AP應(yīng)用處理器上運(yùn)行,而Telephony運(yùn)行在Linux Kernel之上的User Space空間。Android Telephony也采用了分層結(jié)構(gòu)的設(shè)計(jì),共跨越了三層Applications、Framework和User Libraries層,與Android操作系統(tǒng)整體分層結(jié)構(gòu)保持一致;Android
7、Telephony從上到下工分三層,Telephony應(yīng)用、Telephony框架、RIL(Radio Interface Layer,無(wú)線通信接口層,主要位于User Libraries層中的HAL層中,什么是HAL,接下來詳細(xì)介紹)。BP SoftWare在BP基帶處理器上運(yùn)行,主要負(fù)責(zé)實(shí)際的無(wú)線通信能力處理,不在本書討論的范圍。1.3 Android Telephony框架結(jié)構(gòu)了解Android HAL的設(shè)計(jì)與實(shí)現(xiàn)1.4 本章小結(jié)還記得Smart Phone智能手機(jī)基本硬件中的AP和BP主從處理器結(jié)構(gòu)嗎?基于Android平臺(tái)手機(jī)也符合Smart Phone的體系結(jié)構(gòu),Android是基
8、于Linux Kernel運(yùn)行在AP上的智能手機(jī)操作系統(tǒng),同時(shí)也是一個(gè)分層的操作系統(tǒng)平臺(tái),從上到下主要分為4層;在AP上運(yùn)行的Telephony相關(guān)應(yīng)用與Android整體分層結(jié)構(gòu)是保持一致,每層中的Telephony相關(guān)內(nèi)容都是本書重點(diǎn)講述的內(nèi)容。Android手機(jī)中的基本通信能力跨越了AP和BP,AP和BP的相互協(xié)作完成了基本的通信功能,AP上的各種Telephony應(yīng)用,通過豐富的界面展示了通信相關(guān)的各種形式和狀態(tài),也可通過界面向BP發(fā)起通信能力相關(guān)的控制,且BP中負(fù)責(zé)實(shí)施具體的通信能力;這里提出一個(gè)問題,請(qǐng)讀者結(jié)合本章內(nèi)容思考:Android Telephony處于在整個(gè)Android
9、智能手機(jī)平臺(tái)什么位置,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)工具包更新升級(jí)2.2 Android源代碼下載及編譯過程2.2.1 源代碼下載2.2.2 編譯Android 源代碼2.2.3 編譯單個(gè)模塊第二章 搭建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啟動(dòng)Android虛擬設(shè)備2.3.4 Android調(diào)試工具adb的使用方法2.3.5 相關(guān)技巧匯總說明2.4 在Google手機(jī)上調(diào)試Android源碼2.4.1 Google手機(jī)對(duì)應(yīng)編譯選項(xiàng)2.4.2 Google手機(jī)刷入工廠鏡像2.4.3 編譯本地鏡像并刷入Google手機(jī)2.4.4 Google手機(jī)上調(diào)試Android源碼2.5 本章小結(jié)2.1 Ubuntu Linux操作系統(tǒng)及工具安裝CPU類型:英特爾酷睿i5處理器或i7處理器內(nèi)存:8GB或更大容量?jī)?nèi)存硬盤容量:500GB或1T顯
11、卡:集成顯卡或其他獨(dú)立顯卡2.1.1 PC配置建議2.1 Ubuntu Linux操作系統(tǒng)及工具安裝選用64位Ubuntu 17.10桌面版操作系統(tǒng)Ubuntu向?qū)桨惭b過程,其中的關(guān)鍵是磁盤合理分區(qū)。 目前PC市場(chǎng)上硬盤都較大,2T已成為基本配置,本例中的/ 根目錄掛載分區(qū)包括了/home用戶數(shù)據(jù)分區(qū)(讀者也可以分配獨(dú)立的/home分區(qū)掛載點(diǎn)),在Android編譯環(huán)境中,源代碼的保存和編譯都在此空間進(jì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)中安裝和驗(yàn)證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í)行此命令驗(yàn)證工具包是否完整安裝和更新0 upgraded, 0 newly installed, 0 to remove and 247 not upgraded. 說明所有的包沒有遺漏,都已經(jīng)安裝完成,如每個(gè)工具包提示均已完成更新和安裝,便可進(jìn)入下一步操作,否則我們繼續(xù)執(zhí)行此命令更新和安裝剩余未完成的Ubuntu系統(tǒng)工具包。2.1.4 Ubuntu系統(tǒng)工具包更新升級(jí)2.2 Android源代碼下載及編譯過程步驟一:下載并配置repo$ sudo a
15、pt-get install python$ curl /git-repo-downloads/repo repo$ chmod a+x repo注意:在/用戶主目錄下新建一個(gè)bin目錄,并將此目錄設(shè)置在PATH目錄中;我們將保存常用的一些腳本或二進(jìn)制可執(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個(gè)人信息$ 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ù)實(shí)際情況,選擇最新的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前有一個(gè)空格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源代碼下載及編譯過程編譯信息確認(rèn)并開始編譯=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 /編譯號(hào)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 /進(jìn)入framework代碼目錄$ mm /編譯framework$ cd $oreo$ make TeleService /編譯TeleService應(yīng)用$ make frame
22、work /編譯framework.jar應(yīng)用2.2.3 編譯單個(gè)模塊2.3 Android Studio及SDKAndroid Studio的下載地址:/studio/index.html,Google提供了Windows 32/64、Mac和Linux不同的4個(gè)平臺(tái)版本供我們下載和使用。選擇Linux版本,下載android-studio-ide-171.4443003-linux.zip文件到本地。$ unzip android-studio-ide-171.4443003-linux.zip$ cd android-studio/bin$ ./studio.sh/啟動(dòng)Android S
23、tudio2.3.1 下載和配置Android Studio2.3 Android Studio及SDK(1)第一次啟動(dòng)Android Studio將啟動(dòng)安裝向?qū)?,將在線更新Android SDK、Gradle等工具包,要關(guān)閉啟動(dòng)安裝向?qū)В尚薷腷in目錄下的perties配置文件,增加一行配置信息如下:disable.android.first.run=true(2)每次啟動(dòng)Android Studio都需要進(jìn)入android-studio/bin目錄,再運(yùn)行studio.sh腳本,操作較多,比較省事的辦法是增加一個(gè)desktop圖標(biāo),在Ubuntu Activity菜單中方便啟動(dòng),具體的操
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鼠標(biāo)左鍵單擊Ubuntu Activity,輸入androidstud
25、io即可匹配出Android Studio應(yīng)用,鼠標(biāo)左鍵單擊Android Studio圖標(biāo)即可啟動(dòng)它了。2.3.1 下載和配置Android Studio2.3 Android Studio及SDKAndroid SDK的下載頁(yè)面與Android Studio在同一個(gè)頁(yè)面:/studio/index.html,Google提供了Windows、Mac和Linux三個(gè)平臺(tái)的版本供我們下載和使用。同樣選擇Linux版本,下載sdk-tools-linux-3859397.zip到本地(1)此版本的Android SDK是基本的 Android 命令行工具,可以使用此工具中包含的sdkmanage
26、r工具下載和更新其他的SDK工具包。(2)使用Android Studio通過界面的方式管理更加方便的管理Android SDK。啟動(dòng)Android Studio,在Configure彈出的菜單中選擇SDK Manager或者在Android Studio File菜單-Settings界面中,進(jìn)入Android SDK管理界面。(3)SDK Manager界面列出了Android已經(jīng)發(fā)布的所有SDK版本,選擇安裝的Android SDK版本越多,下載和安裝時(shí)間就越長(zhǎng),需要的磁盤空間就越大;讀者可以根據(jù)自己的興趣和需要選擇下載。(4)Android SDK安裝完成后,還請(qǐng)記錄SDK中對(duì)應(yīng)工具的
27、PATH路徑。2.3.2 Android SDK下載及配置和使用2.3 Android Studio及SDK啟動(dòng)Android Studio,Tools菜單-Android選項(xiàng)-AVD Manager,打開AVD Manager,通過界面向?qū)降牟僮鲃?chuàng)建虛擬設(shè)備。2.3.3 使用Android SDK啟動(dòng)Android虛擬設(shè)備2.3 Android Studio及SDKAndroid模擬設(shè)備啟動(dòng)完成后,會(huì)默認(rèn)5554端口連接到計(jì)算機(jī),這時(shí)可運(yùn)行adb devices命令查看連接到本地計(jì)算機(jī)上的Android設(shè)備列表,詳情如下:$ adb devicesList of devices attac
28、hed emulator-5554device /device狀態(tài)為正常情況,可查看模擬器運(yùn)行日志查看虛擬機(jī)運(yùn)行日志: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日志輸出腳本我們?cè)陂_發(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 查找代碼腳本面對(duì)Android浩瀚的代碼量,如何能快速的找到一些關(guān)鍵字呢?Android源碼中已經(jīng)給您準(zhǔn)備了對(duì)應(yīng)的腳本工具,就在源碼主目錄下的build/envsetup.sh文件中。$ gedit build/envsetup.shfunction jgrep() /查找并匹配java文件文件中對(duì)應(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)文件文件中對(duì)應(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手機(jī)上調(diào)試Android源碼2.4.1 Google手機(jī)對(duì)應(yīng)編譯選項(xiàng)終端代碼名稱編譯選項(xiàng)Pixel XLmarlinaosp_marlin-userdebugPixelsailfishaosp_sailfish-userdebugHiKey(開發(fā)板)hikeyhikey-userdebugNexus 6Pangleraosp_angler-userdebugNexus 5Xbullheadaosp_bullhead-userdebugNexus 6shamuaosp_shamu-userdebug2.4 在Google手機(jī)上調(diào)試Android源碼2.4.2 Google手機(jī)刷入工
32、廠鏡像Google Nexus和Pixel系列手機(jī)的工廠鏡像文件的下載地址:/android/images,Nexus 6P手機(jī)對(duì)應(yīng)的Factory Images是angler 8.1.0 (OPM1.171019.011, Dec 2017),即Nexus 6P手機(jī)Android 8.1.0工廠刷機(jī)鏡像。2.4 在Google手機(jī)上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機(jī)1. 下載Google手機(jī)對(duì)應(yīng)的驅(qū)動(dòng)文件Driver Binaries/android/drivers,選擇Nexus 6P (angler) binaries for Android 8.1.0
33、 (OPM1.171019.011)的兩個(gè)Driver文件Vendor image和Qualcomm,對(duì)應(yīng)的文件名分別是:huawei-angler-opm1.171019.011-41db8ed5.tgz和qcom-angler-opm1.171019.011-f7e511bb.tgz,解壓后是兩個(gè)Shell腳本:extract-huawei-angler.sh和extract-qcom-angler.sh,并將這兩個(gè)文件拷貝到Android O源碼的主目錄下。2.4 在Google手機(jī)上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機(jī)2. Driver Binaries
34、導(dǎo)入到Android 8.1.0 源碼工程/android/drivers,選擇Nexus 6P (angler) binaries for Android 8.1.0 (OPM1.171019.011)的兩個(gè)Driver文件Vendor image和Qualcomm,對(duì)應(yīng)的文件名分別是:huawei-angler-opm1.171019.011-41db8ed5.tgz和qcom-angler-opm1.171019.011-f7e511bb.tgz,解壓后是兩個(gè)Shell腳本:extract-huawei-angler.sh和extract-qcom-angler.sh,并將這兩個(gè)文件拷貝
35、到Android O源碼的主目錄下。2.4 在Google手機(jī)上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機(jī)3. 使用angler編譯選項(xiàng)重新編譯前面的編譯Android源碼,lunch選項(xiàng)是aosp_arm64-eng,而現(xiàn)在導(dǎo)入了Nexus 6P的驅(qū)動(dòng)文件后,編譯Nexus 6P手機(jī)對(duì)應(yīng)的鏡像文件,在lunch的時(shí)候需要選擇aosp_angler-userdebug,并以全新的方式編譯整個(gè)代碼,最簡(jiǎn)單的方式就是刪除保存編譯結(jié)果的out目錄。2.4 在Google手機(jī)上調(diào)試Android源碼2.4.3 編譯本地鏡像并刷入Google手機(jī)4. fastboot刷入本地編
36、譯出的鏡像文件$ sudo s /一定要使用root賬號(hào)刷機(jī),否則沒有權(quán)限,fastboot將刷機(jī)失敗# fastboot flash boot boot.img# fastboot flash system system.img# fastboot flash vendor vendor.img # fastboot flash userdata userdata.img# fastboot reboot2.4 在Google手機(jī)上調(diào)試Android源碼2.4.4 Google手機(jī)上調(diào)試Android源碼選擇com.android.phone進(jìn)程加載的代碼入口文件PhoneApp.java,
37、作為修改實(shí)例,其相對(duì)路徑為:packages/services/Telephony/src/com/android/phone/PhoneApp.java。在Android Studio連續(xù)快速的兩次按下右Shift按鍵,輸入PhoneApp.java將快速匹配出該文件,在代碼中的onCreate方法增加一行打印日志的代碼來驗(yàn)證代碼修改后是否能成功運(yùn)行在Google手機(jī)上,代碼修改和編譯詳情如下: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手機(jī)上調(diào)試Android源碼2.4.4 Google手機(jī)上調(diào)試Android源碼TeleService.apk,需要將此文件push到Nexus 6P手機(jī)上運(yùn)行,再此之前還需要remount手機(jī),只有remount成功以后才能push apk系統(tǒng)應(yīng)用、系統(tǒng)jar包、so動(dòng)態(tài)庫(kù)等文件到手機(jī)/system掛載點(diǎn)。具體操作如下:$ 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/需要重啟手機(jī)$ adb reboot$ adb rootrestarting adbd as root$ adb remount$ remount succeeded2.4 在Google手機(jī)上調(diào)試Android源碼2.4.4 Google手機(jī)上調(diào)試Android源碼進(jìn)入out/target/product/angler/system/priv-app/TeleService/目錄查證編譯后文件更新的情況,除了TeleService.apk文件更新,還有oat目錄也同時(shí)更新了,該目錄下有TeleService.odex
41、和TeleService.vdex,這兩個(gè)文件同樣需要安裝到Nexus 6P手機(jī)上對(duì)應(yīng)的目錄,否則我們的修改不會(huì)生效。具體操作如下:$ 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/ /重點(diǎn)關(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 /重啟手機(jī)或是kill com.android.phone的進(jìn)程重啟Android Telephony原理解析與開發(fā)指南第三章 深入解析通話流程3.1 撥號(hào)流程分析3.1.1 打開Nexus 6P手機(jī)的撥號(hào)盤3.1.2 進(jìn)入撥號(hào)界面DialtactsActivity3.1.3 DialpadFragment撥號(hào)盤3.1.4 ITelecomService接收撥號(hào)請(qǐng)求服務(wù)3.1.5 CallsManag
44、er撥號(hào)流程處理3.1.6 IInCallService服務(wù)的響應(yīng)過程3.1.7 繼續(xù)分析CallsManager.placeOutgoingCall3.1.8 Telecom應(yīng)用撥號(hào)流程回顧與總結(jié)3.1.9 IConnectionService服務(wù)響應(yīng)過程3.1.10 Telecom Adapter接收消息回調(diào)3.1.11 撥號(hào)流程總結(jié)第三章 深入解析通話流程3.2 來電流程分析3.2.1 分析radio來電日志3.2.2 UNSOL_RESPONSE_CALL_STATE_CHANGED消息處理3.2.3 擴(kuò)展RegistrantList消息處理機(jī)制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)更新消息上報(bào)流程3.3.3 控制通話消息下發(fā)流程3.4 建立ANDROID通話模型3.5 本章小結(jié)3.1 撥號(hào)流程分析通過數(shù)據(jù)線將Nexus 6P手機(jī)連接到計(jì)算機(jī),打開Ubuntu命令行,首先使用adb devices查看和確認(rèn)手機(jī)與計(jì)算機(jī)連接是否成功,然后使用adb logcat相關(guān)命令查看Nexus 6P手機(jī)的運(yùn)行日志)$ 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點(diǎn)擊電話按鈕進(jìn)入撥號(hào)界面,ActivityManagerService將啟動(dòng)com.android.dialer 包下的DialtactsActivity3.1.1 打開Nexus 6P手機(jī)的撥號(hào)盤3.1 撥號(hào)流程分析查看DialtactsActivity的onClick方法,發(fā)現(xiàn)撥號(hào)浮動(dòng)按鈕的響應(yīng)事件為調(diào)用當(dāng)前類的showDialpadFragment方法,從而可以得知彈出撥號(hào)盤對(duì)應(yīng)的代碼是DialpadFragment.jav
47、a需要重點(diǎn)關(guān)注:packages/apps/Dialer/java/com/android/dialer/app/DialtactsActivity.java和dialtacts_activity.xml代碼代碼庫(kù)packages/apps/Dialer將編譯出Dialer.apk應(yīng)用程序,統(tǒng)一稱為Dialer應(yīng)用3.1.2 進(jìn)入撥號(hào)界面DialtactsActivity3.1 撥號(hào)流程分析Dialer應(yīng)用中(com.android.dialer進(jìn)程內(nèi))的撥號(hào)流程主要完成的任務(wù)是:DialpadFragment提供用戶撥號(hào)的交互界面CallIntentBuilder創(chuàng)建撥號(hào)請(qǐng)求的intent對(duì)
48、象TelecomManager繼續(xù)傳遞撥號(hào)請(qǐng)求intent對(duì)象3.1.3 DialpadFragment撥號(hào)盤3.1 撥號(hào)流程分析3.1.3 DialpadFragment撥號(hào)盤3.1 撥號(hào)流程分析ITelecomService的接口服務(wù)實(shí)現(xiàn)邏輯是TelecomServiceImpl.java,其代碼文件的詳細(xì)路徑是:packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java。代碼庫(kù)packages/services/Telecomm,編譯Telecom.apk應(yīng)用程序,統(tǒng)一稱為Teleco
49、m應(yīng)用。3.1.4 ITelecomService接收撥號(hào)請(qǐng)求服務(wù)3.1 撥號(hào)流程分析packages/services/Telecomm/AndroidManifest.xml文件服務(wù)定義的關(guān)鍵信息/指定運(yùn)行進(jìn)程為system_server系統(tǒng)進(jìn)程 3.1.4 ITelecomService接收撥號(hào)請(qǐng)求服務(wù)跟進(jìn)TelecomServiceImpl.java中的placeCall方法中的邏輯,將響應(yīng)Dialer應(yīng)用發(fā)起的跨進(jìn)程服務(wù)接口調(diào)用,最終調(diào)用調(diào)用了CallsManager對(duì)象startOutgoingCall和placeOutgoingCall兩個(gè)方法。3.1 撥號(hào)流程分析3.1.5 C
50、allsManager撥號(hào)流程處理Telecom應(yīng)用中完成了第一次的bind Service和對(duì)應(yīng)Service的接口調(diào)用,對(duì)bindToService流程進(jìn)行回顧和總結(jié)3.1 撥號(hào)流程分析3.1.5 CallsManager撥號(hào)流程處理總結(jié)Telecom應(yīng)用中的撥號(hào)流程3.1 撥號(hào)流程分析3.1.6 IInCallService服務(wù)的響應(yīng)過程InCallService的onBind流程3.1 撥號(hào)流程分析3.1.6 IInCallService服務(wù)的響應(yīng)過程InCallService的setInCallAdapter流程3.1 撥號(hào)流程分析3.1.6 IInCallService服務(wù)的響應(yīng)過
51、程IInCallService的addCall流程3.1 撥號(hào)流程分析3.1.7 繼續(xù)分析CallsManager.placeOutgoingCall撥號(hào)流程中Telecom第二次bind Service與第一次bind Service的處理過程非常相似,分三步走:bind ServiceaddConnectionServiceAdaptercreateConnection第二次bind Service的服務(wù)對(duì)象為: SERVICE_INTERFACE ,即“android.telecom.ConnectionService”3.1 撥號(hào)流程分析3.1.8 Telecom應(yīng)用撥號(hào)流程回顧與總結(jié)
52、撥號(hào)流程跟蹤到這一步,已經(jīng)涉及到三個(gè)應(yīng)用的消息傳遞Dialer、Telecom和TeleService,可見流程復(fù)雜和漫長(zhǎng),消息類型又相近,比如,兩次服務(wù)的bind過程,幾個(gè)Call對(duì)象的創(chuàng)建、轉(zhuǎn)換和傳遞,各種Listener消息回調(diào)等等。Telecom應(yīng)用CallsManager對(duì)象的startOutgoingCall和placeOutgoingCall方法,兩次bind 綁定不同的服務(wù),并且過程也非常相似,分三步走,總結(jié)如下:bind ServicesetInCallAdapter/addConnectionServiceAdapteraddCall/createConnection3.1
53、 撥號(hào)流程分析3.1.9 IConnectionService服務(wù)響應(yīng)過程TeleService應(yīng)用中的撥號(hào)流程3.1 撥號(hào)流程分析3.1.10 Telecom Adapter接收消息回調(diào)3.1 撥號(hào)流程分析3.1.11撥號(hào)流程總結(jié)撥號(hào)流程,需要把撥號(hào)請(qǐng)求發(fā)送到RIL層,我們跟蹤到了五個(gè)代碼庫(kù)和三個(gè)Android系統(tǒng)應(yīng)用Dialer、Telecom、TeleService,需要我們重點(diǎn)掌握以下幾點(diǎn)。撥號(hào)入口DialpadFragment第一次跨進(jìn)程訪問Telecom應(yīng)用第一次bind ServiceTelecom應(yīng)用第二次bind ServiceAdapter第一次回調(diào)Telecom應(yīng)用中的撥
54、號(hào)流程Dialer和TeleService應(yīng)用中對(duì)應(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一層一層上報(bào)通話狀態(tài)為通話中的消息處理和發(fā)送過程,重點(diǎn)掌握以下幾點(diǎn):三個(gè)應(yīng)用的Call信息傳遞RegistrantList消息處理TelephonyConnection對(duì)象的Listener注冊(cè)IConnectionServiceAdapter接口匯總IInCallService接口匯總3.3 通話總結(jié)3.3.3 控制通話消息下發(fā)流程我們?cè)谕ㄔ捊缑?,想?/p>
56、改當(dāng)前通話狀態(tài),比如掛斷/接聽當(dāng)前接收到來電,掛斷或保持通當(dāng)前通話等操作,我們可以理解為控制通話消息下發(fā)的過程,從Dialer - Telecom - TeleService - RIL - Modem通話控制消息一層一層的下發(fā),最終交給Modem處理具體的通話控制三個(gè)應(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、,其運(yùn)行進(jìn)程的用戶信息和進(jìn)程信息也能說明此問題;Telecom應(yīng)用運(yùn)行在system_server進(jìn)程上,其進(jìn)程用戶名為system系統(tǒng)用戶,說明它是在Android Framework框架層;TeleService應(yīng)用運(yùn)行的進(jìn)程名是com.android.phone,其進(jìn)程的用戶名是radio,承載著Telephony Call協(xié)議棧,同樣可以認(rèn)為它運(yùn)行在Android Framework框架層;最后是RIL它運(yùn)行在HAL硬件抽象層。3.4 建立Android通話模型3.4.2 交互方式 Dialer、Telecom、TeleService和RIL都是通過服務(wù)進(jìn)行交互的,圖3-16中,它們之
58、間有箭頭連接的都是通過Service跨進(jìn)程的接口調(diào)用實(shí)現(xiàn)的。Dialer與TeleService之間沒有直接的消息傳遞,都是通過Telecom進(jìn)行消息中轉(zhuǎn),Telecom與RIL同樣沒有直接的消息傳遞,通過TeleService進(jìn)行消息中轉(zhuǎn)。 通過Service進(jìn)行跨進(jìn)程接口調(diào)用實(shí)現(xiàn)消息,Service接口調(diào)用本身就是同步的接口調(diào)用,在Service端的實(shí)現(xiàn)將轉(zhuǎn)換為異步的方式處理,待消息處理完成后,在使用回調(diào)的接口傳遞消息處理的結(jié)果。3.4 建立Android通話模型3.4.3 對(duì)通話相關(guān)流程分解根據(jù)消息的傳遞方向,可分解成兩大類:第一類控制通話消息下發(fā)流程:應(yīng)用層通過框架層向RIL層發(fā)起通話
59、管理和控制相關(guān)RIL請(qǐng)求,RIL層轉(zhuǎn)換成對(duì)應(yīng)的消息發(fā)送給Modem執(zhí)行,其中包括撥號(hào)、接聽電話、拒接電話、保持、恢復(fù)通話等;第二類通話狀態(tài)更新消息上報(bào)流程:RIL層接收到Modem的Call狀態(tài)變化通知,通過框架層向應(yīng)用層發(fā)起通話狀態(tài)變化通知,包括來電、電話接通、進(jìn)入通話中等通話狀態(tài)改變。3.5 本章小結(jié)本章根據(jù)通話的主要四個(gè)流程結(jié)合代碼進(jìn)行了詳細(xì)的解析和總結(jié):主動(dòng)撥號(hào)流程被動(dòng)接收來電流程本地主動(dòng)控制通話狀態(tài)流程通話狀態(tài)變更消息上報(bào)流程這些通話相關(guān)流程之間有什么關(guān)系或者規(guī)律呢?建立Android通話模型可以回答這個(gè)問題,在學(xué)習(xí)Telephony過程中,一定要掌握和理解這個(gè)模型。2.4 在Goo
60、gle手機(jī)上調(diào)試Android源碼2.4.4 Google手機(jī)上調(diào)試Android源碼日志驗(yàn)證代碼修改內(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”:以手機(jī)上時(shí)間為準(zhǔn)的時(shí)間戳“Android”:是打印日志的TAG“My Code run on the Nexus 6P”:是日志打印內(nèi)容到此,我們已經(jīng)成功搭建了Android源代碼調(diào)試環(huán)境,從Android官網(wǎng)下載Android8.1.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 桂平市九年級(jí)上學(xué)期語(yǔ)文期中考試卷
- 八年級(jí)上學(xué)期語(yǔ)文11月期中考試試卷
- 風(fēng)電專業(yè)考試題庫(kù)帶答案
- 四年級(jí)數(shù)學(xué)(三位數(shù)乘兩位數(shù))計(jì)算題專項(xiàng)練習(xí)及答案
- 自建房安裝水電合同范本(2篇)
- 激勵(lì)作業(yè)課件教學(xué)課件
- 南京航空航天大學(xué)《電視節(jié)目攝像與編輯實(shí)踐》2022-2023學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》2021-2022學(xué)年期末試卷
- 電機(jī)集團(tuán)鋼結(jié)構(gòu)廠房三期施工組織設(shè)計(jì)
- 法律為我們護(hù)航說課稿
- 2023年國(guó)債資金管理辦法
- 傳染病首診醫(yī)生負(fù)責(zé)制度傳染病首診負(fù)責(zé)制
- 兒科住院超過30天持續(xù)改進(jìn)PDCA案例
- 現(xiàn)澆鋼筋混凝土水池施工方法
- 胸腰椎壓縮骨折中醫(yī)治療難點(diǎn)及解決思路和措施
- 氣管切開術(shù)及環(huán)甲膜穿刺術(shù)演示文稿
- 中華詩(shī)詞學(xué)會(huì)會(huì)員登記表上網(wǎng)
- 煙葉分級(jí)知識(shí)考試題庫(kù)(含答案)
- 中建三局施工現(xiàn)場(chǎng)安全防護(hù)標(biāo)準(zhǔn)化圖冊(cè)
- 變應(yīng)性支氣管肺曲霉病ABPA中國(guó)專家共識(shí)
- 結(jié)節(jié)病課件完整版
評(píng)論
0/150
提交評(píng)論