源码版本:4.4

跳过InCallActivity等UI实现。先看service以及底层。

1, 在frameworks/opt下面会发现如下文件列表:

./telephony/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
./telephony/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
./telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
./telephony/src/java/com/android/internal/telephony/gsm/GsmLteServiceStateTracker.java
./telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java

2, 可以直接进入./telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java 分析,很容易发现类似于如下的代码:

619     /**
620 * send signal-strength-changed notification if changed Called both for
621 * solicited and unsolicited signal strength updates
622 *
623 * @return true if the signal strength changed and a notification was sent.
624 */
625 protected boolean onSignalStrengthResult(AsyncResult ar, boolean isGsm) {
626 SignalStrength oldSignalStrength = mSignalStrength;
627
628 // This signal is used for both voice and data radio signal so parse
629 // all fields
630
631 if ((ar.exception == null) && (ar.result != null)) {
632 mSignalStrength = (SignalStrength) ar.result;
633 mSignalStrength.validateInput();
634 mSignalStrength.setGsm(isGsm);
635 } else {
636 log("onSignalStrengthResult() Exception from RIL : " + ar.exception);
637 mSignalStrength = new SignalStrength(isGsm);
638 }
639
640 return notifySignalStrength();
641 }

  这里主要是结构体的初始化以及上下文环境的简单判断。我们继续追踪notifySignalStrength()

229     private SignalStrength mLastSignalStrength = null;
230 protected boolean notifySignalStrength() {
231 boolean notified = false;
232 synchronized(mCellInfo) {
233 if (!mSignalStrength.equals(mLastSignalStrength)) {
234 try {
235 mPhoneBase.notifySignalStrength();
236 notified = true;
237 } catch (NullPointerException ex) {
238 loge("updateSignalStrength() Phone already destroyed: " + ex
239 + "SignalStrength not notified");
240 }
241 }
242 }
243 return notified;
244 }

这里有mSignalStrength 和 mLastSignalStrength 两个和信号强度相关的量。算是找到切入点了,信号强度更新的中间点就是这里了。

3,我们先向下分析看有什么可以学习的。 onSignalStrengthResult 是被  frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java中handleMessage在Message Type是    EVENT_GET_SIGNAL_STRENGTH的时候调用的:

 424             case EVENT_GET_SIGNAL_STRENGTH:
425 // This callback is called when signal strength is polled
426 // all by itself
427
428 if (!(mCi.getRadioState().isOn())) {
429 // Polling will continue when radio turns back on
430 return;
431 }
432 ar = (AsyncResult) msg.obj;
433 onSignalStrengthResult(ar, true);
434 queueNextSignalStrengthPoll();
435
436 break;

4, 到这里就需要对RIL有一定的了解才好继续追下去。RIL的event传到上层之后主要通过一个叫做Registrant的机制分发的。

  我们跳到frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java中去。

  这里有主动去得到signalstrength的方法:

1127     getSignalStrength (Message result) {
1128 RILRequest rr
1129 = RILRequest.obtain(RIL_REQUEST_SIGNAL_STRENGTH, result, mIs2ndRil);
1130
1131 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
1132
1133 send(rr);
1134 }

  继续往下看,接受到底层发来的数据后通过Registrant Notification:

2811             case RIL_UNSOL_SIGNAL_STRENGTH:
2812 // Note this is set to "verbose" because it happens
2813 // frequently
2814 if (RILJ_LOGV) unsljLogvRet(response, ret);
2815
2816 if (mSignalStrengthRegistrant != null) {
2817 mSignalStrengthRegistrant.notifyRegistrant(
2818 new AsyncResult (null, ret, null));
2819 }
2820 break;

5, 继续追下去,我们看到有主动通过RIL_REQUEST_SIGNAL_STRENGTH去request signal strength的。

  所以直接在hardware/ril下搜关键字:RIL_REQUEST_SIGNAL_STRENGTH得到结果如下:

./include/telephony/ril.h:1388: * RIL_REQUEST_SIGNAL_STRENGTH
./include/telephony/ril.h:1402:#define RIL_REQUEST_SIGNAL_STRENGTH 19
./libril/ril.cpp:3758: case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
./libril/ril_commands.h:36: {RIL_REQUEST_SIGNAL_STRENGTH, dispatchVoid, responseRilSignalStrength},
./reference-ril/reference-ril.c:2093: case RIL_REQUEST_SIGNAL_STRENGTH:
./reference-ril/ril.h:1388: * RIL_REQUEST_SIGNAL_STRENGTH
./reference-ril/ril.h:1402:#define RIL_REQUEST_SIGNAL_STRENGTH 19

  很明显是hardware/ril/reference-ril/reference-ril.c里面如下函数被调用去查询信号强度了,调用AT command等一看便知:

  static void requestSignalStrength(void *data, size_t datalen, RIL_Token t)
{
ATResponse *p_response = NULL;
int err;
char *line;
int count =;
int numofElements=sizeof(RIL_SignalStrength_v6)/sizeof(int);
int response[numofElements]; err = at_send_command_singleline("AT+CSQ", "+CSQ:", &p_response); if (err < || p_response->success == ) {
RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, );
goto error;
} line = p_response->p_intermediates->line; err = at_tok_start(&line);
if (err < ) goto error; for (count =; count < numofElements; count ++) {
err = at_tok_nextint(&line, &(response[count]));
if (err < ) goto error;
} RIL_onRequestComplete(t, RIL_E_SUCCESS, response, sizeof(response)); at_response_free(p_response);
return;

从上层追到下层基本告一段落,Telephony的其他功能的实现结构都一样,也可以同样通过上述思路去追踪。

涉及到的源码路径基本有:

frameworks/av

frameworks/base

frameworks/opt

packages/apps

hardware/ril

等

Android Telephony —— 手机信号实时变化源码分析过程记录的更多相关文章

  1. 手机自动化测试:appium源码分析之bootstrap三

    手机自动化测试:appium源码分析之bootstrap三   研究bootstrap源码,我们可以通过代码的结构,可以看出来appium的扩展思路和实现方式,从中可以添加我们自己要的功能,针对app ...

  2. 手机自动化测试:appium源码分析之bootstrap二

    手机自动化测试:appium源码分析之bootstrap二   在bootstrap项目中的io.appium.android.bootstrap.handler包中的类都是对应的指令类, priva ...

  3. 手机自动化测试:appium源码分析之bootstrap一

    手机自动化测试:appium源码分析之bootstrap一   前言: poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.popte ...

  4. 手机自动化测试:Appium源码分析之跟踪代码分析八

    手机自动化测试:Appium源码分析之跟踪代码分析八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  5. 手机自动化测试:Appium源码分析之跟踪代码分析五

    手机自动化测试:Appium源码分析之跟踪代码分析五   手机自动化测试是未来很重要的测试技术,作为一名测试人员应该熟练掌握,POPTEST举行手机自动化测试的课程,希望可以训练出优秀的手机测试开发工 ...

  6. 手机自动化测试:appium源码分析之bootstrap十七

    手机自动化测试:appium源码分析之bootstrap十七   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  7. 手机自动化测试:appium源码分析之bootstrap十六

    手机自动化测试:appium源码分析之bootstrap十六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  8. 手机自动化测试:appium源码分析之bootstrap十五

    手机自动化测试:appium源码分析之bootstrap十五   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  9. 手机自动化测试:appium源码分析之bootstrap十四

    手机自动化测试:appium源码分析之bootstrap十四   poptest(www.poptest.cn)是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开 ...

随机推荐

  1. Neural Style学习2——环境安装

    neural-style Installation This guide will walk you through the setup for neural-style on Ubuntu. Ste ...

  2. Leetcode 255. Verify Preorder Sequence in Binary Search Tree

    验证一个list是不是一个BST的preorder traversal sequence. Given an array of numbers, verify whether it is the co ...

  3. bzoj2503&poj3387[NEERC2006]IdealFrame

    其实只是把别人的题解强行扩写了 写这篇题解之前我不会的预备知识: 欧拉通路:从图中一个点出发不重复地遍历所有边的路径(可以停在另一个点) 欧拉回路:从图中一个点出发不重复地遍历所有边的回路(必须回到出 ...

  4. MySQL中日期与时间类型

    http://blog.sina.com.cn/s/blog_4d8730df01014jiy.html

  5. 使用VS2010创建WebService 发布、测试

    http://blog.sina.com.cn/s/blog_45eaa01a0102vopl.html 1 打开VS2010,菜单    文件->新建->项目 2 选择[ASP.net ...

  6. python:mysql+pycharm+Django环境搭建

    1.安装mysql-python 环境:OS X Yosemite10.10.2 + Python2.7 首先网上搜了下mysql-python,说要先安装mysql客户端,然后改配置文件,可是各种改 ...

  7. Yii2.0登录详解(下)

    在上一篇博文中,笔者讲述了yii2应用用户登陆的基本方法,但是这些方法到底是怎样实现登陆的呢?底层的原理到底是什么?在这篇博文笔者将从Yii的源码角度分析登陆的基本原理以及cookie自动登陆的原理, ...

  8. (转)Javascript本地存储小结

    转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 以下是原文: 1. 各种存储方案的简单对比 Cookies:浏览器均支持,容量为4KB UserData:仅 ...

  9. JAVA对MySQL数据库的操作

    一.导包: 使用JDBC连接MySQL数据库时,首先需要导入一个第三方的JAR包(点击下载),下载解压得到一个JAR包,并导入到JAVA项目中,如下图: 二.DBHelper类: 代码如下: impo ...

  10. Spring各jar包的作用

    spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...