安卓硬件访问服务框架分析

[复制链接]

1234

主题

-8

回帖

216

积分

游客

积分
216
a420995601 发表于 2018-12-20 23:44:15 | 显示全部楼层 |阅读模式
  安卓硬件访问服务框架分析
  如果某个硬件资源只能被某一个应用使用,可以使用下面的方法访问硬件:
  JAVA APP--->JNI_OnLoad()加载C库---->将JAVA三个地方法与C库函数进行关联并注册---->调用JAVA本地Native方法就可以访问C库的C接口------>进而访问硬件驱动中的open, read, write,从进访问硬件。
  但是,以上场景仅限于只有一个APP使用这个硬件资源,如果有多个应用想要使用某个硬件时,如果还按上面方法,必须会造成硬件资源的冲突,所以此时需要有一种框架来解决这个问题。解决方案就是访问硬件资源的程序只能并且只有一个,我们称之为System Server, 其它要访问这个硬件资源的APP必须要给Server发请求,由Server间接的操作硬件,从而实现资源的访问。这个就称之为硬件访问服务。
  关于硬件访问服务需要注意以下几点:
  1 System Server是由JAVA编写的,所以它要想访问硬件,必须要加载JNI的C库(Loadlibrary).
  2 C库的JNI_Onload函数里要注册本地方法,分别调用各个硬件的函数来注册本地方法。比如LED,振动器,有串口。。。等等。。
  3 System Server:
  (1)对每个硬件都要添加服务,add service
  前提需要实现的是:对每个硬件构造service,使用本地Native方法
  (2)对于(1)添加的服务就是向service_manager.c注册,比如serialservice, vibratorservice, ledservice等。如果JAVA应用程序需要使用某些Service的时候,就需要通过这个Service_manager查询及获取相应的Service。
  4 最终APP怎么使用?
  (1)APP使用之前需要获得这个服务getService
  (2)最后就是使用这个服务了。执行Service的方法
  以后修改硬件驱动的时候,把驱动文件放在hal里面,如hal_led.c,有几个好处:
  (1)容易修改
  (2)很多公司不愿意开放其硬件操作,他们只提供so文件,出于保密的目的。
  试想一下,如果把硬件操作源代码放到JNI文件里,如果要修改,需要编译整个工程(捕鱼游戏 星力捕鱼),此外,硬件源代码暴露出来了,保密性不好。
  分析一下:
  以上操作涉及到三个进程,
  1 SystemServer进程:它提供的功能如下:
  ---a: 它向service_manager.c注册服务
  ---b: 加载硬件Service JNI 的C库
  ---C: 接收其它app的硬件操作请求,访问硬件资源
  2 Service_Manager进程:负责硬件资源各种Service的注册添加,以及接怍JAVA应用app的各种service查询请求及资源的获取。
  3 JAVA应用APP进程,它其实是一个客户端,它首先向Service_Manager查询获得某一个Service, 最后,把这个Service发送给SystemServer进程以请求相应的服务,
  而以上三个进程之间的内部通信,主要依靠安卓内核的Binder Driver系统进行内部进程间通信。这个Binder并不是linux内核自带的,是google公司对linux内核进行修改添加的一个驱动程序,可实现更加高效的进程间通信。
  ps:注册Server与Service的区别,可以这么理解,Server服务器提供各种服务Services.
  思考:如何实现一个硬件访问服务。
  1 编写JNI和HAL,以led为例,先编写com_安卓_server_ledservice.cpp,用于注册JNI本地方法。再编写hal_led.c,里面就是实现open,read,write等硬件访问接口。
  2 修改onload.cpp,调它调用com_安卓_server_ledservice.cpp内实现的函数,
  3 修改system server.java,
  new ledservice()
  add ledservice()
  4 编写LEDService.java,用于调用本地方法,实现硬件操作
  5 编写ILEDService.java接口给app使用。

你喜欢看
  • python如何操作Sql Server 2008

      python如何操作Sql Server 2008   最近由于公司的一个项目需要,需要使用Sql Server 2008数据库,开 ...

  • linux内核如何管理进程

      linux内核如何管理进程   “进程”有诸多的定义,在许多的教材资料上,其定义是一个程序的执行实例, ...