Android Phone Flow
来源:互联网 发布:软件开发自学网 编辑:程序博客网 时间:2024/06/01 10:17
1 QCOM 实现的 android 架构图
Android 架构图
拨打电话主要涉及以下代码:
1.PHONE:packages/apps/Phone
- 这个模块主要负责界面的显示,可根据协议或运营商需求定制各种内容。
- 主要要是对事件或消息的封装和提供给上层 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 层传递
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)
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_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_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 来电并接听流程
3.4.2 来电挂掉电话流程
- Android Phone Flow
- Android Phone
- Android sensor flow
- Android Factory Reset flow
- Android Factory Reset flow
- Android Factory Reset flow
- android start up flow
- Android Make flow
- Android Factory Reset flow
- Android MO SMS flow
- Android booting flow introduction
- Android下Cover Flow(1)
- Android OpenGL Gallery Cover Flow
- Android Screen on/off flow
- Android bindService (7.1) sequence flow
- Android CSD信息传递flow
- flow
- flow
- 谈谈DPI与像素的关系
- java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive
- jquery一款多种颜色的单选某元素的控件
- 各种智力面试题目汇总
- Debug调试运行正常,但在Release模式下退出程序时报错
- Android Phone Flow
- 开启电子研发的旅程
- 编译安卓上的开源浏览器内核Chromium(ChromeView)源码步骤
- jquery一款鼠标移上显示大图的控件
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志
- How to Partition a Non-partitioned Table [ID 1070693.6]
- C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
- 基于jQuery图像缩放工具插件Zoomer
- Silverlight官方文档