【深入理解 android telephony 系列第一集 初识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 框架

   首先来张框架图
android Telephony架构图

总结如下

  • 整个telephony模块是跨越了AP到BP的,即ril是跟模组进行相互通信
  • Android的Telephony采用了分层的架构设计,即应用层,应用框架层以及系统运行库
  • Android的三层主要为Telephony应用,Telephony框架以及RIL(Radio Interface Layer)即无线通信接口层

整个telephony的设计是一个很标准的android的分层架构,其结构是非常清晰的,但是其业务上是极其复杂和繁琐的


3. Android Telephony 细分框架

   此架构图主要是对整个Telephony中的模块,业务,交互等等进行细化拆分的

android Telephony 接口细化拆分
针对以上架构的总结

  1. 应用层中主要包括了电话Dialer应用,Messaging应用,当然还包括了针对Car的CarDialer类应用
  2. 应用层主要通过aidl的接口跟Telecom进行交互,Telecom是一个跟应用层直接进行交互的运行在系统进程中的服务
  3. Telecom服务再通过aidl接口跟TeleService服务进行交互,TelecomService也就是所谓的phone进程,其实负责加载RIL的java层客户端的,会去load在opt/telephony下的RIL.java,初始化在java层的Phone相关的信息
  4. RILJ即RIL的java层代码,通过hidl接口,即hal层,然后与RILC进行通信,也就将java层的业务转移到了C层去实现,即原理就是通过java的hwbinder客户端与一个C/C++的hwbinder服务端进行通信
  5. RILC在去与模组进行通信
  6. 根据这样一层一层的调用,就将应用层的指令逐步的下发到了模组,然后模组通过回调,将模组的信息再一步一步的回调上来。中间跨越了数个层级

4. Android Telephony 的代码细分

模块代码地址作用
Dialerpackages/apps/Dialer手机设备的拨号应用
Messagingpackages/apps/Messaging手持设备的短彩信应用
CarDialerApppackages/apps/Car/Dialer车载设备的拨号应用
CarMessengerApppackages/apps/Car/Messenger车载设备的短彩信应用
Telecommpackages/services/Telecomm电话的第一层服务,跟UI层直接交互的
TeleServicepackages/services/Telephony电话的第二层服务,跟底层hal层直接交互的,并且跟Telecomm进行交互的
telephony-commonframeworks/opt/telephony/telephony主要是phone模块,hal层对应的java层客户端的代码,这个模块的代码就是跟hal下面的C/C++服务进行通信的
Telecom_Framewrokframeworks/base/telecomm这块的代码就是android提供的phone的一些sdk的代码
Telephony_Framewrokframeworks/base/telephony这块的代码就是android提供的phone的一些sdk的代码
CallLogBackuppackages/providers/CallLogProvider主要是电话记录,电话日志等的provider
ContactsProviderpackages/providers/ContactsProvider主要是联系人对应的provider
TelephonyProviderpackages/providers/TelephonyProvider短/彩信相关的provider
RILhardware/ril主要是phone的C/C++服务层,跟模组交互的

总结:
    以上所列举的相关模块都是跟phone进程有强烈耦合关系的,模块,针对本系列文章主要也就是针对以上模块的代码进行分析,深入理解。
    可以看出来,整个phone模块下的相关子模块是何其的庞大,当然中间还有一些模块被省略了,如settings下的phone的设置等等功能,telecom命令的解析等等,都没有在其中涉及到


5.关于Android Telephony 所具有的能力

phone模块的基础能力就是通话,短信能力,当然phone能力肯定不仅仅局限于这两个能力

Phone的能力
总结

  • Sim卡的服务的能力是phone的基础能力,如多卡多待,切换sim卡,飞行模式等等
  • Call通话能力,毋庸置疑,包含了来电,去电,紧急电话,会议电话模式以及volte网络视频通话等等
  • DataCall也是基础能力,如上网功能,网络切换从4G切到3G等等
  • SMS/MMS的功能,短信功能现在用的也没那么多了,都是收一些垃圾短信,验证码等等,还有彩信能力,最近这几年,感觉这玩意要淘汰掉了一样。彩信收发是要用到网络的。

结合以上的一些能力,在整体的模块中按照业务逻辑整理串联下来

6.关键模块的编译命令

模块代码地址编译命令
Dialerpackages/apps/Dialermake Dialer
Messagingpackages/apps/Messagingmake messaging
CarDialerApppackages/apps/Car/Dialermake CarDialerAppc
CarMessengerApppackages/apps/Car/Messengermake CarMessengerApp
Telecommpackages/services/Telecommmake Telecom
TeleServicepackages/services/Telephonymake TeleService
telephony-commonframeworks/opt/telephony/telephonymake telephony-common
Telecom_Framewrokframeworks/base/telecommmake framework
Telephony_Framewrokframeworks/base/telephonymake framework
CallLogBackuppackages/providers/CallLogProvidermake CallLogBackup
ContactsProviderpackages/providers/ContactsProvidermake ContactsProvider
TelephonyProviderpackages/providers/TelephonyProvidermake TelephonyProvider
RILhardware/rilmake 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 logcatgrep -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模块中,有大量的优秀的设计模式和分层设计思想在里面。事件通知等等,都是值得我们去总结和学习的



本人也是在边学习边总结的过程,写的不好的地方,不喜勿喷,有错误的地方欢迎斧正。
欢迎继续访问,我的博客
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值