Android Phone Flow

来源:互联网 发布:软件开发自学网 编辑:程序博客网 时间:2024/06/01 10:17

1 QCOM 实现的 android 架构图

Android 架构图


拨打电话主要涉及以下代码:

1.PHONE:packages/apps/Phone

  • 这个模块主要负责界面的显示,可根据协议或运营商需求定制各种内容。
2.FRAMEWORK:frameworks/base/telephony/java/com/android/internal/telephony
  • 主要要是对事件或消息的封装和提供给上层 app 手机的状态的接口。以 socket 的方式与下层通讯。

3.rild.so:hardware/ril/rild

  • 传递上下层消息

4.ril.so: hardware/ril/libril

  • 对消息进行针对性的封装,并向下分发或向上传递。

5.qcril.so:vendor/qcom/proprietary/qcril/qcril_fusion

  • 维护电话的状态,
  • 对下层消息根据协议进行封装,比如对电话挂机的返回类型进行归类。
  • 对上层消息进行逻辑处理,比如检查消息或命令的完整性,检查是否支持该命令。

6.cm.so:amss/AMSS/products/76XX/services/cm

  • 对命令更细化处理,并发给 modem,接收 modem 消息,并上报。


2 拨号流程

2.1 拨号 RIL 层以上命令流程

Java层拨号流程



    根 据 网 络 类 型 , 可 以 把 电 话 分 为 两 种 类 型 : GSM 和 CDMA , 由PhoneFactory.getPhoneType(networkMode)来决定什么类型的 PHONE,上图是 GSM 网络,CDMA 网络会相应地调用 CDMAPhone,CdmaCallTracker。RIL.java 维护着两个线程用于收发消息:RILSender,RILReceiver。

2.2 拨号 RIL 层传递

request事件

2.3 拨号 QCRIL 层传递

  •     qcril 层维护了两个列表:reqlist,calllist。reqlist 是上层 event 请求,以便 event complete 后,回调。Calllist 维护通话的个数。对于 getCurrentCall 请求,查询 calllist 就可以得到。
  • 在 ril.cpp 最后会调用 s_callbacks.onRequest , 这 样 就 映 射 到 QCRIL 的onRequest()
  •  qcril.c 声明了各个 event 的映射关系表:qcril_event_table,所有的 event 被分成不同的类型,每种类型又分成类型(RIL_REQUESTS )和 commond callback / event 。
  •  RIL_REQUESTS 是上层的请求(UI-->RILD-->RIL-->QCRIL-->AMSS)。
  • callback 是下层的命令回调或主动上报事件(AMSS-->QCRIL)。
  • 主动上报的事件一般在该文件下会有相应处理函数,然后通过qcril_send_unsol_response()直接调用对应的 OnUnsolicitedResponse()。

                             Event group:

                             SIM (MMGSDI)

                             SIM (GSTK)
                             SMS
                             DATA
                             PBM
                             CM - Phone Services
                             CM - Serving System Management
                             CM - Call Services
                             CM - In Band Services
                             CM - Supplemental Services
                             CM - Stats Services
  • onRequest() 调用 qcril_hash_table_lookup()查找相应的处理函数。拨打电话的 event 为 QCRIL_EVT_CM_CALL_ORIG
  • cm.h声明各种常量,类型
                           enum cm_client_status_e ---------定义客户端状态
                           enum cm_client_event_reg_e -----定义客户端事件类型
                           enum cm_call_event_e ------------call 事件
                           enum cm_call_cmd_e -------------call 命令
                           enum cm_ph_event_e -------------Phone 事件
                           enum cm_ph_cmd_err_e ----------Phone 命令

  • cmclient.c 保存客户端列表,根据 event 通知客户端
                          cm_client_ss_event_ntfy()
                          cm_client_inband_event_ntfy()
                          cm_client_sms_event_ntfy()
                          cm_client_pd_event_ntfy()
                          cmclient_list_ph_event_ntfy()
                          cmclient_list_call_event_ntfy()
                          cmclient_call_info_list_ntfy()

2.4 拨号 AMSS 消息传递



QCRIL 与 AMSS 的调用是通过 RPC 方式。

  • cmdiag_orig_req() --处理 qcril 的拨号请求,做初步处理,判断号码是否有效
  • cm_mm_call_cmd_orig_exten2() --初始化一条拨号命令,并把命令发送到消息 队 列 。 在 生 成 命 令 之 前 会 先 调 用 cmcall.cm_call_id_allocate ( ) 生 成callid。callid 会转回 QCRIL,用作判断是否添加一个新通话。
  • cm_task() --a looper,处理各种信号和输入。
  • cm_client_cmd_handle()— 根 据 命 令 的 类 型 分 发 到 对 应 的 函 数 处 理 。
  • call,sms,phone 等都在这里分发。
  • cmcall_orig_start()—调用 cmph_call_start() 通知上层,开始拨号,并启动
  • phone 的 Incallscreen。这里调用 cmcall_event()回调,在 QCRIL 层会根据
  • modemid 和 callid 来添加一路电话到 calllist。
  • cmxcall_send_orig()--Send an origination command to MC.
  • mc_cmd() -- add the command to the mc command queue
  • 拨号命令最后由 mc_process_cmd()执行。

3 来电流程

3.1 AMSS 层来电消息流程

  • 首先,底层 modem 收到来电消息,接着调用 mccccim_incoming_call()向上传递。
  • cm_mc_rpt()—此函数会把消息添加到 cmtask 的消息队列。
  • cmxcall_mc_rpt_proc()—这里将细分消息类型,分发到对应的函数处理。

消息:
     CM_SIGNAL_F
     --- Analog incoming cal
     CM_INCOMING_CALL_F --- CDMA Incoming call
     CM_STOP_ALERT_F
     --- Incoming call end due to alert stop
     CM_INTERCEPT_F
     --- Origination end due to intercept
     CM_CALL_RELEASE_F --- Call end due to release from base station
     CM_CALL_FADE_F
     --- Call end due to a fade
     CM_CALL_ORIG_FAIL_F --- Origination Failed
     ......

  • 消息会如上图所示向上传递

3.2 QCRIL 层来电消息传递


  • qcril_cm.c 接收从 AMSS 传回的消息,直接添加到 qcril_event 的 event 队列。
  • qcril_dispatch_event() – 此方法根据命令类型调用 qcril_hash_table_lookup()查找相应方法,这里的命令类型为 QCRIL_EVT_CM_CALL_INCOM
  • qcril_cm_callsvc_event_incom() – 此函数会先调用 qcril_cm_clist_new() 添加一路 call 到 calllist ,然后调用 qcril_cm_send_unsol_call_state_changed() 往上传递消息。
  • 最后通过调用 qcril_send_unsol_response()向 ril 层传递。

3.3 来电 QCRIL 层传递


3.4 来电 RIL 层以上消息流程

3.4.1 来电并接听流程

   

     ril.java 中的 RILReceiver 会一直监听底层 socket。 EVENT_CALL_STATE_CHANGE是 一 个 主 动 上 报 的 消 息 , 说 明 call state 改 变 , 有 来 电 或 拨 号 成 功 。calltracker 调用 getCurrentCall()获取当前激活的 call。然后响铃并显示 UI。

3.4.2 来电挂掉电话流程



原创粉丝点击