a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 61|回复: 0

[综合辅导] Linux认证辅导Android电话功能深入探讨

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证辅导Android电话功能深入探讨9 A- e2 t: t- A# R# U. C
Android手机操作系统是一款基于Linux平台的开源系统。开发人员可以根据不同的需求对其进行修改等操作。在这系统中有很多比较重要的功能值得我们去研究。比如Android电话功能就是其中一个基础知识点。0 v# R$ o# n, R9 m
第一部分 Android电话功能概述
# b5 w1 Z2 p: R3 ^$ xAndroid的Radio Interface Layer (RIL)提供了电话服务和的radio硬件之间的抽象层。1 {5 p) D, ^9 z$ N' R0 i5 r7 x
Radio Interface Layer RIL(Radio Interface Layer)负责数据的可靠传输、AT命令的发送以及response的解析。应用处理器通过AT命令集与带GPRS功能的无线通讯模块通信。6 L1 S, K  ^& ]9 P# g: |
AT command由Hayes公司发明,是一个调制解调器制造商采用的一个调制解调器命令语言,每条命令以字母“AT”开头。- k5 V* P2 ]0 t1 a/ a
JAVA Framework
+ n  z* l4 j- _, T- P代码的路径为:' j0 R$ J+ E2 E' @; a' Z
frameworks/base/telephony/java/android/telephony
: A. d3 w  i( E0 Candroid.telephony以及android.telephony.gsm
6 a' p* D! f1 h: _/ A+ V) ~Core native:
% n4 I- D& o* ?在hardware/ril目录中,提供了对RIL支持的本地代码,包括4个文件夹:
6 a. W$ [# f9 U* {5 f2 [1.hardware/ril/include
. |0 r6 v- N" D+ w7 `5 W1 I) Z3 [2.hardware/ril/libril
& q0 a4 p* e7 u6 q7 _3.hardware/ril/reference-ril
! G7 c  `0 j5 W8 H$ Y/ B& |: s* v0 ?4.hardware/ril/rild) R' R/ T6 G" w5 d+ h6 n
kernel Driver3 j$ p8 {1 c2 s/ o2 @! R9 r& d4 d% l8 c, J
在Linux内核的驱动中,提供了相关的驱动程序的支持,可以建立在UART或者SDIO,USB等高速的串行总线上。% ?; w2 s9 S4 \1 o5 F6 Z- y8 O
第二部分 Android电话功能各个部分
4 m. d$ r; S6 G: }hardware/ril/include/telephony/目录中的ril.h文件是ril部分的基础头文件。
( t" j8 q8 `% [) d4 Z其中定义的结构体RIL_RadioFunctions如下所示:
- n$ h& |0 [0 T9 A1.typedef struct {1 p8 }- g# a: h' S
2.int version;
1 d# |; |) V6 Z/ m3.RIL_RequestFunc onRequest;0 ^8 C9 G+ g0 `
4.RIL_RadioStateRequest onStateRequest;
+ R7 d1 r4 X, g: _* s$ ?! G. A5.RIL_Supports supports;" R3 M5 W- f0 L; z8 q
6.RIL_Cancel onCancel;7 q0 U; {+ {1 ^' P
7.RIL_GetVersion getVersion;
  a5 Q6 Z0 j! F# R3 v% j8.} RIL_RadioFunctions;! h0 Y0 L! |2 D) }
RIL_RadioFunctions中包含了几个函数指针的结构体,这实际上是一个移植层的接口,下层的库实现后,由rild守护进程得到这些函数指针,执行对应的函数。9 h3 N  |( n0 l# w. u
几个函数指针的原型为:5 E& O- f( t" v" {
1.typedef void (*RIL_RequestFunc) (int request, void *data,2 C9 ]; q4 q& U. [8 x7 N
2.size_t datalen, RIL_Token t);
: K" X& M2 z+ V. P  U* K' [3.typedef RIL_RadioState (*RIL_RadioStateRequest)();- W( W( f3 q$ L8 U$ j
4.typedef int (*RIL_Supports)(int requestCode);* H( @% V4 c% T7 P
5.typedef void (*RIL_Cancel)(RIL_Token t);/ U5 D  t4 x* O, d" E2 e
- O# u# z- U; @- E% m
8 c. z5 C4 s0 f8 K9 X; q
6.typedef const char * (*RIL_GetVersion) (void);
; F+ Y6 P; J3 V3 b$ O% p; b, B其中最为重要的函数是onRequest(),它是一个请求执行的函数。7 T6 ^3 v* D$ P6 J# V
2.1 rild守护进程' t( A1 Z6 k* C5 |# D) |  R# s
rild 守护进程的文件包含在hardware/ril/rild目录中,其中包含了rild.c和radiooptions.c两个文件,这个目录中的文件经过编译后生成一个可执行程序,这个程序在系统的安装路径在:
& D/ Z; b( L8 [3 a7 B/system/bin/rild
5 P1 {6 d/ ], j" @/ Lrild.c是这个守护进程的入口,它具有一个主函数的入口main,执行的过程是将请求转换成AT命令的字符串,给下层的硬件执行。在运行过程中,使用dlopen 打开路径为/system/lib/中名称为libreference-ril.so的动态库,然后从中取出 RIL_Init符号来运行。
' }5 c5 h: I0 e3 T" ~RIL_Init符号是一个函数指针,执行这个函数后,返回的是一个RIL_RadioFunctions类型的指针。得到这个指针后,调用RIL_register()函数,将这个指针注册到libril库之中,然后进入循环。
; H" O) ]1 u" ~+ B- P+ O( o事实上,这个守护进程提供了一个申请处理的框架,而具体的功能都是在libril.so和libreference-ril.so中完成的。+ }( R0 C0 ^: P- B1 j3 ?
2.2 libreference-ril.so动态库
& y; E, U6 P. K$ `3 tlibreference-ril.so动态库的路径是:
; `9 c# a3 U) g. y5 a: xhardware/ril/reference-ril
& G5 z$ z4 a" \7 g: K& `9 Y, v# ?其中Android电话功能主要的文件是reference-ril.c和atchannel.c。这个库必须实现的是一个名称为RIL_Init的函数,这个函数执行的结果是返回一个RIL_RadioFunctions结构体的指针,指针指向函数指针。0 J9 E& y5 T9 k+ s% L& ?
这个库在执行的过程中需要创建一个线程来执行实际的功能。在执行的过程中,这个库将打开一个/dev/ttySXXX的终端(终端的名字是从上层传入的),然后利用这个终端控制硬件执行。
( N9 f6 y/ I: u/ \; ?9 i2.3 libril.so动态库
# q6 R2 l) H: t+ Q/ j8 `' Xlibril.so库的目录是:
2 l# X1 b4 ?% Bhardware/ril/libril% T4 h/ |7 s* S+ R; }
其中主要的文件为ril.cpp,这个库主要需要实现的以下几个接口为:' N2 B- U8 W* u7 T# R2 |1 T6 f
1.RIL_startEventLoop(void);
) A7 o' y) r; z5 y2.void RIL_setcallbacks (const RIL_RadioFunctions *callbacks);  B, E. p7 |  C3 {0 N  u1 r
3.RIL_register (const RIL_RadioFunctions *callbacks);
/ v9 w( j% H4 I7 y+ f4.RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response,4 K4 h& D3 y" d  y, \
size_t responselen);
& u6 p+ E" ?2 I4 U7 {/ h. ]5.void RIL_onUnsolicitedResponse(int unsolResponse, void *data,& c6 x" L  D  ~  K
6.size_t datalen);0 f' F, q* h0 G- R
7.RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,3 I' M3 E% `: r" c; n$ g" J, D
8.const struct timeval *relativeTime);
3 i& f8 o+ O3 r7 L+ ~这些函数也是被rild守护进程调用的,不同的vendor可以通过自己的方式实现这几个接口,这样可以保证RIL可以在不同系统的移植。其中 RIL_register()函数把外部的RIL_RadioFunctions结构体注册到这个库之中,在恰当的时候调用相应的函数。在Android电话功能执行的过程中,这个库处理了一些将请求转换成字符串的功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-21 12:23 , Processed in 0.188391 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表