欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入理解 android telephony 系列初识telephony

程序员文章站 2022-03-03 21:49:01
模板名称细说模板名称细说桥梁模式定义UML模型场景场景一场景二代码代码一代码二基于UML的代码桥梁模式应用和注意事项细说模板名称提示:博主:章飞 _906285288的博客博客地址:http://blog.csdn.net/qq_29924041细说桥梁模式定义UML模型场景场景一场景二代码代码一代码二基于UML的代码桥梁模式应用和注意事项欢迎继续访问,......

深入理解 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

总结如下

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

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


3. Android Telephony 细分框架

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

深入理解 android telephony 系列初识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 的代码细分

模块 代码地址 作用
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能力肯定不仅仅局限于这两个能力

深入理解 android telephony 系列初识telephony
总结

  • 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模块中,有大量的优秀的设计模式和分层设计思想在里面。事件通知等等,都是值得我们去总结和学习的



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

本文地址:https://blog.csdn.net/qq_29924041/article/details/88076646