深入理解 android telephony
深入理解 android telephony 系列第一集 初识telephony
提示:
博主:_ 小小码nong
博客地址:http://blog.csdn.net/qq_29924041
1. 概述
回看上篇文章,已经是long long ago以前了,好久都没有针对性的总结一些东西,刚好今年做了一些关于phone相关的东西,抽点时间整理下,总结下。不对,不喜欢的地方,不喜勿喷。所谓的成长就是慢慢的积累和总结。
手机的基础属性,或者叫基础功能是什么,毫无疑问,通话,上网,短信,离开了这三个基础属性,那就不叫手机了。而Phone模块,在整个android源码中所占的地位也是毫无疑问的。是一个比较庞大的一系列模块。
从针对手机的Dialer应用,Messaging应用,针对车载设备的CarDialer,Messager,到Phone 的服务层Telecom,TeleService服务,然后再到RILJ,乃至最终的RILC,再到电话的日志记录CallLogBackup,ContactsProvider等等,无一不是属于Phone的范畴,再到通信模组,当然模组知识是另外一个知识领域,不在此系列文章中赘述。
本系列文章主要是以android 9.0的代码为基础,进行解读和调试的。参考的也是genymotion下的android 9.0的模拟器设备。
2. Android Telephony 框架
首先来张框架图
总结如下
- 整个telephony模块是跨越了AP到BP的,即ril是跟模组进行相互通信
- Android的Telephony采用了分层的架构设计,即应用层,应用框架层以及系统运行库
- Android的三层主要为Telephony应用,Telephony框架以及RIL(Radio Interface Layer)即无线通信接口层
整个telephony的设计是一个很标准的android的分层架构,其结构是非常清晰的,但是其业务上是极其复杂和繁琐的
3. Android Telephony 细分框架
此架构图主要是对整个Telephony中的模块,业务,交互等等进行细化拆分的
针对以上架构的总结
- 应用层中主要包括了电话Dialer应用,Messaging应用,当然还包括了针对Car的CarDialer类应用
- 应用层主要通过aidl的接口跟Telecom进行交互,Telecom是一个跟应用层直接进行交互的运行在系统进程中的服务
- Telecom服务再通过aidl接口跟TeleService服务进行交互,TelecomService也就是所谓的phone进程,其实负责加载RIL的java层客户端的,会去load在opt/telephony下的RIL.java,初始化在java层的Phone相关的信息
- RILJ即RIL的java层代码,通过hidl接口,即hal层,然后与RILC进行通信,也就将java层的业务转移到了C层去实现,即原理就是通过java的hwbinder客户端与一个C/C++的hwbinder服务端进行通信
- RILC在去与模组进行通信
- 根据这样一层一层的调用,就将应用层的指令逐步的下发到了模组,然后模组通过回调,将模组的信息再一步一步的回调上来。中间跨越了数个层级
4. Android Telephony 的代码细分
模块 | 代码地址 | 作用 |
---|---|---|
Dialer | packages/apps/Dialer | 手机设备的拨号应用 |
Messaging | packages/apps/Messaging | 手持设备的短彩信应用 |
CarDialerApp | packages/apps/Car/Dialer | 车载设备的拨号应用 |
CarMessengerApp | packages/apps/Car/Messenger | 车载设备的短彩信应用 |
Telecomm | packages/services/Telecomm | 电话的第一层服务,跟UI层直接交互的 |
TeleService | packages/services/Telephony | 电话的第二层服务,跟底层hal层直接交互的,并且跟Telecomm进行交互的 |
telephony-common | frameworks/opt/telephony/telephony | 主要是phone模块,hal层对应的java层客户端的代码,这个模块的代码就是跟hal下面的C/C++服务进行通信的 |
Telecom_Framewrok | frameworks/base/telecomm | 这块的代码就是android提供的phone的一些sdk的代码 |
Telephony_Framewrok | frameworks/base/telephony | 这块的代码就是android提供的phone的一些sdk的代码 |
CallLogBackup | packages/providers/CallLogProvider | 主要是电话记录,电话日志等的provider |
ContactsProvider | packages/providers/ContactsProvider | 主要是联系人对应的provider |
TelephonyProvider | packages/providers/TelephonyProvider | 短/彩信相关的provider |
RIL | hardware/ril | 主要是phone的C/C++服务层,跟模组交互的 |
总结:
以上所列举的相关模块都是跟phone进程有强烈耦合关系的,模块,针对本系列文章主要也就是针对以上模块的代码进行分析,深入理解。
可以看出来,整个phone模块下的相关子模块是何其的庞大,当然中间还有一些模块被省略了,如settings下的phone的设置等等功能,telecom命令的解析等等,都没有在其中涉及到
5.关于Android Telephony 所具有的能力
phone模块的基础能力就是通话,短信能力,当然phone能力肯定不仅仅局限于这两个能力
总结
- Sim卡的服务的能力是phone的基础能力,如多卡多待,切换sim卡,飞行模式等等
- Call通话能力,毋庸置疑,包含了来电,去电,紧急电话,会议电话模式以及volte网络视频通话等等
- DataCall也是基础能力,如上网功能,网络切换从4G切到3G等等
- SMS/MMS的功能,短信功能现在用的也没那么多了,都是收一些垃圾短信,验证码等等,还有彩信能力,最近这几年,感觉这玩意要淘汰掉了一样。彩信收发是要用到网络的。
结合以上的一些能力,在整体的模块中按照业务逻辑整理串联下来
6.关键模块的编译命令
模块 | 代码地址 | 编译命令 |
---|---|---|
Dialer | packages/apps/Dialer | make Dialer |
Messaging | packages/apps/Messaging | make messaging |
CarDialerApp | packages/apps/Car/Dialer | make CarDialerAppc |
CarMessengerApp | packages/apps/Car/Messenger | make CarMessengerApp |
Telecomm | packages/services/Telecomm | make Telecom |
TeleService | packages/services/Telephony | make TeleService |
telephony-common | frameworks/opt/telephony/telephony | make telephony-common |
Telecom_Framewrok | frameworks/base/telecomm | make framework |
Telephony_Framewrok | frameworks/base/telephony | make framework |
CallLogBackup | packages/providers/CallLogProvider | make CallLogBackup |
ContactsProvider | packages/providers/ContactsProvider | make ContactsProvider |
TelephonyProvider | packages/providers/TelephonyProvider | make TelephonyProvider |
RIL | hardware/ril | make rild |
以上是这些模块的相关编译命令,当然你也可以使用mm, mma等等编译
以上都是一些简单的编译模块的命令,更具体的其他的一些命令,可以参考博主的另一篇博客
Android源码编译命令汇总
注意:
1:关于源码的现在在这里不赘述,有兴趣的可以去清华源上下载源码并且编译,同时这块的博客讲解也是非常多的,如何使用repo,如何切换分支,如果有不知道的可以联系博主
2:还有要注意的是,如果修改了framework的接口,最好先make update-api一下,然后使用make -j4进行全编
3:博主在公司有板子可以刷,一般修改自己的framework代码的时候都是使用fastboot整体刷机,当然在这里是以aosp的源码为基础,所以没有必要
7.关于Android在调试的时候的一些常用命令,以及Phone进程的调试命令
命令 | 解释 |
---|---|
adb logcat -b events | 主要是查看当前am下activity的 |
adb logcat -b radio | 打印的是ril的日志 |
adb logcat -b all | 将系统的logcat下的所有日志全部输出出来,包括ril的日志 |
adb logcat -c -b all | 清理日志的缓存 |
adb logcat -s xxx | 按照xxx的tag打印日志 |
adb logcat | grep -nre xxx -e xxx |
以上的一些命令都是简单的调试指令,更具体的一些调试命令,可以参考博主的另一篇博客
8. 关于Genymotion的下载安装
8.1 下载和安装
关于genymotion的下载和安装可以参考以下这篇博客,写的是非常的详细,在这里我就不去赘述
https://blog.csdn.net/yht2004123/article/details/80146989
安装好genymotion后,我们安装对应的android9.0对应的虚拟机,然后就可以愉快的跟着android系统一起看看phone是怎么玩的啦
9. 总结
开篇主要讲的是对于phone模块的认识,phone模块的功能划分,模块划分,以及代码划分,后面会再genymotion基础上,跟着代码的逻辑一步一步的分析,电话流程是如何从ui层流向hal层,又是怎么从hal层一步一步回调通知上来,以及总结phone模块中优秀的代码逻辑设计
在phone模块中,有大量的优秀的设计模式和分层设计思想在里面。事件通知等等,都是值得我们去总结和学习的
本人也是在边学习边总结的过程,写的不好的地方,不喜勿喷,有错误的地方欢迎斧正。
欢迎继续访问,我的博客