源码版本: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. 如何同时运行两个tomcat?

    两个以上,要更改端口号.1 下载tomcat的压缩包(不是安装的那种,直接解压缩就能用的)下载地址:http://tomcat.apache.org/download-55.cgi 下载好的文件名是: ...

  2. bzoj1588

    splay #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  3. 在哪可以Sigmaplot 13下载免费版的

    SigmaPlot是一款科学的数据分析和绘图软件,可以进行精密绘图.数据分析.自动化管理数据和创建网络图表,具备制作和发行品质图表的水平,该软件被广泛地运用在多个领域.现今SigmaPlot软件日益受 ...

  4. onmousewheel跟onscroll的区别

    研习DOM中的事件方法,发现一些细微差别,百度一下没有类似的解答,随手记下来. onmousewheel事件  以下摘自http://help.dottoro.com/ljmracjb.php Bro ...

  5. Javascript和HTML:

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  6. wildfly jboss 优化配置

    参考调优:http://www.mastertheboss.com/jboss-server/jboss-performance/jboss-as-7-performance-tuning?showa ...

  7. python学习笔记-(十三)线程&多线程

    为了方便大家理解下面的知识,可以先看一篇文章:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 线程 1.什么是线程? ...

  8. MYSQL存储过程、游标、触发器

    MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成  存储过程简单来说,就是为以后的使用而保存的一 ...

  9. 如何处理 在html中 li 的高度自适应(且li里面的内容有浮动的情况下)

    废话不多说,我们写贴出代码 这个是 Html 代码 <div class="main"> <ul> <li> <div class=&qu ...

  10. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...