第一部分 电话功能概述
  Android的Radio Interface Layer (RIL)提供了电话服务和的radio硬件之间的抽象层。
  Radio Interface Layer RIL(Radio Interface Layer)负责数据的可靠传输、AT命令的发送以及response的解析。应用处理器通过AT命令集与带GPRS功能的无线通讯模块通信。
  AT command由Hayes公司发明,是一个调制解调器制造商采用的一个调制解调器命令语言,每条命令以字母"AT"开头。

  JAVA Framework
代码的路径为:
     frameworks/base/telephony/java/android/telephony
     android.telephony以及android.telephony.gsm

Core native:
在hardware/ril目录中,提供了对RIL支持的本地代码,包括4个文件夹:
hardware/ril/include 
hardware/ril/libril 
hardware/ril/reference-ril 
hardware/ril/rild

kernel Driver
   在Linux内核的驱动中,提供了相关的驱动程序的支持,可以建立在UART或者SDIO,USB等高速的串行总线上。

  第二部分 电话功能各个部分
    hardware/ril/include/telephony/目录中的ril.h文件是ril部分的基础头文件。
  其中定义的结构体RIL_RadioFunctions如下所示:
typedef struct {
    int version;
    RIL_RequestFunc onRequest;
    RIL_RadioStateRequest onStateRequest;
    RIL_Supports supports;
    RIL_Cancel onCancel;
    RIL_GetVersion getVersion;
} RIL_RadioFunctions;
  RIL_RadioFunctions中包含了几个函数指针的结构体,这实际上是一个移植层的接口,下层的库实现后,由rild守护进程得到这些函数指针,执行对应的函数。
几个函数指针的原型为:
typedef void (*RIL_RequestFunc) (int request, void *data,
                                    size_t datalen, RIL_Token t);
typedef RIL_RadioState (*RIL_RadioStateRequest)();
typedef int (*RIL_Supports)(int requestCode);
typedef void (*RIL_Cancel)(RIL_Token t);
typedef const char * (*RIL_GetVersion) (void);
  其中最为重要的函数是onRequest(),它是一个请求执行的函数。

  rild 守护进程的文件包含在hardware/ril/rild目录中,其中包含了rild.c和radiooptions.c两个文件,这个目录中的文件经过编译后生成一个可执行程序,这个程序在系统的安装路径在:
/system/bin/rild
   rild.c是这个守护进程的入口,它具有一个主函数的入口main,执行的过程是将请求转换成AT命令的字符串,给下层的硬件执行。在运行过程中,使 用dlopen 打开路径为/system/lib/中名称为libreference-ril.so的动态库,然后从中取出 RIL_Init符号来运行。
  RIL_Init符号是一个函数指针,执行这个函数后,返回的是一个RIL_RadioFunctions类型的指针。得到这个指针后,调用RIL_register()函数,将这个指针注册到libril库之中,然后进入循环。
  事实上,这个守护进程提供了一个申请处理的框架,而具体的功能都是在libril.so和libreference-ril.so中完成的。

  2.2 libreference-ril.so动态库

libreference-ril.so动态库的路径是:
hardware/ril/reference-ril
其中主要的文件是reference-ril.c和atchannel.c。这个库必须实现的是一个名称为RIL_Init的函数,这个函数执行的结果是返回一个RIL_RadioFunctions结构体的指针,指针指向函数指针。
这个库在执行的过程中需要创建一个线程来执行实际的功能。在执行的过程中,这个库将打开一个/dev/ttySXXX的终端(终端的名字是从上层传入的),然后利用这个终端控制硬件执行。

  2.3 libril.so动态库
  libril.so库的目录是:
hardware/ril/libril 
  其中主要的文件为ril.cpp,这个库主要需要实现的以下几个接口为:
RIL_startEventLoop(void);
void RIL_setcallbacks (const RIL_RadioFunctions *callbacks);
RIL_register (const RIL_RadioFunctions *callbacks);
RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
                                size_t datalen);
RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
                                const struct timeval *relativeTime);
   这些函数也是被rild守护进程调用的,不同的vendor可以通过自己的方式实现这几个接口,这样可以保证RIL可以在不同系统的移植。其中 RIL_register()函数把外部的RIL_RadioFunctions结构体注册到这个库之中,在恰当的时候调用相应的函数。在执行的过程中, 这个库处理了一些将请求转换成字符串的功能。

detail info : http://blog.chinaunix.net/u/22630/article_105768.html

Android telephone相关推荐

  1. android 微信缩小通话界面_Android仿微信多人音视频通话界面

    工作中需要实现一个类似微信多人视频通话功能的界面,分别使用自定义viewgroup和自定义layoutmanager的方式进行了实现.最终工作中采用了layoutmanager,因为可以使用paylo ...

  2. Writeup of Android02(android) in WhaleCTF

    先甩链接Android02 老套路,直接把Android02扔进AndroidKiller,得到整个工程的反汇编代码.随后用jd-gui查看MainActivity的java代码-- package ...

  3. Android 7.0 挂断电话流程分析

    1.图形显示 挂断电话分为本地挂断和远程对方挂断 2.本地挂断 1).点击按钮 先看按键的监听事件 CallCardFragment.java 中有对按钮的监听事件 @Overridepublic v ...

  4. 仿微信多人音视频通话界面

    工作中需要实现一个类似微信多人视频通话功能的界面,分别使用自定义viewgroup和自定义layoutManager的方式进行了实现.最终工作中采用了layoutManager,因为可以使用paylo ...

  5. android用于查询数据的方法,android: SQLite查询数据

    掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了.不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作. 我们都知道 SQL 的全称是 Structured ...

  6. Android ContentProvider、ContentResolver和ContentObserver的使用

    1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之中的一个,可见它在Android中的作用非 ...

  7. 关闭Android/iPhone浏览器自动识别数字为电话号码

    iPhone上的Safari(还有些webkit android手机浏览器)会自动对看起来像是电话号码的数字串(包括已经加入连字符或括号格式化过的)添加电话链接,点击之后会询问用户是否想要拨打该号码. ...

  8. android异步线程利用Handler将消息发送至UI线程

    android UI线程安全 首先对于android而言,UI线程就是我们的主线程,在Android应用启动时,会自动创建一个线程,主线程负责UI的展示.UI事件消息的派发处理等等,因此主线程也叫做U ...

  9. 1px问题在ios与android,IOS安卓常见问题

    一.IOS自带safari浏览器 1.safari不支持fixed+input输入框. 解决方案: http://www.haorooms.com/post/ios_fixed_input 2.saf ...

最新文章

  1. 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
  2. 连表查询使用in_SQL 组合查询
  3. [译]如何在.NET Core中使用System.Drawing?
  4. java get null_java 获取对象中为null的字段实例代码
  5. 信息学奥赛一本通(1183:病人排队)
  6. 三层架构+ajax分页实例,ASP.NET存储过程实现分页效果(三层架构)
  7. isscalar matlab,大数的素性检测(用MATLAB仿真)
  8. 原生JavaScript(js)手把手教你写轮播图插件(banner)
  9. securecrt安装mysql_centos安装mysql(for 小白)
  10. jdbc学习笔记3,blob类型数据的操作,preparedstatement的批量操作,数据库的事务,以及事务的特性,隔离权限的修改
  11. ISM模型的MATLAB代码
  12. 使用Access-Control-Allow-Origin解决跨域
  13. 联想微型计算机安装Win7,联想一体机如何安装win7_联想一体机怎么使用u盘重装win7...
  14. Java实现猜拳小游戏
  15. 裁员此起彼伏,铁饭碗在哪里?
  16. C基础学习笔记——01-C基础第02天(用户权限、VI操作、Linux服务器搭建)
  17. 计算机网络技术的研究现状,计算机网络技术发展研究
  18. stm32f103c8t6调试-while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET );卡死
  19. Java中的多线程安全问题
  20. 4、树莓派音频——jackd命令应用

热门文章

  1. 三、Scikit-learn机器学习框架
  2. Win11本地连接怎么没有了?Win11网络连接不见了解决方法
  3. DUBBO ADMIN管理页面搭建
  4. 机器学习(8)sklearn画决策树(回归树)
  5. CART回归树及其实战
  6. NTFS、FAT、ExFAT的优缺点
  7. linux下的有名管道文件读写操作
  8. css盒子模型 浮动
  9. 关于多媒体计算机的手抄报,有关科技的手抄报图片大全
  10. 荔枝IPO背后,还有4个大坑待填