本文根据插入移动4G单卡到注册4G网络过程的mtklog分析。
插卡动作:
从以上信息无法区分单卡还是双卡,通过ATR参数判断:
注网流程,此过程未开启4G数据连接:
[MS->NW] ESM_MSG_PDN_CONNECTIVITY_REQUEST (PTI:5, EBI:0)
[MS->NW] EMM_Attach_Request(EPS attach type="EMM_ATTACH_TYPE_COMBINED_ATTACH")
[NW->MS] ESM_MSG_ESM_INFORMATION_REQUEST (PTI:5, EBI:0)
[MS->NW] ESM_MSG_ESM_INFORMATION_RESPONSE (PTI:5, EBI:0)
[NW->MS] EMM_Attach_Accept(EPS attach result="EMM_ATTACH_RESULT_COMBINED_ATTACHED")
[NW->MS] ESM_MSG_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST (PTI:5, EBI:5)
[MS->NW] ESM_MSG_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT (PTI:0, EBI:5)
[MS->NW] EMM_Attach_Complete
上报信号强度事件(Ril.cpp):
RILJ 的处理函数(Ril.java):
mSignalStrengthRegistrant 对象的创建(BaseCommands.java):
setOnSignalStrengthUp() 函数在ServiceStateTracker 类的构造函数中调用:
通过传入this,EVENT_SIGNAL_STRENGTH_UPDATE消息由该类或其子类处理,该处理函数在GSMServiceStateTracker 类中:
mSignalStrengthChangedRegistrants 通知者对象的初始化:
向该通知者添加监听对象方法:
分析该方法暂未被调用,所以没有需通知的监听对象。
继续分析onSignalStrengthResult() 函数处理上报的信号:
setGsm() 设置phone标识;isGsm = true,代表Gsm、Lte;否则代表Cdma
函数validateInput() 对信号区间做一个判断:
notifySignalStrength() 更新信号强度:
判断当前信号强度与上次保留的信号强度值,获取信号强度等级:
继续分析PhoneBase 类的 notifySignalStrength() 函数:
mNotifer 是 PhoneNotifer 接口的对象,notifySignalStrength() 方法的实现在 DefaultPhoneNotifier 类中:
方法如下:
mRegistry 对象的创建:
类TelephonyRegistry 继承自 ITelephonyRegistry.Stub,作为Service运行在system_server进程中,它会通知注册者。
上面的DefaultPhoneNotifier运行在com.Android.phone进程中,当信号强度值变化时,通过Service进行通知(service被感兴趣的注册者调用了listen,添加了回调函数。
通知上层信号强度变化。
可参考:http://blog.csdn.net/feitian_666/article/details/52879929