2010年5月7日 星期五

Android2.1 Message 從頂層到底層架構flow(2)

媽的我這樣寫真是前無古人後無來者
來吧,上面的framework丟到parcel裡面去
RILRequest初始化的時候,會連接名為rild的socket(也就是rild中s_listen_event綁定的socket),初始化數據傳輸的通道.
rr.mp 是Parcel對象,Parcel是一套簡單的序列化協議,用於將對象(或對象的成員)序列化成字節流,以供傳遞參數之用.這裡可以看到String address和int clirMode都是將依次序列化的成員.在這之前,rr初始化的時候,request號跟request的序列號(自動生成的遞增數),已經成為頭兩個 將被序列化的成員.這為後面的request解析打下了基礎.
接下來是send到handleMessage的流程,send將rr直接傳遞給另 一個線程的handleMessage,handleMessage執行data = rr.mp.marshall()執行序列化操作, 並將data字節流寫入到rild socket.
csdn的opendroid專欄的GSM驅動模塊rild詳細分析
看看就好,從CSDN的opendroid專欄寫過來的上面那一段,不過他是寫dial流程啦,message我還沒寫呢!正要開始,看官注意了!
進入
hardware/ril/libril/ril_event.cpp
------->
n = select(nfds, &rfds, NULL, NULL, ptv);
------->
firePending();
------->
ev->func(ev->fd, 0, ev->param);
------->
ev->func = func;
------->
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param)
------>
hardware/ril/libril/ril.cpp
------->
static void listenCallback (int fd, short flags, void *param)
上面階段都是listenCallback在調用的=="
------->
ril_event_set (&s_commands_event, s_fdCommand, 1,processCommandsCallback, p_rs);
------->
static void processCommandsCallback(int fd, short flags, void *param)
------->
processCommandBuffer(p_record, recordlen);
------->
RequestInfo *pRI
------->
typedef struct RequestInfo {
int32_t token; //this is not RIL_Token
CommandInfo *pCI;
struct RequestInfo *p_next;
char cancelled;
char local; // responses to local commands do not go back to command process
} RequestInfo;
------->
這裡的pRI就是一個RequestInfo結構指針, 從socket過來的數據流, 前面提到是Parcel處理過的序列化字節流, 這裡會通過反序列化的方法提取出來. 最前面的是request號, 以及token域(request的遞增序列號). 我們更關注這個request號, 前面提到, 上層和rild之間, 這個號是統一的. 它的定義是一個包含ril_commands.h的枚舉, 在ril.cpp中
------->
static CommandInfo s_commands[] = {
#include "ril_commands.h"
};
------->
typedef struct {
int requestNumber;
void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
int(*responseFunction) (Parcel &p, void *response, size_t responselen);
} CommandInfo;
------->
pRI->pCI->dispatchFunction(p, pRI);
對照表在ril_commands.h
找我們message的
{RIL_REQUEST_SEND_SMS, dispatchStrings, responseSMS}
走dispatchStrings
------->
static void dispatchString (Parcel& p, RequestInfo *pRI)
------->
s_callbacks.onRequest(pRI->pCI->requestNumber, string8, sizeof(char *), pRI)
------->
/hardware/ril/reference-ril/reference-ril.c
------->
onRequest (int request, void *data, size_t datalen, RIL_Token t)
------->
case RIL_REQUEST_SEND_SMS:
requestSendSMS(data, datalen, t);
break;
------->
requestSendSMS(void *data, size_t datalen, RIL_Token t)
------->
hardware/ril/reference-ril/atchannel.c
------->
at_send_command_sms(cmd1, cmd2, "+CMGS:", &p_response);
------->
at_send_command_full
------->
at_send_command_full_nolock
------->
err = writeline (command);
寫下去吧= =
------->
written = write (s_fd, s + cur, len - cur);
=======>

tired= =..

沒有留言: