对于Vendor,系统方案提供商,有时候会需要增加AT指令,实现新功能,这时候需要对Ril层增加对底层Modem进行适配(仅对需要消息上报的类型),本人知识有限,只了解到了Ril.java,未对往下的底层有涉及,理解有误请指出。
1、首先要在frameworks/base/telephony/java/com/android/internal/telephony/RILConstants.java里面增加对于的消息上报类型如:int RIL_REQUEST_GSM_BROADCAST_ACTIVATION = 91;
2、当需要对功能进行开关功能设置时,需要在frameworks/opt/telephony/src/java/com/android/internal/telephony/CommandsInterface.java增加相应的注册与取消注册的方法,如:setOn......(), unSetOn.....(),或者registerFor.....(),unRegisterFor......()抽象方法来实现
3、在Ril.java中实现CommandsInterface.java的定义抽象方法;
4、这时候分为两个流程:一个是对数据上报的流程,一个是上层调用注册下发指令;
数据流上报:
1/ 对Ril.java中的processResponse (Parcel p)分类进行处理(processUnsolicited是处理返回的response,processSolicited是处理向下底层发送的Request),如对Case:RIL_REQUEST_GSM_BROADCAST_ACTIVATION进行读取底层的上报数据,并通过notifyRegistrant()通知注册者;
2/ src/java/com/android/internal/telephony/WakeLockStateMachine.java进行事件类型定义,增加WaitingState extends State进行等候消息,同时在processMessage()方法里进行处理;
3/ 在上一步的调用具体的handler方法时就开始进行到了相应的Handler中去处理,
比如CB中的frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/
GsmCellBroadcastHandler.java中进行相应的处理,对于比较复杂的交互情况如短彩信,
这时候在这一层会有比较多的Tracker进行记录,比较繁琐;
指令下发:
1/对于短彩信方面的,在Ril.java之上的一层是IccSmsInterfaceManager.java,再往上是UiccSmsController.java
(这作为一个服务,通过AIDL向上层进行提供接口,它的代理接口为SmsManager.java,一般通过这个类向上提供,
APP也可以直接使用AIDL桥接到Uicc去),就是由此上层一层一层调用到地下去进行发送指令。
所以对于这种类是的开发功能比较复杂,需要Modem,RIL,Framework和APP层多层的交互,
一般厂商没有这么大的实力进行修改,只有系统方案提供商有能力进行修改,只能作为知识的扩展。