PS:若有同学想二次修改 笔者可提供下述所有原设计材料 邮箱最后见

一. 一次电话行为的产生 都有哪些 ???

首先我们的通信设备与基站是实时的连接

这种场景大概可以理解为

在人多的地方 基站压力大 会表现为 4g上网很慢

坐在高铁上打电话 接入了其他基站 电话会有短暂的卡顿 然后继续通话

等等

这都说明了一次通信行为是由基站有关系

这是一个简单的通话流程 我们把它往业务方向抽象一下

运营商业务系统 你懂的

我们需要了解一下 在手机端 他通信大概有哪些流程

Dialer

packages/apps/Dialer

包含IncallUI 拨号盘等等

Telecomm

packages/services/Telecomm

CallsManager 通话大管家 负责把 Dialer/TeleService进行一次处理 返回给 对应的业务场景

后面才分出来的 作为一个独立的模块单独存在

这是由于在Android Telephony通话模型中它为Dialer和TeleService消息中转站,作为MT与MO消息处理关键入口,承上启下

呈上:相对与Dialer应用而言,发送call状态变化消息给IInCallService服务,并接收Dialer应用发出的call状态控制消息。

启下:相对与TeleService应用而言,Telecom应用继续传递接收到Dialer应用发出的call状态控制消息给IConnectionService服务,并接收TeleService应用发出的Call状态变化传递给Dialer应用。

TeleService

packages/services/TeleService

TeleService -> RIL -> Modem -> 基站

最终将面向业务 转换为 面向协议

监听从RIL上传的协议内容再往上 Telecomm Dialer

数据连接

Framework

// Google定义好接口供运运营商实现

// framework.jar

frameworks/base/telecomm

frameworks/base/telephony

frameworks/opt/telephony

// ims-common.jar

frameworks/opt/net/ims

// ims.apk

// 属于不同平台的实现

vendor/(mtk/qcom)/proprietary/xxx/Ims

RIL

RILJ

java层 为上层提供访问modem的入口和消息接收

RILD

HAL层

RILJ 下发请求 -> RILD 将Request转换为Modem AT 执行发送

Modem上报或者返回消息 -> RILD 处理消息 -> RILJ

无论是 MT 还是 MO 在InCallActivity 拉起之前 都会 进行一次 类似 rtp 的信令交互

因为手机和基站是实时连接 相当于tcp检测线 一直告诉运营商业务系统 我的通信地址是多少 等等

这里由于我对Modem信令交互这块 没有log进行阐述 就用rtp 简单说明一下 即 下述

后续这块可能需要modem的同事帮忙完善一下

A告诉B我支持哪些编解码格式以及地址等等 然后B告诉A我支持哪些编解码格式等等 最后创建 P2P的通信

手机通信也是一样的 所有通信之前 都会有一次 信令交互的过程 具体格式类似下述a=xxx等等

这里的Signal Server Stun Server都在运营商业务系统里面都会有类似的存在

v=0
o=- 3335695257588411957 2 IN IP4 127.0.0.1
s=- t=0 0 a=group:BUNDLE audio video data
a=msid-semantic: WMS
m=audio 9 UDP\/TLS\/RTP\/SAVPF 111 103 9 102 0 8 105 13 110 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:Qlrs
a=ice-pwd:VAAptCTPocMfb4iDyHyUFZff
a=ice-options:trickle renomination
a=fingerprint:sha-256 0B:8A:40:B1:B7:95:64:07:E1:08:4D:29:7F:49:0C:37:4E:38:AE:06:6F:66:D5:DB:7D:60:88:4D:87:2A:7B:8C
a=setup:active
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http:\/\/www.ietf.org\/id\/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus\/48000\/2
a=rtcp-fb:111 transport-cc
a=fmtp:111
minptime=10;
useinbandfec=1
a=rtpmap:103 ISAC\/16000
a=rtpmap:9 G722\/8000
a=rtpmap:102 ILBC\/8000
a=rtpmap:0 PCMU\/8000
a=rtpmap:8 PCMA\/8000
a=rtpmap:105 CN\/16000
a=rtpmap:13 CN\/8000
a=rtpmap:110 telephone-event\/48000
a=rtpmap:113 telephone-event\/16000
a=rtpmap:126 telephone-event\/8000
m=video 9 UDP\/TLS\/RTP\/SAVPF 127 96 97 123 124 107 108
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:Qlrs
a=ice-pwd:VAAptCTPocMfb4iDyHyUFZff
a=ice-options:trickle renomination
a=fingerprint:sha-256 0B:8A:40:B1:B7:95:64:07:E1:08:4D:29:7F:49:0C:37:4E:38:AE:06:6F:66:D5:DB:7D:60:88:4D:87:2A:7B:8C
a=setup:active
a=mid:video
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:13 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:2 http:\/\/www.ietf.org\/id\/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/playout-delay
a=extmap:6 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/video-content-type
a=extmap:7 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/video-timing
a=extmap:8 http:\/\/tools.ietf.org\/html\/draft-ietf-avtext-framemarking-07
a=extmap:9 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/color-space
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:127 H264\/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127
profile-level-id=42e01f
a=rtpmap:96 VP8\/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx\/90000
a=fmtp:97
apt=96
a=rtpmap:123 rtx\/90000
a=fmtp:123
apt=127
a=rtpmap:124 red\/90000
a=rtpmap:107 rtx\/90000
a=fmtp:107
apt=124
a=rtpmap:108 ulpfec\/90000
m=application 9 DTLS\/SCTP 5000
c=IN IP4 0.0.0.0
b=AS:30
a=ice-ufrag:Qlrs
a=ice-pwd:VAAptCTPocMfb4iDyHyUFZff
a=ice-options:trickle renomination
a=fingerprint:sha-256 0B:8A:40:B1:B7:95:64:07:E1:08:4D:29:7F:49:0C:37:4E:38:AE:06:6F:66:D5:DB:7D:60:88:4D:87:2A:7B:8C
a=setup:active a=mid:data a=sctpmap:5000 webrtc-datachannel 1024

二. MT&MO call 分析

MO -- Dialer

7. 10-29 18:09:07.406 22754 22754 I Dialer  : DialUtils.startActivityWithErrorToast - videoState: 0private static TelecomManager getTelecomManager(Context context) {return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);}

 MO -- Telecomm

frameworks/base/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
packages/services/Tellecomm/src/com/android/server/telecom/TelecomServiceImp.java/*** Interface used to interact with Telecom. Mostly this is used by TelephonyManager for passing* commands that were previously handled by ITelephony.* {@hide}*/
interface ITelecomService {.../*** @see TelecomServiceImpl#placeCall*/void placeCall(in Uri handle, in Bundle extras, String callingPackage, String callingFeatureId);...1.10-29 18:09:09.524 18428 18566 I Telecom : : isSelfManaged = false, hasCallAppOp = true, hasCallPermission = true: TSI.pC@BcE
5.10-29 18:09:09.530 18428 18566 I Telecom : UserCallIntentProcessor: sendIntentToDestination: send intent to Telecom directly.: TSI.pC@BcE
8.10-29 18:09:09.530 18428 18566 I Telecom : CallIntentProcessor: onReceive - isUnknownCall: false: TSI.pC@BcE
17.10-29 18:09:09.761 18428 18428 I Telecom : NewOutgoingCallIntentBroadcaster: Placing call immediately instead of waiting for OutgoingCallBroadcastReceiver: NOCBIR.oR@BcQ
19.10-29 18:09:09.761 18428 18428 I Telecom : CallsManager: Creating a new outgoing call with handle: tel:15656098064: NOCBIR.oR@BcQ
// 此处是递归 可能会打印多次
22.10-29 18:09:09.776 18428 18428 V Telecom : CreateConnectionProcessor: attemptNextPhoneAccount: NOCBIR.oR@BcQ
23.10-29 18:09:09.784 18428 19455 D Telecom : : perform create connection: NOCBIR.oR->CSFM.rF@BcQ_1
24.10-29 18:09:09.778 18428 19455 I Telecom : ConnectionServiceWrapper: bind(), mServiceConnection is null: NOCBIR.oR->CSFM.rF@BcQ_1
// 已经连接上
27.10-29 18:09:09.927 18428 18428 I Telecom : ServiceBinderConnection: Service bound ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}: SBC.oSC(cap)@Bcs

Telecom -- TeleService 向RIL发送拨号请求 

1.10-29 18:09:09.784 18428 19455 I Telecom : ConnectionServiceWrapper: createConnection([Call id=a13900f872c8f9c2, state=CONNECTING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[], prop=[]]) via ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}.: NOCBIR.oR->CSFM.rF@BcQ_1// 这里也是 从dialer 一直下来 到 teleservice 通信行为的一种抽象 很容易理解
frameworks/base/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
...
/*** Internal remote interface for connection services.* @see android.telecom.ConnectionService*/
oneway interface IConnectionService {void abort(String callId, in Session.Info sessionInfo);void answer(String callId, in Session.Info sessionInfo);
...
Log.i(this, "Attempting to bind to InCall %s, with %s", mInCallServiceInfo, intent);mIsConnected = true;mInCallServiceInfo.setBindingStartTime(mClockProxy.elapsedRealtime());if (!mContext.bindServiceAsUser(intent, mServiceConnection,Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE |Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS |Context.BIND_ABOVE_CLIENT,UserHandle.CURRENT)) {Log.w(this, "Failed to connect.");mIsConnected = false;}
...3.10-29 18:09:09.927 18428 18428 I Telecom : ServiceBinderConnection: Service bound ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}: SBC.oSC(cap)@Bcs6.10-29 18:09:09.928 18428 18428 I Telecom : : callId = a13900f872c8f9c2_1: SBC.oSC(cap)@Bcs7.10-29 18:09:09.944 19257 19257 D TelecomFramework: TelephonyConnectionService: createConnection, callManagerAccount: ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, callId: a13900f872c8f9c2_1, request: ConnectionRequest tel:15656098064  touchPoint=Point(365, 2138), org.codeaurora.extra.CALL_DOMAIN=0, EmergencyRescuePerssion=false, android.telecom.extra.START_CALL_WITH_VIDEO_STATE=0, android.telecom.extra.CALL_CREATED_TIME_MILLIS=25993083, android.telecom.extra.CALL_TELECOM_ROUTING_START_TIME_MILLIS=25995331, com.android.dialer.callintent.CALL_SPECIFIC_APP_DATA=[B@e7c00d1, ] isAdhocConf: N, isIncoming: false, isUnknown: false, isLegacyHandover: false, isHandover: false: (SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR(cap/cast)@E-Bcs_0_0_08.10-29 18:09:09.944 19257 19257 I Telephony: onCreateOutgoingConnection, request: ConnectionRequest tel:15656098064 Bundle[touchPoint=Point(365, 2138), org.codeaurora.extra.CALL_DOMAIN=0, EmergencyRescuePerssion=false, android.telecom.extra.START_CALL_WITH_VIDEO_STATE=0, android.telecom.extra.CALL_CREATED_TIME_MILLIS=25993083,android.telecom.extra.CALL_TELECOM_ROUTING_START_TIME_MILLIS=25995331, com.android.dialer.callintent.CALL_SPECIFIC_APP_DATA=[B@e7c00d1, ] isAdhocConf: N// if debug turn on
10.10-29 18:09:10.015 19257 19257 D GsmCdmaPhone: [0] useImsForCall=true, isEmergency=false, useImsForEmergency=false, useImsForUt=true, isUt=false, isSuppServiceCode=false, isPotentialUssdCode=false, isWpsCall=false, allowWpsOverIms=true, imsPhone=Handler (com.android.internal.telephony.imsphone.ImsPhone) {b95b28f}, imsPhone.isVolteEnabled()=true, imsPhone.isVowifiEnabled()=false, imsPhone.isVideoEnabled()=true, imsPhone.getServiceState().getState()=0, forceEccToIms=false
10.10-29 18:09:10.040 19257 19257 D GsmCdmaPhone: [0] Trying IMS PS call// to 图片美观 此处省略 imscall 调用
13.10-29 18:09:10.066 19257 19257 D ImsManager [0]: makeCall :: profile={ serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 }// 此时 进入到第四个进程 ims.apk 由运营商实现
15.10-29 18:09:10.077 19146 30534 V QImsService: ImsCallSessionImpl : MultiIdentity Line info in Dial Request :: {MultiIdentity Line Info : msisdn =  , line type = 1 , line status = 0}
16.10-29 18:09:10.078 19146 30534 I QImsService: ImsSenderRxr : Dial Request - address= 15656098064clirMode= 0 callDetails=  0 3 callSubState 0 videoPauseState2 mediaId-1 Rtt mode 0 Local Ability  Peer Ability  Cause code 0 sipAlternateUri null, {MultiIdentity Line Info : msisdn =  , line type = 1 , line status = 0} isEncrypted= false redialInfo RedialInfo: retryCallFailCause = 0 retryCallFailRadioTech = 0[SUB0]// 补充
10-29 18:09:10.080 19146 30534 I QImsService: ImsSenderRxr : [0036]> DIAL [SUB0]
10-29 18:09:10.093 19257 19358 D ImsPhoneCallTracker: [0] processCallStateChange state=DIALING cause=0 ignoreState=true此时 mo请求 已经向bsp/kernel发送 等待 运营商返回

Telecom -- Dialer 启动 InCallUI

基于上一部分流程 先拉起InCallUI onBind#InCallPresenter.getInstance().maybeStartRevealAnimation(intent)2.10-29 18:09:09.665 18428 18428 I Telecom : CallsManager: startInCallUI phoneId: 0 ,airplane: 0 ,isInCallMMICode: false: TSI.pC->CM.fOCP->CM.sOCPA->CM.dSMCP->CM.dSPA->CM.pASP@BcE_2_1_0_0_0// 如果已经连接上 则不打印 一般在第一通电话时 有下述log
3.10-29 18:09:09.917 18428 18428 I Telecom : InCallController: onCallAdded: [Call id=a13900f872c8f9c2, state=CONNECTING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[], prop=[]]; not bound or connected.6.10-29 18:09:09.920 18428 18428 I Telecom : EmergencyInCallServiceConnection: Attempting to bind to InCall [ComponentInfo{com.google.dialer/com.android.incallui.InCallServiceImpl} supportsExternal? true supportsSelfMg?false], with Intent { act=android.telecom.InCallService cmp=com.google.dialer/com.android.incallui.InCallServiceImpl (has extras) }// 已经连接上 dialer 一端
12.10-29 18:09:09.978 18428 18428 I Telecom : InCallController: onConnected to ComponentInfo{com.google.dialer/com.android.incallui.InCallServiceImpl}: ICSBC.oSC(cod)@BdI// 在dialer实现 public class InCallServiceImpl extends InCallService
frameworks/base/telecomm/java/com/android/internal/telecom/IInCallService.aidl
// 在telecomm实现 class InCallAdapter extends IInCallAdapter.Stub
frameworks/base/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
...
/*** Internal remote callback interface for in-call services.** @see android.telecom.InCallAdapter** {@hide}*/
oneway interface IInCallAdapter {void answerCall(String callId, int videoState);void deflectCall(String callId, in Uri address);void rejectCall(String callId, boolean rejectWithMessage, String textMessage);void rejectCallWithReason(String callId, int rejectReason);void transferCall(String callId, in Uri targetNumber, boolean isConfirmationRequired);void consultativeTransfer(String callId, String otherCallId);
......
/*** Internal remote interface for in-call services.** @see android.telecom.InCallService** {@hide}*/
oneway interface IInCallService {void setInCallAdapter(in IInCallAdapter inCallAdapter);void addCall(in ParcelableCall call);void updateCall(in ParcelableCall call);void setPostDial(String callId, String remaining);void setPostDialWait(String callId, String remaining);void onCallAudioStateChanged(in CallAudioState callAudioState);void bringToForeground(boolean showDialpad);
...10.10-29 18:09:09.974 22754 22754 I Dialer  : InCallServiceImpl - onBind

接 Telecom -- TeleService 向RIL发送拨号请求 部分

Telecom -- Dialer 在CONNECTING -> DIALING updateCall行为分析

1.10-29 18:09:10.404 19257 19257 D TelecomFramework: TelephonyConnectionService: createConnection, calling handleCreateConnectionSuccessful a13900f872c8f9c2_1: (SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR(cap/cast)@E-Bcs_0_0_02.10-29 18:09:10.405 18428 18452 D Telecom : ConnectionServiceWrapper: CS -> TC[cap]: handleCreateConnectionComplete a13900f872c8f9c2_1: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_0
10-29 18:09:10.405 18428 18452 I Telecom : ConnectionServiceWrapper: handleCreateConnectionComplete: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_0
10-29 18:09:10.405 18428 18452 I Telecom : Call: handleCreateConnectionSuccessful ParcelableConnection [act:ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}], state:3, capabilities:[Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], properties:[Properties:], extras:Bundle[mParcelledData.dataSize=196], parent:null, callDirection:-1: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_02.10-29 18:09:10.405 18428 18452 I Telecom : Call: handleCreateConnectionSuccessful ParcelableConnection [act:ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}], state:3, capabilities:[Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], properties:[Properties:], extras:Bundle[mParcelledData.dataSize=196], parent:null, callDirection:-1: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_0
10-29 18:09:10.405 18428 18452 I Telecom : Call: connection.getHandlePresentation() is 1  mHandlePresentation is 1: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_03.10-29 18:09:10.411 18428 18452 V Telecom : CallsManager: onSuccessfulOutgoingCall, [Call id=a13900f872c8f9c2, state=CONNECTING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a], prop=[]]: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_04.10-29 18:09:10.411 18428 18452 I Telecom : CallsManager: setCallState CONNECTING -> DIALING, call: [Call id=a13900f872c8f9c2, state=CONNECTING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a], prop=[]]: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_0// 在InCallService updateCall 之后
7.10-29 18:09:10.412 18428 18452 I Telecom : InCallController: Sending updateCall [Call id=a13900f872c8f9c2, state=DIALING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a], prop=[]]: ((SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-Bcs_0_0_0_0InCallService updateCall 这一步 没有到Dialer进程
在分析代码得出 此时的updateCall 行为只会在Telecomm中消化
我找出这个时间点的log以及代码反复确认 这种场景下 走到updateCall 就结束了
可能是这个状态并不是 bsp/kernel 返回的 所以更新到上层是没有意义的// todo 此流程可以大致了解下 后续遇到会继续完善

 MO Call 收到接听上报流程

上述流程可以认为mo行为已经下发 等待mt那边answer/其他回应

首先先告诉state changed UNSOL_RESPONSE_CALL_STATE_CHANGED
// dial -> answer
10-29 18:09:10.152 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED  [id=1,DIALING,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 3 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 1 rttMode = 0 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability  Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=0, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false] [SUB0]
10-29 18:09:12.164 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED  [id=1,DIALING,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 3 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 1 rttMode = 0 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability  Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=0, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false] [SUB0]
10-29 18:09:12.164 18282 20243 D AudioFlinger: setParameters(): io 0, keyvalue vsid=297816064;call_state=2;call_type=LTE, calling pid 19114 calling uid 100110-29 18:09:12.168 19146 19146 I QImsService: ImsCallSessionImpl : updateImsCallProfile :: VerstatInfo : canMarkUnwantedCall = false , verstatVerificationStatus = 0
10-29 18:09:12.170 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED  [id=1,ALERTING,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 3 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 1 rttMode = 0 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=0, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false] [SUB0]
10-29 18:09:13.445 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RINGBACK_TONE {1}[SUB0]
10-29 18:09:13.453 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED  [id=1,ALERTING,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 3 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 1 rttMode = 0 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=0, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false] [SUB0]
10-29 18:09:13.459 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED  [id=1,ALERTING,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 3 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 1 rttMode = 0 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=0, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false] [SUB0]
10-29 18:09:16.958 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RINGBACK_TONE {0}[SUB0]
10-29 18:09:16.964 18428 18455 D PowerManagerService: acquire PROXIMITY_SCREEN_OFF_WAKE_LOCK from com.google.dialer
10-29 18:09:16.965 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED  [id=1,ACTIVE,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 2 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=3, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false] [SUB0]// radio log
10-29 18:09:16.972 19257 19469 D ImsPhoneConnection: updateMediaCapabilities: newAudioQuality = 3, getAudioQuality() = 3
10-29 18:09:16.976 19257 19469 D ImsPhoneCallTracker: [0] onCallStarted
10-29 18:09:16.977 19257 19469 D ImsPhoneCallTracker: [0] processCallStateChange [ImsCall objId:156448952 onHold:N mute:N mCallProfile:{ serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 } networkType:13 updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:[ImsCallSession objId:206958363 state:ESTABLISHED callId:1] transientSession:null] state=ACTIVE cause=0
10-29 18:09:16.977 19257 19469 D ImsPhoneCallTracker: [0] processCallStateChange state=ACTIVE cause=0 ignoreState=false
10-29 18:09:16.977 19257 19469 D ImsPhoneConnection: updateMediaCapabilities: mIsRttEnabledForCall = false
10-29 18:09:16.977 19257 19469 D ImsPhoneConnection: update localCallProfile={ serviceType=1, callType=3, restrictCause=0, mediaProfile={ audioQuality=19, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=1, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 }
10-29 18:09:16.977 19257 19469 I ImsPhoneConnection: applyLocalCallCapabilities - localProfile = { serviceType=1, callType=3, restrictCause=0, mediaProfile={ audioQuality=19, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=1, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 }
10-29 18:09:16.978 19257 19469 D ImsPhoneConnection: update remoteCallProfile={ serviceType=1, callType=3, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=1, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 }
10-29 18:09:16.978 19257 19469 W ImsPhoneConnection: applyRemoteCallCapabilities - remoteProfile = { serviceType=1, callType=3, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=1, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 }
10-29 18:09:16.978 19257 19469 D ImsPhoneConnection: applyRemoteCallCapabilities: rttMode = 1
10-29 18:09:16.978 19257 19469 D ImsPhoneConnection: updateMediaCapabilities: call id=a13900f872c8f9c2_1, getConnectionCapabilities() = 79, capabilities = 79
10-29 18:09:16.978 19257 19469 D ImsPhoneConnection: getAudioQualityFromCallProfile: audioQuality = 19
// 注意 这里的3 是0011 表示 至少更新了两个能力
10-29 18:09:16.978 19257 19469 D ImsPhoneConnection: updateMediaCapabilities: newAudioQuality = 3, getAudioQuality() = 3这是第一通电话 第一个rtp包 视频电话 比较明显 一般 刚接通总会有明显的延时 ps

在这里贴一张 应用设计框架图 便于理解

这张图能很清楚的看出来 都有哪些子模块在分工协作

我们到目前为止分析的都是ims call 在网上搜索资料 千万不要和cs call 弄混了

ims ImsPhoneCalltracker

cs GsmCdmaCallTracker 

// 这里RIL会告诉ImsCallSession call的state 发生改变
// 接着 ImsCallSession 会去访问 RIL 将call的信息查询上来
10-29 18:09:16.962 19146 19146 I QImsService: ImsCallSessionImplHandler : Message received: what = 9
10-29 18:09:16.962 19146 19146 I QImsService: ImsCallSessionImplHandler : EVENT_RINGBACK_TONE, playTone = false
10-29 18:09:16.962 19146 19146 I QImsService: ImsCallSessionCallbackHandler : posting to handler
10-29 18:09:16.963 19146  3750 I QImsService: ImsCallSessionCallbackHandler : callSessionProgressing :: profile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }10-29 18:09:16.963 19146 19268 I QImsService: ImsRadioIndication : onCallStateChanged_1_6()10-29 18:09:16.965 19146 19268 I QImsService: ImsSenderRxr : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED  [id=1,ACTIVE,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 2 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=3, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false] [SUB0]10-29 18:09:16.966 19146 19146 I QImsService: ImsCallSessionImpl : updateCall for id=1,ACTIVE,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 2 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=3, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false10-29 18:09:16.968 19146 19146 I QImsService: ImsCallModification : update dc=id=1,ACTIVE,toa=129,norm,mo,0,voc,noevp,,cli=1,,3Call Details = 0 2 callSubState 0 videoPauseState2 mediaId4 Rtt mode 0 Local Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Peer Ability isValid = true type = 0 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0isValid = true type = 3 status = 2 rttMode = 1 accTechStatus  mode = 14 Status = 2 restrictCause = 0 registered = 0 Cause code 0 sipAlternateUri null, null,CallFailCause Code= 0,CallFailCause String= null, isEncrypted=false, historyInfo=, Conf. Support=3, {MultiIdentity Line Info : msisdn =  , line type = 0 , line status = 0}, isTirOverwriteAllowed=false10-29 18:09:16.986 19257 19469 D ImsPhoneCallTracker: [0] onCallUpdated: profile is { serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 }
10-29 18:09:16.986 19257 19469 D ImsPhoneCallTracker: [0] processCallStateChange state=ACTIVE cause=0 ignoreState=true// 此处有个观察者@UnsupportedAppUsage
private void processCallStateChange(ImsCall imsCall, ImsPhoneCall.State state, int cause,boolean ignoreState) {...if (changed) {if (conn.getCall() == mHandoverCall) return;updatePhoneState();mPhone.notifyPreciseCallStateChanged();}}...10-29 18:09:16.976 19257 19469 I ImsCall : callSessionStarted :: session=[ImsCallSession objId:206958363 state:ESTABLISHED callId:1] profile={ serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 } ImsCall=[ImsCall objId:156448952 onHold:N mute:N mCallProfile:{ serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 } networkType:13 updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:[ImsCallSession objId:206958363 state:ESTABLISHED callId:1] transientSession:null]10-29 18:09:16.986 19257 19469 I ImsCall : callSessionUpdated :: session=[ImsCallSession objId:206958363 state:ESTABLISHED callId:1] profile={ serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 } ImsCall=[ImsCall objId:156448952 onHold:N mute:N mCallProfile:{ serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 } networkType:13 updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:[ImsCallSession objId:206958363 state:ESTABLISHED callId:1] transientSession:null]// 笔者对这句log很奇怪 都建立通话 active了 怎么还是拨号的状态?
// 理解成 ESTABLISHED 向active的过渡吧
10-29 18:09:16.995 22754 22754 V Dialer  : TelecomCallCallback.onDetailsChanged -  call=Call [id: a13900f872c8f9c2, state: DIALING, details: [id: a13900f872c8f9c2, pa: ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, hdl: tel:15656098064, hdlPres: 1, videoState: Audio Only, caps: [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_RTT_REMOTE], props: [Properties: PROPERTY_HIGH_DEF_AUDIO]]] details=[id: a13900f872c8f9c2, pa: ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, hdl: tel:15656098064, hdlPres: 1, videoState: Audio Only, caps: [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_RTT_REMOTE], props: [Properties: PROPERTY_HIGH_DEF_AUDIO]]10-29 18:09:17.016 22754 22754 V Dialer  : DuoVideoTech.isAvailable - upgrade unavailable, call must be active
10-29 18:09:17.016 22754 22754 I Dialer  : CallList.onUpdateCall - [DialerCall_0, DIALING, [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_RTT_REMOTE], [Properties: PROPERTY_HIGH_DEF_AUDIO], children:[], parent:null, conferenceable:[], videoState:Audio Only, mSessionModificationState:0, CameraDir:-1]
10-29 18:09:17.017 22754 22754 I Dialer  : CallList.onUpdateCall - [DialerCall_0, DIALING, [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_RTT_REMOTE], [Properties: PROPERTY_HIGH_DEF_AUDIO], children:[], parent:null, conferenceable:[], videoState:Audio Only, mSessionModificationState:0, CameraDir:-1]
10-29 18:09:17.017 22754 22754 I Dialer  : InCallAnimator - isIncomingToActiveAnimatorRunning: false
10-29 18:09:17.017 22754 22754 I Dialer  : InCallAnimator - isDialToActiveAnimatorRunning: false
10-29 18:09:17.017 22754 22754 D Dialer  : InCallPresenter.onCallListChange - onCallListChange oldState= OUTGOING newState=OUTGOING
10-29 18:09:17.017 22754 22754 D Dialer  : InCallPresenter.startOrFinishUi - startOrFinishUi: OUTGOING -> OUTGOING
10-29 18:09:17.017 22754 22754 D Dialer  : InCallPresenter.onCallListChange - onCallListChange newState changed to OUTGOING
10-29 18:09:17.017 22754 22754 I Dialer  : InCallPresenter.onCallListChange - Phone switching state: OUTGOING -> OUTGOING
10-29 18:09:17.017 22754 22754 D Dialer  : InCallActivity - acceptCallWhenVideoDialogDismissed  mAcceptCallWhenVideoDialognull
10-29 18:09:17.017 22754 22754 D Dialer  : InCallPresenter.onCallListChange - Notify a.c.g.a1@b9230a of state OUTGOING
10-29 18:09:17.017 22754 22754 I Dialer  : CallCardPresenter.onStateChange - oldState: OUTGOING, newState: OUTGOING
10-29 18:09:17.018 22754 22754 V Dialer  : CallCardPresenter.onStateChange - primary call: [DialerCall_0, DIALING, [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_RTT_REMOTE], [Properties: PROPERTY_HIGH_DEF_AUDIO], children:[], parent:null, conferenceable:[], videoState:Audio Only, mSessionModificationState:0, CameraDir:-1]
10-29 18:09:17.018 22754 22754 V Dialer  : CallCardPresenter.onStateChange - secondary call: null1.10-29 18:09:17.035 19257 19257 V Telephony: GsmConnection: Update state from ALERTING to ACTIVE for a13900f872c8f9c2_110-29 18:09:17.154 19257 19257 V Telephony: onStateChanged, state: ACTIVE10-29 18:09:17.155 19257 19257 D TelecomFramework: : Adapter set state a13900f872c8f9c2_1 ACTIVE10-29 18:09:17.156 18428 21162 I Telecom : CallsManager: setCallState DIALING -> ACTIVE, call: [Call id=a13900f872c8f9c2, state=DIALING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut VTlrx VTltx VTlbi VTrrx VTrtx VTrbi sup_rtt], prop=[ HD]]: CSW.sA(cap)@BkM10-29 18:09:17.160 18428 21162 I Telecom : InCallController: Sending updateCall [Call id=a13900f872c8f9c2, state=ACTIVE, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut VTlrx VTltx VTlbi VTrrx VTrtx VTrbi sup_rtt], prop=[ HD]]: CSW.sA(cap)@BkM10-29 18:09:17.156 18428 21162 I Telecom : CallsManager: setCallState DIALING -> ACTIVE, call: [Call id=a13900f872c8f9c2, state=DIALING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut VTlrx VTltx VTlbi VTrrx VTrtx VTrbi sup_rtt], prop=[ HD]]: CSW.sA(cap)@BkM10-29 18:09:17.156 18428 21162 V Telecom : Call: setState DIALING -> ACTIVE: CSW.sA(cap)@BkM10-29 18:09:17.156 18428 21162 D Telecom : ConnectionServiceWrapper: CS -> TC[cap]: setActive a13900f872c8f9c2_1: CSW.sA(cap)@BkM
10-29 18:09:17.156 19257 19257 D Telephony: ImsConferenceController: recalc - 4 [TelephonyConnection objId:109360327 telecomCallID:a13900f872c8f9c2_1 type:ims state:ACTIVE capabilities:[Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_LOCAL_RX CAPABILITY_SUPPORTS_VT_LOCAL_TX CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL CAPABILITY_SUPPORTS_RTT_REMOTE] properties:[Properties: PROPERTY_HIGH_DEF_AUDIO] address:tel:15656098064 originalConnection:[ImsPhoneConnection objId: 48194905 telecomCallID: a13900f872c8f9c2_1 address: 15656098064 isAdhocConf: N ImsCall: [ImsCall objId:156448952 onHold:N mute:N mCallProfile:{ serviceType=1, callType=2, restrictCause=0, mediaProfile={ audioQuality=0, audioDirection=3, videoQuality=0, videoDirection=-1, rttMode=0, hasRttAudioSpeech=false }, emergencyServiceCategories=0, emergencyUrns=[], emergencyCallRouting=0, emergencyCallTesting=false, hasKnownUserIntentEmergency=false, mRestrictCause=0, mCallerNumberVerstat= 0 } networkType:13 updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:[ImsCallSession objId:206958363 state:ESTABLISHED callId:1] transientSession:null]] partOfConf:N confSupported:Y isAdhocConf:N] supportsConf? true
10-29 18:09:17.156 18428 21162 I Telecom : CallsManager: setCallState DIALING -> ACTIVE, call: [Call id=a13900f872c8f9c2, state=DIALING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut VTlrx VTltx VTlbi VTrrx VTrtx VTrbi sup_rtt], prop=[ HD]]: CSW.sA(cap)@BkM
10-29 18:09:17.156 19257 19257 V Telephony: conferenceableSet size: 1
10-29 18:09:17.156 18428 21162 V Telecom : Call: setState DIALING -> ACTIVE: CSW.sA(cap)@BkM
10-29 18:09:17.157 18428 21162 D Telecom : Call: maybeLoadCannedSmsResponses: doing nothing: CSW.sA(cap)@BkM
10-29 18:09:17.157 18428 21162 D Telecom : TelecomAnalytics: setting startTime for call a13900f872c8f9c2 to 1635502157157: CSW.sA(cap)@BkM
10-29 18:09:17.157 19257 19257 V TelecomFramework: ConnectionServiceAdapter: setConferenceableConnections: a13900f872c8f9c2_1, []
10-29 18:09:17.157 18428 21162 I Telecom : Event: RecordEntry a13900f872c8f9c2: SET_ACTIVE, active set explicitly: CSW.sA(cap)@BkM
10-29 18:09:17.157 19257 19257 D TelecomFramework: Logging: Log.getExternalSession was called with no session active.
10-29 18:09:17.157 19257 19257 V Telephony: recalculateConference
10-29 18:09:17.157 18428 21162 I Telecom : CallsManager: newCanAddCall: true: CSW.sA(cap)@BkM
10-29 18:09:17.158 18428 21162 I Telecom : InCallController: onCanAddCallChanged : true: CSW.sA(cap)@BkM
10-29 18:09:17.158 19257 19257 D TelecomFramework: Logging: Log.getExternalSession was called with no session active.
10-29 18:09:17.158  1496  1682 V Codec2-InputBufferManager: InputBufferManager::_registerFrameData -- called with listener @ 0x0xb40000780e9dbe30, frameIndex = 4259.
10-29 18:09:17.158  2778  3331 D inetrval_aftertime: 12===>
10-29 18:09:17.158 18428 21162 I Telecom : CallsManager: broadcast state change from 3 to 5 --> onCallStateChanged : CSW.sA(cap)@BkM
10-29 18:09:17.158 22754 22754 I Dialer  : InCallAnimator - isIncomingToActiveAnimatorRunning: false11.10-29 18:09:17.160 18428 21162 I Telecom : InCallController: Sending updateCall [Call id=a13900f872c8f9c2, state=ACTIVE, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, handle=tel:15656098064, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut VTlrx VTltx VTlbi VTrrx VTrtx VTrbi sup_rtt], prop=[ HD]]: CSW.sA(cap)@BkM10-29 18:09:17.161 18428 21162 I Telecom : InCallController: Components updated: [ComponentInfo{com.google.dialer/com.android.incallui.InCallServiceImpl}]: CSW.sA(cap)@BkM// 会走到dialer/incallui
10-29 18:09:17.162 22754 22754 V Dialer  : TelecomCallCallback.onStateChanged - call=Call [id: a13900f872c8f9c2, state: ACTIVE, details: [id: a13900f872c8f9c2, pa: ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 8901260232742230019, UserHandle{0}, hdl: tel:15656098064, hdlPres: 1, videoState: Audio Only, caps: [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_LOCAL_RX CAPABILITY_SUPPORTS_VT_LOCAL_TX CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL CAPABILITY_SUPPORTS_RTT_REMOTE], props: [Properties: PROPERTY_HIGH_DEF_AUDIO]]] newState=4

上述都是描述MO流程 接下来接着描述MT流程

mt 流程其实和 mo的updateCall 流程基本一致 笔者对整理的内容 进行了评估

只展示qcom内容

ps 后续有机会会补上 但整体上 不影响理解

这张图如果看不清楚 可以看参考链接里 第8个

总结 

常用tag

一般的问题 过滤下面几个tag就可以了 能看出什么意思 具体其他参数是什么意思 我也尝试过

分析代码 以及 查询相关信息 但我更愿意查阅 集成方 pdf 当然 如果有更好的方式 可以 与 笔者 分享

按照常用度依次排列

QImsService

QImsService: ImsSenderRxr

ImsPhoneCallTracker

RILJ

RILQ

ok,感谢看到这里的小伙伴,其实可以看出 整理这块内容的时间跨度有点大 三个月吧 在整理的过程中 有些东西还是不清楚的 ifly也不提供这块的qcom手册 自己一点一点往上面凑 也参考了很多博客 (绝大多数都是cccv 也没验证过) 这个过程也想过放弃 而且笔者平时还喜欢打个团战 效率不高 但笔者秉承着一个帅哥良好的自我修养 还是坚持整理完了(此处打8.5折) 还有很多细节没有整理到 但笔者认为一般问题分析都是没问题的 如果有好的例子 比较细节性的案例分析 或其他 欢迎和笔者分享 笔者邮箱(to节省不必要的沟通)

笔者邮箱前面七位是英文字母 后缀是@foxmail.com

前七位字母用ascii代替

119 104 115 103 122 99 121

ascii查询链接

https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii%E7%A0%81&fromid=99077&fr=aladdin

原创不易 感谢打赏

***参考资料***

1.图片引用大多为原创设计

2.http://blog.hsujee.com/

3.https://www.jianshu.com/p/ff51295b84a1

4.源码 repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-11.0.0_r48

5.源码 https://github.com/bcyj/android_tools_leeco_msm8996/tree/master/telephony-apps/ims/src/org/codeaurora/ims

6.《Android Telephony原理解析与开发指南》

7.https://www.its404.com/article/dxpqxb/104315936

// 有qcom 截图 更新流程很清晰

8.https://www.it619.net/index.php?edition-view-326-4.htm

基于 AndroidR QCOM IMS CALL 通话流程解析相关推荐

  1. 图解基于SIP协议的VoIP通话过程

    基于SIP协议的VoIP通话流程: 一次通话过程的抓包情况: 呼叫请求报文内容: 呼叫响应报文内容: 客户端样机上抓的RTP/RTCP语音流数据报文: RTP数据报文内容: RTCP报文内容(RTP数 ...

  2. Android 9.0 IMS通话流程

    简介: VoLTE是基于IMS的语音业务,它是一种IP数据,就是我们熟知的高清语音通话. 第一部分 拨出流程(MO) IMS通话流程可以在GSM的通话流程的基础上进行研究,整体流程都差不多,就是在一些 ...

  3. 基于神策用户画像,在线教育企业线索标签体系搭建及培育全流程解析

    作者介绍:TigerHu,环球网校大数据营销产品 leader,主导数据产品线和营销 CRM 产品线. 本文内容均从作者真实实践过程出发,结合作者公司与神策数据合作真实场景,从神策用户画像产品出发,全 ...

  4. android ims注册流程,ims注册流程volte通话流程总结

    IMS 开机初始化流程图请见如下附件,流程图较大,文档中显示不清晰. IMS开机初始化流程图 1.1 监控IMS Service PhoneApp进程是在系统开机时启动的,Phone进程初始化的时候( ...

  5. 基于AKA的IMS接入认证机制

    基于AKA的IMS接入认证机制 IP多媒体子系统(IMS)作为3G网络的核心控制平台,其安全问题正面临着严峻的挑战.IMS的接入认证机制的实现作为整个IMS安全方案实施的第一步,是保证IMS系统安全的 ...

  6. IMS的注册流程分析

    IMS的基础常识: https://www.cnblogs.com/moon-lights/p/7018789.html http://www.360doc.com/content/15/0624/0 ...

  7. Android IMS 语音通话 vs 视频通话 vs 视频彩铃

    背景 以下内容基于Android P code. 主要差异 视频通话比语音通话主要是多了判断是否为视频通话,及视频的显示和传输.如下: video call 视频界面显示控制 界面通过IVideoPr ...

  8. Netty 源码解析系列-服务端启动流程解析

    netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...

  9. Spring Cloud Gateway (七)处理流程解析

    Spring Cloud Gateway (七)处理流程解析 简介     初步梳理 Spring Cloud Gateway 的处理流程 过程记录 主要请求流程     在前面的分析中,我们知道在 ...

  10. Spark SQL架构工作原理及流程解析

    Spark SQL架构工作原理及流程解析,spark sql从shark发展而来,Shark为了实现Hive兼容,在HQL方面重用了Hive中HQL的解析.逻辑执行计划翻译.执行计划优化等逻辑. Sp ...

最新文章

  1. GLFW--Getting started
  2. Windows Server 2016 笔记
  3. java url 拦截_Spring mvc设置某些url不被interceptor拦截器拦截的方法
  4. CVPR2021|SpinNet:学习用于3D点云配准的通用表面描述符
  5. Kraken:使用精确比对的超快速宏基因组序列分类软件
  6. poj - 1651 Multiplication Puzzle
  7. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并
  8. 学习MSCKF笔记——前端、图像金字塔光流、Two Point Ransac
  9. 浅析微软的网关项目 -- ReverseProxy
  10. Server Core 的部署与管理
  11. 使用MediaCodec硬解码h.265视频及音频进行播放
  12. linux计划任务详解(附演示)
  13. 科大讯飞测试开发工程师面试
  14. 基于KNN的离群点检测算法的Matlab版实现
  15. 主成分分析(PCA)原理、步骤
  16. 一副眼镜一千多贵吗_一副近视眼镜的成本大概多少?
  17. Bruce Schneier 和他的密码学以及网络安全经典著作推荐
  18. CentOS-7挂载iscsi网络存储
  19. 计蒜客习题:帕吉的肉钩
  20. java图片放大_【图像处理-图像无损放大】JavaAPI示例代码

热门文章

  1. 将HDC保存为BMP文件
  2. 服务器如果清理垃圾文件,为citrix服务器清理垃圾文件事件
  3. 微信小程序动态更改标题栏_微信小程序动态改变导航栏标题和背景颜色
  4. 高通败诉,授权专利技术之后高通的优势不再?
  5. Python拉勾网爬虫实现
  6. ionic4--下拉刷新(refresher)
  7. Volley读取文档和图片
  8. 饥荒控制台输入没用_《饥荒》控制台正确使用教程 如何使用控制台
  9. R语言数学表达式、特殊符号等
  10. 帧率FPS,屏幕刷新频率赫兹Hz