基于 AndroidR QCOM IMS CALL 通话流程解析

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

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

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

这种场景大概可以理解为

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

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

等等

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

基于 AndroidR QCOM IMS CALL 通话流程解析_第1张图片

基于 AndroidR QCOM IMS CALL 通话流程解析_第2张图片

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

运营商业务系统 你懂的

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

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

基于 AndroidR QCOM IMS CALL 通话流程解析_第3张图片

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

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

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

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

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

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

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

基于 AndroidR QCOM IMS CALL 通话流程解析_第4张图片

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

基于 AndroidR QCOM IMS CALL 通话流程解析_第5张图片

7. 10-29 18:09:07.406 22754 22754 I Dialer  : DialUtils.startActivityWithErrorToast - videoState: 0

private static TelecomManager getTelecomManager(Context context) {
    return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
  }

 MO -- Telecomm

基于 AndroidR QCOM IMS CALL 通话流程解析_第6张图片

基于 AndroidR QCOM IMS CALL 通话流程解析_第7张图片

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发送拨号请求 

基于 AndroidR QCOM IMS CALL 通话流程解析_第8张图片

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)@Bcs

6.10-29 18:09:09.928 18428 18428 I Telecom : : callId = a13900f872c8f9c2_1: SBC.oSC(cap)@Bcs

7.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_0

8.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

 基于 AndroidR QCOM IMS CALL 通话流程解析_第9张图片

基于上一部分流程 先拉起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行为分析

基于 AndroidR QCOM IMS CALL 通话流程解析_第10张图片

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_0


2.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_0

2.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_0

3.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_0

4.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_0


InCallService 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 1001

10-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

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

基于 AndroidR QCOM IMS CALL 通话流程解析_第11张图片

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

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

ims ImsPhoneCalltracker

cs GsmCdmaCallTracker 基于 AndroidR QCOM IMS CALL 通话流程解析_第12张图片

 基于 AndroidR QCOM IMS CALL 通话流程解析_第13张图片

// 这里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=false


10-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=false


10-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: null



1.10-29 18:09:17.035 19257 19257 V Telephony: GsmConnection: Update state from ALERTING to ACTIVE for a13900f872c8f9c2_1

10-29 18:09:17.154 19257 19257 V Telephony: onStateChanged, state: ACTIVE

10-29 18:09:17.155 19257 19257 D TelecomFramework: : Adapter set state a13900f872c8f9c2_1 ACTIVE

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.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)@BkM

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 18428 21162 V Telecom : Call: setState DIALING -> ACTIVE: CSW.sA(cap)@BkM

10-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: false


11.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)@BkM

10-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个

基于 AndroidR QCOM IMS CALL 通话流程解析_第14张图片

总结 

常用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

原创不易 感谢打赏

基于 AndroidR QCOM IMS CALL 通话流程解析_第15张图片

***参考资料***

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

你可能感兴趣的:(通话流程分析,ims,call,android,java)