Android Telephony —— 手机信号实时变化源码分析过程记录
源码版本: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 —— 手机信号实时变化源码分析过程记录的更多相关文章
- 手机自动化测试:appium源码分析之bootstrap三
手机自动化测试:appium源码分析之bootstrap三 研究bootstrap源码,我们可以通过代码的结构,可以看出来appium的扩展思路和实现方式,从中可以添加我们自己要的功能,针对app ...
- 手机自动化测试:appium源码分析之bootstrap二
手机自动化测试:appium源码分析之bootstrap二 在bootstrap项目中的io.appium.android.bootstrap.handler包中的类都是对应的指令类, priva ...
- 手机自动化测试:appium源码分析之bootstrap一
手机自动化测试:appium源码分析之bootstrap一 前言: poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.popte ...
- 手机自动化测试:Appium源码分析之跟踪代码分析八
手机自动化测试:Appium源码分析之跟踪代码分析八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析五
手机自动化测试:Appium源码分析之跟踪代码分析五 手机自动化测试是未来很重要的测试技术,作为一名测试人员应该熟练掌握,POPTEST举行手机自动化测试的课程,希望可以训练出优秀的手机测试开发工 ...
- 手机自动化测试:appium源码分析之bootstrap十七
手机自动化测试:appium源码分析之bootstrap十七 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- 手机自动化测试:appium源码分析之bootstrap十六
手机自动化测试:appium源码分析之bootstrap十六 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- 手机自动化测试:appium源码分析之bootstrap十五
手机自动化测试:appium源码分析之bootstrap十五 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- 手机自动化测试:appium源码分析之bootstrap十四
手机自动化测试:appium源码分析之bootstrap十四 poptest(www.poptest.cn)是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开 ...
随机推荐
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- 一个key 在10w k/v 找到对应的. (B-tree), 这10w放进B-tree 会有多少层.
B-tree是二叉平衡查找树,相邻两层节点层数不超过1 所有10w 即 2^16=65536 < 10w < 2^17=131072: 会有17层,最多查询17次.
- 软件工程(FZU2015)赛季得分榜,第八回合
目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...
- remove ---会报错discard不会报错
s = {1,2,3,4,5,6,'sn','7'} s.remove('hellfjsdjfsjdfljsdl')#删除元素不纯在会报错 print(s) s.discard("sbbbb ...
- 一些js 插件的作用
前言: 从一些开源网站上下载下来的 后台管理系统模板一般会有很多的js ,其js 的功能是什么呢?这里随手查询了一下,记录下来 正文: 1.zDialog.js 各种弹窗插件详细案例:http://w ...
- 红米3 SudaMod(android_6.01_r72)高配指纹/农历/归属地/SM天气/流畅运行/红外线正常/更新于20161025
一.写在前面 我只是个人爱好,本ROM未集成任何第三方推广软件,我只是喜欢把好的资源分享出来,若可以,我们一起学习,一起进步. 请不要问我怎么刷机! 请不要问我玩游戏卡不卡(有钱你就换好点的手机)! ...
- 表格不被内容撑大,且超出的内容变为省略号(css)
今天写代码,发现表格会被内容撑大,影响到了网页的整体布局. 百度了一解决方法,下面是代码和我的备注 table{table-layout: fixed;} //固定表格 table td ...
- MySQL索引结构--由 B-/B+树看
B-树 B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点.下图是 B-树的简化图. B-树有 ...
- XPath函数——字符串函数(转载)
本文是转载的,原文网址:http://www.cnblogs.com/zhaozhan/archive/2010/01/17/1650242.html 字符串函数主要用来处理字符串.字符串函数主要包括 ...
- 分享一个.NET实现的简单高效WEB压力测试工具
在Linux下对Web进行压力测试的小工具有很多,比较出名的有AB.虽然AB可以运行在windows下,但对于想简单界面操作的朋友有点不太习惯.其实vs.net也提供压力测试功能但显然显得太重了,在测 ...