• 1. 2011.2Android RIL 概述
  • 2. 概要1) 如何修改一个RIL命令(不推荐) 破坏了Android对外的接口 2) 如何添加一个RIL命令
  • 3. RIL相关文件Framework: RILConstants.java - 定义了java层用的RIL命令号常数 RIL.java – java层RIL的实现 C lib: Ril.h – 定义了C层的RIL命好常数 Viatelecom-withuim-ril.c – ril的具体实现,设计AT的使用
  • 4. 修改RIL命令以发送短信的RIL命令为例 RIL_REQUEST_CDMA_SEND_SMS 从Gingerbread中的ril.h文件可以查看该命令: 用途 : Send a CDMA SMS message Data : const RIL_CDMA_SMS_Message * Response : const RIL_SMS_Response *
  • 5. 修改RIL命令Data与Response: 在ril_command.h文件中可以看到对应的代码如下: {RIL_REQUEST_CDMA_SEND_SMS, dispatchCdmaSms, responseSMS}, 其中dispatchCdmaSms和reponseSMS是函数指针 具体定义请看ril.cpp中的定义: static CommandInfo s_commands[] = { #include "ril_commands.h"};
  • 6. 修改RIL命令 修改RIL_REQUEST_CDMA_SEND_SMS命令 在kunlun中,短信pdu编码放到了framework中,因此需要修改data参数为简单的string即可. 修改步骤: 1) 修改ril.java中对应命令的函数sendCdmaSms 2) 修改ril_commands.h中对应的数组元素 3) 修改vendor-ril.c中对应的requestSendCdmaSMS函数 [如果response也有修改,则不要遗漏reponse部分的修改]
  • 7. 修改RIL命令修改RIL命令不推荐: 1) 修改了RIL命令则会涉及到修改RIL.java中相对应函数的修改. 2) RIL.java中的函数是Android中telephony部分供其他模块使用的接口 3) 对RIL.java的修改会牵扯到使用这个函数所有地方的修改,至少需要检查其他使用的地方有没有影响.
  • 8. 添加RIL命令在进行Kunlun项目的过程中,遇到了增加RIL命令的需求情况.一般是由于: 使用的CP的具体特性没有对应的定义的RIL命令造成的.
  • 9. 添加RIL命令以RIL_UNSOL_RESPONSE_READ_NEW_SMS_STATUS_REPORT RIL命令为例介绍如何添加一个RIL命令. [下发RIL命令与上报RIL命令: 以RIL_REQUEST开头的RIL命令是下发RIL命令.命令由Framework主动发向RIL 以RIL_UNSOL开头的RIL命令是上报RIL命令.当CBP收到来电或新短信后,通过这类命令及时上报Framework]
  • 10. 添加RIL命令首先需要定一个新的RIL命令号. 在RILConstant.java中增加 int RIL_UNSOL_RESPONSE_READ_NEW_SMS_STATUS_REPORT = 1030; 在Ril.h中增加 #define RIL_UNSOL_RESPONSE_READ_NEW_SMS_STATUS_REPORT 1030 在这里需要注意两点: 1) 不要漏掉RILConstant.java中的命令号常数 2) 在Ril.h和RILConstant.java中的命令号一定要相同
  • 11. 添加RIL命令定义好命令号之后,需要定义命令的参数 上报的参数定义为 const int * - index to read status in ME 确定好参数的意义和类型之后,需要在ril_unsol_commands.h中实现定义 {RIL_UNSOL_RESPONSE_READ_NEW_SMS_STATUS_REPORT, responseInts, WAKE_PARTIAL}, 在这里通过responseInts将index进行上报
  • 12. 添加RIL命令实现RIL命令 定义好自定义的RIL命令之后,需要实现该命令的功能,这部分代码是在vendor-ril.c中进行实现的. RIL_onUnsolicitedResponse ( RIL_UNSOL_RESPONSE_READ_NEW_SMS_STATUS_REPORT, index, sizeof(index)); 通过上述函数可以将获取的信息[index值]上报到Framework中
  • 13. 添加RIL命令Java层的实现: 上报的信息传递到Framework之后,需要在ril.java中添加相应的实现代码. 在processUnsolicited中添加如下case语句 case RIL_UNSOL_RESPONSE_READ_NEW_SMS_STATUS_REPORT: ret = responseInts(p); break; 在这里使用responseInts是因为在定义这个RIL命令时就已经约定好该命令上报的数据为Int类型.
  • 14. 添加RIL命令取到上报的信息之后,在processUnsolicited函数的另一个switch-case中就可以对获取的信息进行处理了.例如: case RIL_UNSOL_RESPONSE_READ_NEW_SMS_STATUS_REPORT: int[] index = new int[1]; index = (int[])ret; readSmsStatusReport(index[0], null); break; 或者如新短信上报: if (RILJ_LOGD) unsljLog(response); SmsMessage sms = (SmsMessage) ret; if (mSMSRegistrant != null) { mSMSRegistrant .notifyRegistrant(new AsyncResult(null, sms, null)); } break; 将新短信继续上报到framework的telephony层中.
  • 15. 添加RIL命令添加RIL命令总结: 定义个RIL命令使用的命令号 确定该命令所使用的参数 在vendor-ril.c中实现该ril命令功能 在ril.java中实现对应数据解析传递的代码.
  • 16. 添加RIL命令添加RIL命令似乎比修改RIL命令更合适,理由如下: 1) 不会对Android现有的接口造成影响 如果在不提供源码的情况下,改动是否提供给客户可以由自己决定 添加一些特殊的RIL命令便于功能的实现
  • 17. 添加RIL命令添加RIL命令注意事项: RIL命令的命令号不要与现有命令号重复 Ril.h和RILConstant中的命令号一定要对应 在ril_commands.h和ril_unsol_commands中添加相应的数组元素时,添加的元素的位置一定要和在ril.h中添加的位置相一致. ★
  • 18. Thank you!