AndroidSensor传感器系统架构初探.docx
- 文档编号:7962706
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:13
- 大小:39.99KB
AndroidSensor传感器系统架构初探.docx
《AndroidSensor传感器系统架构初探.docx》由会员分享,可在线阅读,更多相关《AndroidSensor传感器系统架构初探.docx(13页珍藏版)》请在冰豆网上搜索。
AndroidSensor传感器系统架构初探
AndroidSensor传感器系统架构初探
分类:
Android系统2010-10-1510:
195438人阅读评论(16)收藏举报
1.体系结构
2.数据结构
3.四大函数
本文以重力感应器装置G-sensor为例探索Android的各层次结构。
1.体系结构
Android的体系结构可分为4个层次。
却户空间
JqiraJ立用程序
JavaFiajwgm电军尽
SeniO'A•居褶眼r护借
JNI
停‘】cf‘口•L'ia•"沸占QS占i*9。
七『cpp
comBEE祖&却仲睥冷.瞻48
内槟空向
AartEr设备抠;tl程序
i)trar:
e.(-
硬牛
•第一层次底层驱动层,包括标准Linux,Android核心驱动,Android相关设备
驱动,G-sensor的设备驱动程序即存在于此
•第二层次Android标准C/C++库,包括硬件抽象层,Android各底层库,本地库,JNI
•第三层次AndroidJavaFramwork框架层
•第四层次Java应用程序
本文重点关注硬件抽象层,JNI以及Framework。
1.1硬件抽象层
硬件抽象层通过例如open(),read(),write(),ioctl(),poll()等函数调用的方式,与底层设
备驱动程序进行交互,而这些函数调用是底层设备驱动程序事先准备好的。
用于交互的关键是文件描述符fd,fd通过open()打开G-sensor设备节点而得到,即fd
=open("/dev/bma220",O_RDONLY);而/dev/bma220这个设备节点是在底层设备驱动中
注册完成的。
其他的函数调用如read(),write()等都通过该文件描述符fd对G-sensor设备进行操作。
1.2JNI(JavaNativeInterface)
JNI层可以认为是整个体系结构中的配角,概括地讲,它就完成了一项任务,既实现从
C++语言到Java语言的转换。
JNI层为JavaFramework层提供一系列接口,而这些接口函数的具体实现中,利用例如module->methods->open(),sSensorDevice->data_open(),sSensorDevice->poll()等回调函数与硬件抽象层进行交互。
而这些open(),poll()回调函数在硬件抽象层中具体实现。
1.3JavaFramework
Framework层提供各种类和类的对象,可作为系统的守护进程运行,也可供上层应用程序的使用。
例如类SensorManager,它作为系统的守护进程在初始化的时候开始运行,其子类SensorThread中的子类SensorThreadRunnable通过sensors_data_poll()实现了对G-sensor数据的轮训访问,而sensors_data_poll()通过JNI层转换到硬件抽象层去具体实现poll()。
2数据结构
一般境况下,硬件抽象层对硬件的描述都分为control和data两大类。
2.1sensors_control_context_t
structsensors_control_context_t{
structsensors_control_device_tdevice;
intfd;
};
structsensors_control_device_t(
structhw_device_tcommon;
int(*open_data_source)(structsensors_control_device_t*dev);
int(*activate)(structsensors_control_device_t*dev,inthandle,intenabled);
int(*set_delay)(structsensors_control_device_t*dev,int32_tms);
int(*wake)(structsensors_control_device_t*dev);
};
2.2sensorsdatacontextt
structsensors_data_context_t(
structsensors_data_device_tdevice;
intfd;
};
structsensors_data_device_t(
structhw_device_tcommon;
int(*data_open)(structsensors_data_device_t*dev,intfd);
int(*data_close)(structsensors_data_device_t*dev);
int(*poll)(structsensors_data_device_t*dev,
sensors_data_t*data);
}
structhw_device_t(
uint32_ttag;uint32_tversion;
structhw_module_t*module;
int(*close)(structhw_device_t*device);
};
structhw_module_t(
uint32_ttag;uint16_tversion_major;uint16_tversion_minor;
constchar*id;constchar*name;constchar*author;
structhw_module_methods_t*methods;
};
structhw_module_methods_t(
int(*open)(conststructhw_module_t*module,constchar*id,
structhw_device_t**device);
};
下文将通过对(*open),(*open_data_source),(*data_open)和(*poll)的代码分析,探索Android的各层次架构。
3四大函数
3.1module->methods->open()
Framework
classSei
图Su料public
_ser}pjblic
retur
}
.睫nsisensr
)
isoiSeiviceextendsISensorService.Stub(
iressWarningsCuriusetT1)
ensorServite(Contextcontext)!
3ar5_Gontroi_'n^0.
?
atcelFileDeccriptorgeiDataCharielQthrowsRemoteExceptlor(3_£ahsors_contfcil_open^;
rs_control_actlvate(sensor,true).
驾.controI_eet_de\a^minDelay);
ir&_control_wake(>;
staticJN>JatlveMethod={
f_S6ors_Control_inift・QF;(void*)android_iriit}h
r_sensors_control_open',"OLandKjid/osTarcalFileDe&criptor',(void*)android_apen},f'_sensor3_controi_activate',"(1^7*iandrold_adivaie},f'_sensors_contrcrl_wake^,.戈伫(void*)andr□id_data_wake},
rLeerst)rs_controLsetd^la/;'CI)I"(araroid-SeLdelav),
staticjint:
m巾加_iTit(JhllEnv*env,jclassclas)
{-
sensors_mociule_t*rriodule;
ifQiw.geLnnodu^Csensors",(consthw_madlji&nn□dule)二二05(
ifCifeiisorS-ContruLopen^nnadJle-scamnnDn.fisSensorDevice)==0)-[conststructs?
ri3ar_t*list;
irtcounrt=mciduget_sensors_list(moduIe,filtst);
returncount
}u
staticinlineinIsnsors_conlrol_op&n(conststruothw_moduIe_t*module,structsensors.control_device_t**device)]
returnmodJle^niethods^opentmodule,
SENSORS_HARDWAR£_C0HTR0L.(sVucth\Aca0Vice_I**)dGwe);
staticStrutthw_mddule_nneihods_ls._mociule_methods-(open;s_de^ice^operj
};
staticint!
;_卫%9_j|j?
n(conststructriWLmodiJle_rmodule,constcliar*name,struct如心iwi淀尸device)
{
iff'StrcmpCnanne.SEMSORS_HARDWAF!
E_CONTROL)){
wcl,S3Z心n
de¥->mon.close=S-tie^controLclose:
dev-^deviceopendata_source=s_open_data_source;
dev->device.activate=s_adivaie;
device.sat_daJay二s_set_deIay;dev-^device^l^e=s_wake;
}els^iT(lstrcmp(fiame,SENSOfiS_HARDWARE_DATA))(dev->mon.clGse=$_cl且匕凶日询_。
1。
9色;dev-^device.data_apen二s_data_.open;
dev->devicedataclose=sdataclose:
■■■■■■I
de^*davice.poil=spoli;
tie¥->f(j=-1:
}
为_sensors_control_init()提供接口android_init(),并执行回调函数module->methods->open();
3)硬件抽象层
具体实现(*open),该函数为所有G-sensor回调函数的指针赋值。
3.2sSensorDevice->opendatasource。
classSensoiServiceextendsISensorService.Stub[
x』oMaul£
@SuppressWarningsC'unusetf,)
publicSensorSoivice(Coniescentext)(
_sensnlroi_inltQb
}""■
publicParcelFileDescriptorgetDataChanelOthrowsRemoteException(
return_sensors_contr&l_opemu)
vate(sensor,true).
0日Ia/(minDelay);
«6;
_sensors_coniroLact_sensors_ccintrc+lset_5en^ors_CQntroljfv&
}
staticJNIMallveMethod珈何二{
f'_senscrs_controt_i,"()r\(void*)andruidjrit}r
f_sensors_control_open".,h0Landroid/"os/ParceIFiIeDescriptor;M.(void*)android_open},
f_senscrs_controI_activate1\'"(1^)7*,tvoid*)android_acth f'_seneors_control_eeLcJeIJ)I".(void*)android_set_tlelav). I staticjobject3ncro'J_'j: : ■■.■ri(JNIEnv+enY1jclassclazz)■ { intfd=sSensorDevice-^oneidstasoi./c^^Sen^orDevic^; returnNULL; startleinrts_open_dala_source(structsersors_conlrol_device_tevice) strucisenearecontrolcontext地 (structsensors_conIroLcont&xtjdevice; =openf7dev/bma;20".O_RDONL¥^; returnfd; ) staticstructmiscde-vice浒的邱『mirror=MISC_DYNAMIC_MINOR, .name=^bma^SO'; .fops=&bma? 2O_fopsrk —1 staticintO_fjrobe(structj2c_clienl*cllent, conststructi2c_device_id*id) ( irnst_registeea_cfevice); 1— 1)Framework SensorService作为系统守护进程运行,其类的一个公有成员ParcelFileDescriptor通过 实现_sensors_control_open()得到设备的文件描述符。 2)JNI 为_sensors_control_open()提供接口android_open(),并执行回调函数sSensorDevice->open_data_source(); 3)硬件抽象层 具体实现(*open_data_source),该函数通过打开G-sensor的设备节点得到文件描述符fd=open("/dev/bma220”,O_RDONLY); 4)设备驱动层 通过misc_register()对G-sensor设备进行注册,建立设备节点。 3.3sSensorDevice->data_open() publicclassextendsIRotationWatcher.Slub staticprivate。 膈葬Sei»&oiThiead{ privateclassSeiisorTlueflilRiJiiibiibleirnplementsRjnnable{ privateFarcelFileDescriptorniS&tisorDataFd; S&nsorThreadRunnablefParcelFdeDescrlptorfd)( iriSerscrDataFcf=他 } publicvoidnuu){ finalfloatQ盛腥s=newfloaiPI; finalint[]■扫仙=newinrt[1|; finallongtimestarry)n-newlong[1]; r■^(mSersorDataFcl.getFileDescriptorQ); st^trcJNINaiiveMethodgMethodsQ={, -■■*■ ("■_"t''(Ljava/to/FiIeDescriptor;)I"c (void*)-.■: ! -□.I,.: ••-": i), ("sensors_data_cIcse".01".Cvoid^sensors_data_close), ("senserS-data-polF,"《[F[l[J)r\^oid^sensors-dstajoll}, staticjmi■--! (JNlEnv*enwljclassclazz,jobjectfdo) ( jclassFileDescriplor=env->FindCIas3Cjavafio/FiIeDescripjtof). jfieldlDoffset-env->GetFieidlD(FileDes.CFiptCir."descriptor-, intfd=enw^GetintFiei(j(fdoboffseV; return.■-■--•: ;■r(sS&n&orDevice,fd); staticint.r■■i"i(structsen$ors_data_device_t*device,int■: ^) 〔--- structsensers_data_con! exl_t*dev, dev=(stFuoisensors_data_content")de¥lce; 顿-砒二岫啊; relurn0; 2)JNI 为sensors_data_open()提供接口sensors_data_open(),并执行回调函数sSensorDevice->data_open(); 3)硬件抽象层 具体实现(*data_open),该函数的功能就是将已经得到的文件描述符fd复制一份到sensors_data_context结构体中的dev->fd,以便为处理数据的回调函数如(*poll)使用。 3.4sSensorDevice->poll() put'iicrhssSmsorr.UnagGremendsiRcrstiar'-.r: fierStub 5la: icSOTisorThrcact. private^«r^orThrt? idRu? wtaU.节口I由nt? D3Runn足山电; prr.ilsPart^lFiiaD@acriplormSenscrDataFd; 5cn eDeszrptar'mSen^orDataFd=fd: ] PULICrU^n: fltialflojL"=伯存11“牌 flnalmt"=妨毛止in””. fira\j]=IflhJ[T; thSensorDfffaFd网*盹XwftgM) _Nr dtb皿岳5p倍Jpucp slaticJHINafiMNitiad网喻瞬可・£ ■■■■_;■■■_;■■■■(Ljava/koFilfiDe^cfiptan)i;(v&Kl^aini ! emwcifs_rtate_dcfie;XJT,wsb: 契计au_0踞蜃}, ■■-.'i'」RF」「i-jOicSJ: 'r.■ statiGini〔jniEm托<1,心855iot)jectrdo> )ddMFMeDe3Cftpior=env-->Fin0Oa3a(i』a心F臆Dwscwwr,jflelcUDoftefit-en/-*GeFkeFcSD^FUtO»Gnptardescriptori. iritfci=en.-*GeflnlFieid(*dDOffset rslumin折心e,i笠时 staticjJnta«rao»^d^a_poRCMjflcaiArray直—二,jintAmi: . inires-*■'■■-「i* nntaccurjcr=djla: tofstatu■nv^-SriFloaMira/fi.glonf□-enw->-9diniArravRegion「: g,Tsnw->SetLonijArTW海可u碓jmtum心 1.I. itaticini.istudtsen5d mgctserisiirs_d3ta_cont6dj* de.=srudstrsars_d3l3_cor stateInt■strudser15crs_dJia_dcacej,ae,ice.Ini.ptiirTtipftl-4-'&nis. mleir=.■: *nrjui struct$ensors_iata_come>iJdae, d株•馈血ctsens(xs_daia_comest_i*xj的匚eerr=ro(j(已站s&Lge q二L'11J■OULiij --■■i-rni65p«€_lo_ns-; (盛um0,dafa->senstir兰SEN&QR_TYPE ■)内时心=SEN! 距巨三W£1E_二二= rebmSH-riDLEORIENTAL( 51311cjnttri.*Z2: ■(strudinoci iUticconststrudftle_Gperationsr)nna220_Tqcis=<{T O«vn»r=THI9_KOOULE.cas-9eUASZO^CET^ORlEhiTATlC iiocn=om3220_ioci|bma2.20gelcrienrtationi^1: copjLto_iiser((uriGione{ic^ar'irGtUfTi$(T 1)Framework SensorManager作为系统守护进程运行,其子类SensorThreadRunnable的行为函数 run()实现sensors_data_poll(values,status,timestamp),其目的是通过此函数得到从底层传上来的有关G-sensor的数据values,status
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AndroidSensor 传感器 系统 架构 初探
![提示](https://static.bdocx.com/images/bang_tan.gif)