Android硬件访问服务

本文详细介绍了如何在Android系统中创建并使用硬件访问服务,通过Service实现后台操作,如LED控制。讲解了从AIDL定义接口、Server端实现、JNI本地方法注册到APP调用服务的全过程,涉及SystemServer、JNI和HAL的交互,以及解决编译和内存限制问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android有四大组件: 
一、Activity 
二、Service 
三、Broadcast Receiver 

四、Content Provider

Service是Android中一个类,它是Android四大组件之一,使用Service可以在后台执行长时间的操作( perform long-running operations in the background ),Service并不与用户产生UI交互。其他的应用组件可以启动Service,即便用户切换了其他应用,启动的Service仍可在后台运行。一个组件可以与Service绑定并与之交互,甚至是跨进程通信(IPC)。例如,一个Service可以在后台执行网络请求、播放音乐、执行文件读写操作或者与 content provider交互 等。

由于上一章JNI直接访问硬件可能导致多个应用同时访问一个驱动,就可能导致驱动出现问题,所以我们可以只让一个应用程序来访问硬件,这个应用程序成为“SystemServer”,APP有应用请求统一发给它,由它统一管理所有的service。而我们这章的目的也是建立一个led service。

SystemServer使用java写的,访问硬件只能用C,所以中间也需要使用JNI。 
SystemServer的源码在android目录下: 
frameworks\base\services\java\com\android\server\SystemServer.java

----------------------------------------------------------------------------------------------------------------------------------

这里先概述一下SystemServer的过程

  1. 通过LoadLibrary来加载C库,
  2. C库的JNI_Onload函数里面注册本地方法,分别调用各个硬件的函数来注册本地方法,比如LED、振动器、串口等等
  3. SystemServer:对每个硬件addService(Server里面有很多个Service,由Server提供Service),每个硬件都需构造Service(即注册本地方法)
  4. APP使用: 
    首先获得服务:get Service 
    然后使用服务:执行Service方法

----------------------------------------------------------------------------------------------------------------------------------

SystemServer源码解析: 
文件:SystemServer.java 
SystemServer在源码中是一个类,里面实现了很多类方法,以Vibrator这个service作为参考例子,模仿写一个led service,我们从main这个方法开始解析

  • Main() 
    – SystemServer().run() 
    —–System.loadLibrary(“android_servers”)—>初始化native service,即加载C库,对应文件是 onload.cpp,里面有JNI_OnLoad,用于注册本地方法 
    ——–Register_android_server_VibratorService(env)—>对应com_ android_server_VibratorService(对应文件名),里面负责实现native方法 
    —–StartOtherServices()—>里面定义了各种service—>new VibratorService—>addService

想要APP能使用service需要注册添加各种service进service_manager.c,然后通过getService来获取接口,自己添加的驱动就需要在这里面addService,最上面那副图中的几个进程都会涉及到Binder driver,这个驱动程序并不是内核自带的,而是google公司对linux内核做的修改,添加的一个驱动程序,它可以实现更加高效的进程间通信。

----------------------------------------------------------------------------------------------------------------------------------

接下来以代码的形式描述一下上面的整个过程,从APP—>server—>service—>JNI(其实应该还有个HAL,但这章主要描述service的建立过程,HAL放到下一章讲)。

-------------------------------------------------------------------------------------------------------------------------------

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值