首先抓Ril log,然后从log信息中抓取有用信息
因为异常出现中SET_NETWORK,所以,查看Ril.java中查看在调用send(rr);
之前打的logLog输出语句为:
riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
所以,有如下log
D/RILJ ( 871): [6091]> RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT 46001 2
...
E/RILJ ( 871): Hit EOS reading message length
I/RILJ ( 871): Disconnected from 'rild' socket
D/RilRequest( 800): [7064]< RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT error: com.android.internal.telephony.CommandException: RADIO_NOT_AVAILABLE ret=
从以上log可以看出request使得rild socket disconnected造成了ril的异常。
所以,需要分析RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT,大体已经可以看出是此命令在rild层的处理异常。
第一步,在Ril Java层
在RILConstants.java中,可以搜到:
<pre name="code" class="java">int RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT = 120;
第二部,在Rild层
在ril.h中定义了RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT宏,值是127
#define RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT 127
显然这个是不能匹配的,因为根据Ril request原理,ril java层发下的命令必须在s_commands[]中找到对应的处理函数指针。
那我们把RILConstants.java中RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT改成127。
调试发现,虽然不会报Disconnected from 'rild' socket的错误,但是还是不能正常处理set network的功能。继续往下看,发现供应商代码中,有
int RAPIDRIL_TO_RIL[] = {
RIL_REQUEST_GET_SIM_STATUS,
...
RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_EXT,
RIL_REQUEST_SEND_AUDIO_AT_COMMAND,
};
int MapVendorRequestIdToRil(UINT32 uiRRILRequestId)
{
return RAPIDRIL_TO_RIL[uiRRILRequestId];
}
在函数MapVendorRequestIdToRil中,是使用上层传入的uiRRILRequestId来取得数组中第uiRRILRequestId位置的值,显然,这个值不是想要的值,
RAPIDRIL_TO_RIL[]中的第127个位置的值不是程序想要的。
所以,应该调整Nd_util.cpp、RILConstants.java和ril.h中的宏定义顺序一致,值一致。