Android的硬件访问服务提供了一个APP调用硬件实现的方法模型。我们从上往下来看。应用层面对的都是一个个的服务叫service.比如电源管理服务,震动服务等等。应用层代码首先就需要去查询系统是否存在这么一个服务,或者目前是不是可以被获取的。从这个角度,我们就牵扯出来两个问题。a:既然去系统里面查找这么个服务,那么首先应该又什么地方注册加入系统的。b:有了这么个服务,我也得创建一个接口函数来链接APP跟这个服务函数的桥梁。我们的应用APP通过这么一个桥梁来去访问这个服务。
我们需要怼的就是这么个服务是怎么添加到系统的,以及他的前世今生。这个工作是由systemserver.java文件来做的。在 startotherservices函数中我们先去new 一个服务实例对象,然后再去addservice 将这个方法注册到系统的service_manager.c这就是前面我说的系统。那么这个服务的方法是根据谁来实例化的呢?那么肯定会有一个class类来做,也就是说我们需要创建这么一个类。
APP操作的根源还是在底层,现在我们讲好了service,那么我们还需要一个地方去注册管理底层的方法。这个仍旧是在SystemServer.java里面集中管理。这个是通过Loadlibrary函数调用JNIonload。cpp这里面并没有直接做JNI的处理,因为安卓各个方法如果都写在这么一个文件里面就会显得特别乱。我们继续通过调用下一层的JNI文件来处理。这个JNI文件是需要随着系统一起编译的。后期我们没改一次JNI就去编译一次Anroid系统,太费劲了。我们就引入了Hal文件。我们的jni只需要提供标准的接口。hal文件去实现这些jni。而且这些hal文件不需要跟着系统一起编译,我们还可以把他做成.so文件,加载到库里。这样同时还解决了保密问题。对吧。
说的还是挺绕的。简而言之。我们把底层各种封装处理,然后提供处理啊那么一个插头(我们的service实例化后的方法就是一个插头,里面包含了各种处理)。我们的应用层也使用一个插头,当这俩插头接到了一起,就实现了我们的安卓硬件访问服务。

如果某个硬件资源只能被某一个应用使用,可以使用下面的方法访问硬件:

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进程以请求相应的服务,
而以上三个进程之间的内部通信,主要依靠Android内核的Binder Driver系统进行内部进程间通信。这个Binder并不是linux内核自带的,是google公司对linux内核进行修改添加的一个驱动程序,可实现更加高效的进程间通信。
ps:注册Server与Service的区别,可以这么理解,Server服务器提供各种服务Services.
思考:如何实现一个硬件访问服务。
1 编写JNI和HAL,以led为例,先编写com_android_server_ledservice.cpp,用于注册JNI本地方法。再编写hal_led.c,里面就是实现open,read,write等硬件访问接口。
2 修改onload.cpp,调它调用com_android_server_ledservice.cpp内实现的函数,
3 修改system server.java, 
new ledservice()
add ledservice()
4编写LEDService.java提供一个类,做接口用的,他自己是不能调用本地方法的。他是通过在systemserver.java中实例化对象提供接口来实现功能的!!这个地方要谨记,很容易让人混沌不清。
5 编写ILEDService.java接口给app使用。

Android硬件访问服务框架思想初识相关推荐

  1. android+硬件服务,android之硬件访问服务框架

    一.硬件接口描述文件aidl 新增\frameworks\base\core\java\android\os\ILedService.aidl 二.mk编译脚本 修改vi frameworks/bas ...

  2. 嵌入式Android底层开发(三)硬件访问服务框架

    一.简单的Android应用程序调用硬件流程图(通过JNI接口直接访问) 但这样存在一个很大的问题:访问仅限与单一程序进行访问,如果多个APP同时访问一个硬件资源(多个APP都需要在LCD进行显示.多 ...

  3. Android系统硬件访问服务框架分析

    怎么实现硬件访问服务 1.JNI和HAL com_andorid_server_ledService.cpp (JNI文件注册JNI本地方法:供app应用程序调用) hal_led.c (C库:具体操 ...

  4. 第1课第4.4节_Android硬件访问服务编写HAL代码

    android应用如何访问C库 - 落魄影子 - 博客频道 - CSDN.NET  http://blog.csdn.net/ab198604/article/details/51249303 And ...

  5. 2.3硬件访问服务-APP修改编译

    目录 APP修改 相关依赖导入 参考 3288 MainActivity build.gradl 小节回顾 通过上一小节,我们硬件访问服务已经基本完成(还有少些部分需要修改,下小节为大家讲解),该小节 ...

  6. android客户端访问服务端,服务端返回json数据

    json这里选用了fast-json 先看服务端代码如下 package novelserver.servlet;import java.io.IOException; import java.io. ...

  7. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)...

    在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...

  8. android客户端访问服务端tomcat

    为什么80%的码农都做不了架构师?>>>    首先,服务器端已经存在一个项目,该项目基于SSH,已经部署在tomcat上并且正在运行了.我在这个项目的action层新建了一个包,该 ...

  9. Android硬件服务框架实例之Vibrator(驱动到应用)

    转载于:http://www.cnblogs.com/skywang12345/p/3404808.html,内容有所修改,这篇vibrator源码是基于安卓7.1分析.      系列:安卓硬件访问 ...

最新文章

  1. Codeforces1600数学[CodeForces - 958E1[平面几何+暴力]CodeForces - 888D [组合数+错排问题]]
  2. sql2008 附加数据库时 错误5123
  3. DPI — nDPI — 安装部署与应用示例
  4. 如何利用 Arthas 热更新线上代码
  5. java:蓝桥杯,矩形面积交
  6. 小技巧,怎么让MFC的MDI程序子窗口看起来有扁平的效果
  7. python字符编码与转码
  8. 前端基础-html-段落标签
  9. RocketMQ的组织架构和基本概念,Dledger高可用集群架构原理
  10. linux 安装 vmvare
  11. python中文相似度_python比较两个文本的相似性
  12. 浅谈EM算法的两个理解角度
  13. 完美解决excel科学计数法导入数据库处理方法
  14. 微信商户异常处理的几个建议
  15. 表达无序列表语义的html标签是,HTML语义标签的介绍和常用的语义标签
  16. GL/gl.h: No such file or directory
  17. ASP+VML制作统计图的源程序
  18. 字节跳动日常实习一二三面面经(后端开发)
  19. CAD如何快速查找图纸的存放位置?怎么实现快速看图?
  20. Java大用处——动态数组的实现

热门文章

  1. SPS用户管理的问题
  2. Jupyter Notebook的15个技巧和窍门,可简化您的编码体验
  3. 团队管理新思考_需要一个新的空间来思考讨论和行动
  4. leetcode1169. 查询无效交易
  5. linux渗透测试_渗透测试:选择正确的(Linux)工具栈来修复损坏的IT安全性
  6. 两个富翁打赌_打赌您无法解决这个Google面试问题。
  7. reddit_我在3天内疯狂地审查了Reddit上的50个投资组合,从中学到了什么。
  8. springcloud-zuul路由网关
  9. 4-1 线程安全性-原子性-atomic-1
  10. Centos下Nodejs+npm环境-部署记录