一、Telephony 基础与框架1. 请介绍Android Telephony的整体架构从应用层到Modem各层分别有哪些关键组件Android电话系统采用典型的分层架构自下而上分为· Modem层整个通讯的硬件基础不同制式采用不同Modem芯片· HAL层硬件抽象层 通过Radio HAL、SIM HAL、Network HAL标准化接口屏蔽不同Modem芯片的硬件差异· RIL层Radio Interface Layer 包含RIL Daemon(RILD)、Vendor RIL和libril是硬件与框架层的桥梁· Framework Telephony层包含RILJ、Service和业务功能模块语音、短信、ICC卡、网络服务、数据连接等· 应用层Dialer、Call tracker、SMS、MMS等直接面向用户的电话相关应用2. 什么是RILRILJ和RILD分别是什么角色RILRadio Interface Layer是连接上层电话服务框架与底层Modem的核心中间层负责将应用层的电话操作转换为Modem能理解的指令并将Modem的硬件事件上报给上层。· RILJRIL Java 属于系统Phone进程的一部分随Phone进程启动而加载。位于frameworks/opt/telephony/.../RIL.java接收上层请求封装为RILRequest对象通过Socket发送给RILD并解析返回的响应。· RILDRIL Daemon 通过Android的Init进程加载的守护进程由libril.so核心框架和Vendor RIL厂商实现库组成负责将RILJ的请求传递给Modem同时将Modem的状态变化上报给RILJ。3. TelephonyManager提供了哪些核心API如何获取网络类型、信号强度、IMEI核心API包括· 获取网络类型int getNetworkType()· 获取信号强度通过PhoneStateListener的onSignalStrengthsChanged()回调· 获取IMEIString getDeviceId()GSM网络返回IMEICDMA网络返回MEID· 获取通话状态int getCallState()返回IDLE/RINGING/OFFHOOK· 获取手机制式int getPhoneType()· 获取数据连接状态int getDataState()使用前需在AndroidManifest.xml中声明相应权限如READ_PHONE_STATE。4. 请说明Android中通话、短信、数据业务分别由哪些Service负责管理· 通话Telecom框架的CallManager协调多卡通话与状态管理TelephonyConnectionService处理网络交互· 短信SmsManager提供发送和接收接口IccSmsInterfaceManager处理SIM卡短信存储· 数据业务DataConnectionTracker在GSMPhone中是核心控制类ConnectivityService负责网络状态监控和管理5. SIM卡状态变化在Telephony框架中是如何传递的SIM卡状态变化由Modem通过RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED主动上报→ RILD接收后通过Socket传递给RILJ → RILJ解析后通过Handler机制回调上层→ TelephonyRegistry监听并广播状态变化→ 应用层通过SubscriptionManager或PhoneStateListener接收通知。二、通话功能Call6. 请描述Android中去电MO Call的完整流程。应用层Dialer调用Phone.dial()方法→ Telecom框架的CallManager创建新通话→ GsmCdmaPhone处理网络制式逻辑→ RILJ封装为RIL_REQUEST_DIAL指令通过Socket发送→ RILD接收后由Vendor RIL转换为AT命令如ATD号码发送给Modem → Modem执行基站注册与信道建立→ 结果通过RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED上报状态变化。7. 来电MT Call的流程是怎样的Modem检测到来电后主动上报RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED事件→ Vendor RIL接收→ RILD通过Socket传递给RILJ→ RILJ解析为onUnsolicitedResponse()回调→ Telephony框架更新通话状态→ Telecom框架通过InCallService通知Dialer应用显示来电界面。PhoneStateListener的onCallStateChanged()可监听到CALL_STATE_RINGING状态变化。8. 如何通过ITelephony AIDL接口实现通话控制ITelephony是系统隐藏API通过TelephonyManager.getITelephony()获取反射。核心方法· endCall()挂断电话· answerRingingCall()接听来电· silenceRinger()静音来电铃声· showCallScreen()显示通话界面9. 多卡场景下Telephony框架如何区分和管理不同SIM卡的通话Android 7.0引入Multi-SIM框架Android 8.0进一步强化· SubscriptionManager管理每张SIM卡的订阅信息IMSI、ICCID等· TelephonyManager提供双卡网络状态监控API通过subscriptionId区分不同SIM卡· CallManager协调多卡通话与状态管理处理多卡场景下的通话冲突· 每张卡对应独立的SubscriptionInfo对象存储元数据10. VoLTE/VoNR通话与普通CS通话在流程上有什么核心区别普通CS通话通过电路域承载走2G/3G网络VoLTE和VoNR都基于IMSIP多媒体子系统· VoLTE4G LTE网络下的IMS语音业务· VoNR5G NR网络下的IMS语音业务· 信令路径应用层发起呼叫→Telephony Service生成SIP INVITE→RIL转发至Modem→通过LTE/NR网络发送至IMS核心网· 无NR覆盖时VoNR可回落到VoLTE甚至3G/2G的CS语音· ImsManager提供makeCall()和takeCall()方法发起VoLTE/VoNR通话三、短信功能SMS11. 请写出通过SmsManager发送短信的代码及所需权限。javaSmsManager smsManager SmsManager.getDefault();smsManager.sendTextMessage(10086, null, CXLL, null, null);所需权限android.permission.SEND_SMS12. 短信发送的完整流程是怎样的应用层调用SmsManager.sendTextMessage()→ 框架层将短信编码为PDU格式→ 计算编码方式对长短信分段构造SmsHeader、SubmitPdu、SmsTracker→ RILJ构造RILRequest调用sendSms()/sendImsGsmSms()等方法→ 通过Socket发送给RILD→ Vendor RIL转换为AT命令如ATCMGS发送给Modem→ Modem返回结果→ 上层通过SentIntent回调通知发送结果。13. 长短信是如何拆分和拼接的UCS2和GSM-7编码有什么区别· 拆分SmsManager.divideMessage()将长短信按160字符GSM-7或70字符UCS-2分段每段添加UDH头信息标识分段序号· 拼接接收方根据UDH头中的referenceNumber、sequence和totalSegments重组· GSM-77位编码每字符7bit最大160字符/条· UCS-216位Unicode编码每字符16bit最大70字符/条用于中文等非GSM-7字符14. 如何监听新短信到达注册广播接收器监听android.provider.Telephony.SMS_RECEIVED系统广播4.4需默认短信应用才能接收或SMS_DELIVER_ACTION有序广播仅默认短信应用可接收。15. 彩信MMS与短信在协议和实现上有什么不同短信基于信令通道SACCH通过AT命令发送彩信基于数据通道PDP上下文需先激活数据连接通过HTTP下载。短信通过SmsManager发送彩信通过MmsManager或ContentResolver操作Uri。四、数据业务Data16. 数据业务的激活流程是怎样的APN如何选择和匹配DataConnectionTracker是核心控制类→ 在APN设置好后自动激活入口点是DataConnectionTracker→ ApnContext建立指定APN类型的上下文→ 通过AT命令激活PDP连接→ pppd通过数据端口完成拨号连接。ConnectivityService收到EVENT_SET_MOBILE_DATA后调用reconnect()。17. 数据网络切换的策略由谁管理ConnectivityService是核心角色负责网络状态监控和管理。WiFi与蜂窝数据切换由ConnectivityService根据网络评分机制决策Telephony框架通过DcTracker提供数据连接状态。18. 如何监听数据连接状态变化通过PhoneStateListener的onDataConnectionStateChanged()回调或注册ConnectivityManager.NetworkCallback监听NetworkCapabilities变化。19. 5G SA与NSA组网下数据业务处理有什么不同· NSA非独立组网 控制面锚定4G数据面可同时使用4G5G双连接语音走VoLTE· SA独立组网 控制面和数据面均在5G核心网语音走VoNR· 无NR覆盖时VoNR回落到VoLTE20. 数据业务频繁断连如何排查从三个层面排查Framework层检查DcTracker和ApnContext日志RIL层分析RIL日志确认PDP上下文激活/去激活原因Modem层检查信号强度和网络注册状态分析Modem日志确认断连根因。五、性能优化与问题排查21. 通话建立速度慢可能的原因及优化方法可能原因RIL响应慢、Modem注册慢、音频路由建立慢、IMS注册慢。优化方法接听通话后立即设置音频模式为incall模式不等RIL上报ACTIVE再设置优化RIL请求超时重试策略确保VoLTE开关开启。22. Telephony相关的ANR或卡顿如何定位和解决定位获取ANR日志trace文件分析堆栈关注主线程是否有耗时操作。常见场景广播接收器主线程执行耗时操作、同步Binder调用阻塞主线程。解决方案将耗时操作移至后台线程广播接收器使用goAsync()或IntentService处理。23. 如何设计RIL日志分析工具设计分层日志采集Framework/RIL/Modem三层、关键事件标记RIL_REQUEST_*和RIL_UNSOL_*、时序分析计算请求-响应耗时、异常自动检测超时、频繁重连等支持按通话ID/短信ID/数据会话ID关联全链路日志。24. 弱网环境下Telephony可能出现哪些问题如何优化问题通话断连率升高、语音质量下降、数据业务频繁重连。优化策略启用信号优化开关提升弱信号区域连接成功率电信业者实施流量缓解协议优化RIL重试和超时策略合理设置APN参数。25. 通话被中断后如何恢复页面状态通过InCallService监听通话状态变化回调在onCallStateChanged()中保存状态利用onSaveInstanceState()保存页面数据onRestoreInstanceState()恢复通过TelecomManager的getCurrentCall()查询当前通话。六、实战与设计问题26. 如何在Telephony框架中新增自定义通信功能从RIL层扩展开始在ril.h中定义新请求类型如RIL_REQUEST_CUSTOM_FEATURE→ Vendor RIL实现AT命令转换→ RILJ添加对应RILRequest方法→ Telephony框架层封装Service API→ 应用层通过Binder调用。整个过程需确保向后兼容和异常处理。27. 请描述一次解决过的Telephony相关技术难题示例问题某设备VoLTE通话建立时间比竞品长1.5秒。分析通过RIL日志发现从RIL_REQUEST_ANSWER到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED(ACTIVE)耗时正常但音频路由建立延迟高。根因系统等待RIL上报ACTIVE后才设置音频模式。解决接听通话后立即设置音频模式为incall优化后通话建立时间缩短1.2秒。28. 不同厂商RIL实现有何差异如何保证兼容性高通使用qcrilqmi机制MTK使用mtk-rild直接AT指令通信高通在AP侧kernel处理MTK在CP侧基带DSP处理。保证兼容性需严格遵循AOSP RIL接口规范使用标准ril.h定义Vendor RIL编译为独立so库通过系统属性动态加载对应库。29. Telephony模块的测试关注哪些方面单元测试RIL请求/响应解析、状态机转换、编码解码逻辑。集成测试实际SIM卡通话/短信/数据全流程、多卡切换、网络制式切换、VoLTE/VoNR功能。专项测试弱网/无网/漫游场景、并发通话中收发短信/数据、功耗、长时间稳定性。30. 请画出Android Telephony核心类图及模块间调用关系。应用层Dialer → InCallService → Telecom层CallManager → Phone进程TelephonyConnectionService、GsmCdmaPhone → RILJRIL.java通过Socket通信 → Native层rild守护进程libril.so Vendor RIL → Modem。TelephonyRegistry监听并广播状态变化。