1. 安卓Telephony子系统是一个给手机提供电话通讯功能,例如语音通话,视频通话,短彩信,数据流量,网络管理等功能的软件框架。分析其架构和实现,有助于在开发鸿蒙Telephony子系统提供借鉴和帮助。

架构

  1. Android Telephony框架可以分为四层架构,从上到下依次:
  1. 系统通讯应用(Applications)
  2. 通讯服务框架层(Framework)
  3. 无线接口层(Radio Interface Layer RIL)
  4. 无线模块驱动程序集(在Linux内核中)

如下图所示:
Android_Telephony_Layers.png

电话通讯应用

  1. Android系统中,有些使用Telephony Framework构建的应用,例如 拨号盘APP、短(彩)信APP、浏览器、系统设置APP(网络设置,APN设置,通话设置,运营商设置等)、SIM卡应用工具集(SAT等都或多或少调用到了Telephony 框架的API,在安卓系统源码中,这些应用源码位于:/packages/apps/...。其中具有代表性的应用是拨号盘APP,其在Android11中的源码路径为:/packages/apps/Dialer。典型的应用场景是在拨号盘界面,用户输入手机号拨打电话,故建议从/packages/apps/Dialer/Java/com/android/dialer/app/DialtactsActivity.java文件开始分析入手。该Activity对应于拨号盘应用的首界面。

Telephony 框架层

  1. Telephony框架是由 一个个组件组成的,像 Service State Tracker(SST),SIM IO 子系统,GsmCdmaCalltracker<br />,Data Connection Tracker(DCT),SIM toolkit,MMI编码集,通话服务,短彩信服务,语音邮件,网络连接服务,通讯录管理(PhoneBookManager),从Android10开始,加入了IMS。安卓根据是否对外提供调用分为了两大块:
  • 内部telephony包:/frameworks/base/telephony/java/com/android/internal/telephony
  • 对应用开发者开放的:/frameworks/base/telephony/java/android/telephony/,还有用于第三方自定义开发通话管理应用的/frameworks/base/telecomm/java/android/telecom,
  • 常驻的telephony服务源码路径:/packages/services/telephony;/packages/services/Telecomm

    无线接口层

    Android的RIL层主要分成两个部分:RIL Daemon和Vendor RIL。
    RIL Daemon由C/C++写成,负责透过socket承接来自于电话框架(Telephony frameworks)的请求,并且将请求找到对应的函数后转往Vendor RIL。另外也负责将来自Vendor RIL的回应回报给电话框架。
    Vendor RIL为各数据芯片的供应商所提供。在RIL Daemon定义了各种不同的函式,而各芯片开发商(如:高通公司)则实做RIL Daemon定义的各种函式,再修改RIL Daemon汇入的函式库以驱动自己的硬件。简单来说,Vendor RIL负责承接来自于RIL Daemon的指令,将之做基本处理后传递给数据芯片做其他的控制。另外,Vendor RIL 也会同步监听调制解调器以获得调制解调器“主动回报”、或“处理完后回报”的指令,并将之做初步解析后经由RIL Daemon回传到电话框架。
    RIL可分成两大指令:之一为RIL传递讯息给数据芯片并接收数据芯片执行完后的结果的指令(Solicited commands),之二为数据芯片主动回报的指令(Unsolicited commands)。