之前一篇文章中分析了RILD及qcril初始化流程,已经讲过RILD中建立socket服务和接受上层client连接的过程。现在来看下客户端——Phone进程,如何与rild socket建立连接和收发消息。
1. 连接Rild 和消息的接收
开机Phone进程启动后,Ril在PhoneFactory::makeDefaultPhone的时候被创建,并对应着Phone实例的数量,双卡机会有2个RIL各自与Rild关联并各自负责一个卡的业务。
public static void makeDefaultPhone(Context context) {
synchronized (sLockProxyPhones) {
...
//
for (int i = 0; i < numPhones; i++) {
...
//创建RIL实例
sCommandsInterfaces[i] = new RIL(context, networkModes[i], cdmaSubscription, i);
}
//创建Phone实例
for (int i = 0; i < numPhones; i++) {
PhoneBase phone = null;
// int phoneType =
// TelephonyManager.getPhoneType(networkModes[i]);
if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
phone = TelephonyPluginDelegate.getInstance().makeGSMPhone(context, sCommandsInterfaces[i],
sPhoneNotifier, i);
} else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
phone = TelephonyPluginDelegate.getInstance().makeCDMALTEPhone(context, sCommandsInterfaces[i],
sPhoneNotifier, i);
}
sProxyPhones[i] = TelephonyPluginDelegate.getInstance().makePhoneProxy(phone);
}
}
}
以下是RIL.java中定义的与Socket连接有关的成员,有Socket、各自负责收发的2个类实例 和 提供给它们运行的子线程。
public final class RIL extends BaseCommands implements CommandsInterface {
...
//与rild连接的socket
LocalSocket mSocket;
//负责发送消息的线程
HandlerThread mSenderThread;
//实现发送消息的Handler
RILSender mSender;
//负责接收消息的线程
Thread mReceiverThread;
//实现接收消息的类,实现了Runnable
RILReceiver mReceiver;
//保存Request消息列表
Sparse