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: 0
private 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)@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
基于上一部分流程 先拉起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_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
在这里贴一张 应用设计框架图 便于理解
这张图能很清楚的看出来 都有哪些子模块在分工协作
我们到目前为止分析的都是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=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个
总结
常用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