RIL层
RIL 首先这个是用来和CP(基带处理器)通信。可以把他看成是硬件层的抽象,这里的硬件当然是各式各样的模块,比如wcdma, gsm, evdo等等。这样ril上层即telephony就无需关心当前是何种模块,比如我要拨出一个电话,我只要下发一个请求号为RIL_REQUEST_DIAL的请求即可,无需关心发送什么AT命令,这是软件思想中隔离变化的体现。
【硬件抽象层,控制mode端,RIL则是将虚拟电话系统的标准功能转换成实际的所使用的Modem的AT指令 telephony 与ril层通过unix domain socket通信
/framework/base/telephony/java/com/android/internal/telephony/RIL.java】
RILD
是RIL(Radio Interface Layer) Deamon的简称。通过过socket将请求发送给RILD的消息循环,消息循环则将请求转发给底层通信模块(直接调用底层的库)来实现对通信模块功能的调用。反之,当通信模块有类似于来电的消息时,也会通过RILD的回调,将信息包装成消息,发送到RILD的消息循环中去处理,最后通过socket送给telephony
短信接收
从/framework/base/telephony/java/com/android/internal/telephony/RIL.java看起。
发送短信和接收短信是通过Receiver和Sender架构。这里讲Receiver。
class RILReceiver implements Runnable{ ...... public void run() { ....... try { for (;;) { LocalSocket s = null; LocalSocketAddress l; ....... ........ try { s = new LocalSocket(); l = new LocalSocketAddress(socketRil, LocalSocketAddress.Namespace.RESERVED); s.connect(l); ....... InputStream is = mSocket.getInputStream(); for (;;) { Parcel p; length = readRilMessage(is, buffer); if (length < 0) { // End-of-stream reached break; } p = Parcel.obtain(); p.unmarshall(buffer, 0, length); p.setDataPosition(0); //Log.v(LOG_TAG, "Read packet: " + length + " bytes"); processResponse(p); p.recycle(); .......... }
通过socket获取数据后,最后交给了processResponse(p);
private void processResponse (Parcel p) { int type; type = p.readInt(); if (type == RESPONSE_UNSOLICITED) { processUnsolicited (p); } else if (type == RESPONSE_SOLICITED) { processSolicited (p); } releaseWakeLockIfDone(); }
这里有2种type.一种是主动上报,比如网络状态,短信,来电等都不需要经过请求,用unsolicited词语专门描述。RESPONSE_SOLICITED是必须先请求然后才响应的类型。当然这里是短信接收肯定会走前者。processUnsolicited该方法会根据当前的请求的类型,如果是短信则是RIL_UNSOL_RESPONSE_NEW_SMS,以下是其调用的代码;
case RIL_UNSOL_RESPONSE_NEW_SMS: {
if (RILJ_LOGD) unsljLog(response);
// FIXME this should move up a layer
String a[] = new String[2];
a[1] = (String)ret;
SmsMessage sms;
sms = SmsMessage.newFromCMT(a);
if (mSMSRegistrant != null) {
mSMSRegistrant
.notifyRegistrant(new AsyncResult(null, sms, null));
}
break;
}
因为 RIL extends BaseCommands 。其中mSMSRegistrant为BaseCommands 中的对象。 追踪.notifyRegistrant(new AsyncResult(null, sms, null));会发现
void internalNotifyRegistrant (Object result, Throwable exception) { Handler h = getHandler(); if (h == null) { clear(); } else { Message msg = Message.obtain(); msg.what = what; msg.obj = new AsyncResult(userObj, result, exception); h.sendMessage(msg); } }
发送了一条mesage对象。而哪里接收这条消息并处理呢? 在BaseCommands 中查看mSMSRegistrant的实例化会发现。
public void setOnNewSMS(Handler h, int what, Object obj) {。。。}
其中的handler h 就是接收message并处理的handler.追踪setOnNewSMS会发现最后是在
mCm.setOnNewSMS(this, EVENT_NEW_SMS, null);
framework/base/telephony/java/com/android/internal/telephony/SMSDispatcher.java中实现。
SMSDispatcher就是继承handler.所以处理函数为
@Override public void handleMessage(Message msg) { .... switch (msg.what) { case EVENT_NEW_SMS: .... SmsMessage sms; ar = (AsyncResult) msg.obj; ...... sms = (SmsMessage) ar.result; try { int result = dispatchMessag(sms.mWrappedSmsMessage); ........ } }
追踪dispatchMessag实现,会在GsmSMSDispatch和CdmaSMSDispatch中实现。这里只看GsmSMDispatch.经过dispatchNormalMessage,经一系列的判断处理最后普通短信将交给dispatchPdus(pdus);这个方法处理.
protected void dispatchPdus(byte[][] pdus) { Intent intent = new Intent(Intents.SMS_RECEIVED_ACTION); intent.putExtra("pdus", pdus); dispatch(intent, "android.permission.RECEIVE_SMS"); } void dispatch(Intent intent, String permission) { mWakeLock.acquire(WAKE_LOCK_TIMEOUT); mContext.sendOrderedBroadcast(intent, permission, mResultReceiver, this, Activity.RESULT_OK, null, null); }
【注:在dispatchPdus方法内,就可以处理防火墙相关事件。让他不发出接收到短信的广播】
然后短信app中PrivilegedSmsReceiver广播接收器接收到广播后会调用onReceiveWithPrivilege方法.此时进入APP层。
packages/apps/Mms/src/com/android/mms/transaction/PrivilegedSmsReceiver
intent.setClass(context, SmsReceiverService.class); intent.putExtra("result", getResultCode()); beginStartingService(context, intent);
启动SmsReceiverService。跟踪源码可以看到如下代码
private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } ...... if (MESSAGE_SENT_ACTION.equals(intent.getAction())) { handleSmsSent(intent, error); } else if (SMS_RECEIVED_ACTION.equals(action)) { handleSmsReceived(intent, error); } else if (ACTION_BOOT_COMPLETED.equals(action)) { handleBootCompleted(); } else if (TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(action)) { handleServiceStateChanged(intent); } else if (ACTION_SEND_MESSAGE.endsWith(action)) { handleSendMessage(intent); } }
接收短信会走 handleSmsReceived(intent, error); 函数
private void handleSmsReceived(Intent intent, int error){ ...... Uri messageUri = insertMessage(this, intent, error, format); ...... if (messageUri != null) { MessagingNotification.blockingUpdateNewMessageIndicator(this, true, false); } else { SmsMessage sms = msgs[0]; SmsMessage msg = SmsMessage.createFromPdu(sms.getPdu()); CharSequence messageChars = msg.getMessageBody(); String message = messageChars.toString(); if (!TextUtils.isEmpty(message)) { MessagingNotification.notifyClassZeroMessage(this, msgs[0] .getOriginatingAddress()); } ...... }
这里做了2个操作。 insertMessage 插入数据库。插入成功后提示用户blockingUpdateNewMessageIndicator。插入失败也通知用户notifyClassZeroMessage