来电流程梳理

这篇博客主要梳理了Android系统中来电的处理流程,从协议侧调用HAL主动上报接口,到ImsService,接着通过ImsCallSession监听回调,涉及的源代码路径包括MmTelFeature、ImsPhoneCallTracker、ImsPhoneBase、Phone以及TelephonyConnection等关键组件。

来电流程梳理

纠结很久,要不要写来电上报的流程。因为拿不到芯片厂商的ImsService的实现,纸上谈兵太空旷了

大致的思路:
协议侧调用HAL的主动上报接口,上报来电给到ImsService.经过一系列的处理后。通过ImsCallSession.Listener回调到
MmTelFeature的notifyIncomingCallSession

frameworks\base\telephony\java\android\telephony\ims\feature\MmTelFeature.java

    public final void notifyIncomingCallSession(IImsCallSession c, Bundle extras) {
   
   
        synchronized (mLock) {
   
   
            if (mListener == null) {
   
   
                throw new IllegalStateException("Session is not available.");
            }
            try {
   
   
                mListener.onIncomingCall(c, extras);
            } catch (RemoteException e) {
   
   
                throw new RuntimeException(e);
            }
        }
    }

frameworks\base\telephony\java\android\telephony\ims\feature\MmTelFeature.java

        public void callSessionUpdated(ImsCallSession session, ImsCallProfile profile) {
   
   
            logi("callSessionUpdated :: session=" + session + " profile=" + profile);

            if (isTransientConferenceSession(session)) {
   
   
                logi("callSessionUpdated :: not supported for transient conference session=" +
                        session);
                return;
            }

            ImsCall.Listener listener;

            synchronized(ImsCall.this
### 异常用例的梳理方法 在软件测试中,异常用例的设计是确保系统在非正常操作或极端条件下仍能保持稳定性和正确性的关键环节。异常测试用例应覆盖输入异常、系统资源异常、接口调用异常、并发冲突、日志反馈验证等多个方面,以提高测试的全面性和有效性。 #### 输入数据异常测试 输入数据异常是常见的异常类型之一,测试应验证系统对非法输入的处理能力,包括空值、非法字符、超长输入、边界值等。 - 空值或缺失输入:验证系统在未提供必要参数时能否正确提示错误。 - 非法字符或格式:例如输入字符串而非数字、格式错误的日期等。 - 超长输入:测试输入长度超过系统限制时的处理能力。 - 边界值测试:如整型最大值、最小值、零值等。 ```java @Test(expected = IllegalArgumentException.class) public void testEmptyInput() { String input = ""; validateInput(input); } ``` 此类测试用例的设计可结合等价类划分和边界值分析法,确保覆盖各类非法输入情况[^1]。 #### 系统资源异常测试 系统资源异常包括磁盘空间不足、内存不足、网络中断等,可能导致系统崩溃或响应异常。 - 文件读取失败:测试文件不存在、权限不足、文件被锁定等情况。 - 网络请求失败:模拟网络超时、连接失败、响应异常等。 - 数据库连接失败:测试数据库服务不可用、连接池满、查询超时等。 - 内存溢出:模拟大对象分配、频繁GC等场景。 ```java @Test(expected = IOException.class) public void testDiskFull() throws IOException { simulateDiskFull(); writeToFile("test.txt", "large content"); } ``` 通过模拟资源异常,验证系统在资源受限情况下的容错能力,确保系统能够优雅降级或提供明确的错误提示。 #### 接口调用异常测试 接口调用异常测试主要针对系统依赖的外部服务或接口,验证其在异常状态下的表现。 - 第三方接口调用失败:模拟返回 500、超时、空响应等。 - 异步回调异常:测试回调未执行、执行异常等情况。 - 参数校验失败:调用接口时传递非法参数,验证接口是否能正确处理。 ```java @Test public void testThirdPartyServiceTimeout() { when(thirdPartyClient.call()).thenThrow(new TimeoutException()); assertThrows(TimeoutException.class, () -> service.process()); } ``` 此类测试需结合场景法,模拟真实业务流程中可能出现的接口异常情况,以确保系统具备良好的异常处理机制[^2]。 #### 并发与冲突测试 并发测试用于验证系统在多用户、多线程、多任务场景下的稳定性与一致性。 - 多线程访问共享资源:测试并发读写文件、数据库、缓存等。 - 交叉事件测试:如 App 在前台运行时接到来电、收到推送等,验证是否发生冲突。 - 资源竞争测试:多个线程同时修改同一数据,验证锁机制是否有效。 ```java @Test public void testConcurrentAccess() throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(10); for (int i = 0; i < 100; i++) { executor.submit(() -> updateSharedCounter()); } executor.shutdown(); assertTrue(isCounterConsistent()); } ``` 此类测试需结合线程安全机制验证系统在高并发场景下的表现,确保不会出现数据不一致或死锁问题。 #### 日志与异常反馈验证 异常发生后,系统是否记录了足够的日志信息,是否提供了用户友好的错误提示,是异常测试的重要验证点。 - 错误日志是否记录异常堆栈信息。 - 用户提示是否清晰易懂,不暴露敏感信息。 - 是否支持错误码机制,便于定位问题。 ```java @Test public void testErrorLogWritten() { try { performInvalidOperation(); fail("Expected exception not thrown"); } catch (Exception e) { assertTrue(logContains(e.getMessage())); } } ``` 通过日志验证可以确保异常信息的完整性,有助于问题的快速定位与修复。 #### 测试环境隔离与模拟 异常测试往往需要模拟一些极端或不可控的环境条件,因此测试环境的隔离性和可控性至关重要。 - 使用 Mock 框架模拟异常场景,如 Mockito、PowerMock。 - 容器化测试环境,确保测试前后环境一致性。 - 使用虚拟化网络、磁盘等资源,模拟异常条件。 ```java @Test public void testMockedNetworkFailure() { when(networkClient.sendRequest()).thenThrow(new IOException("Network unreachable")); assertThrows(IOException.class, () -> service.sendData()); } ``` 通过环境隔离和虚拟化手段,可以在不影响生产环境的前提下,高效地进行异常测试[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值