android系统级别硬件访问服务程序

2024-09-05 22:18

本文主要是介绍android系统级别硬件访问服务程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

硬件访问服务程序

实现一个硬件访问服务程序,需要
- 接口文件aidl
- service实现这个aidl
- SystemServer中注册这个服务
- service需要的jni文件
- OnLoad.cpp中添加jni文件
- hal 文件
- 相应的Android.mk

接口文件aidl

  • aidl的路径
  • aidl的写法
  • aidl的结果

aidl的路径

android系统的aidl文件在

/frameworks/base/core/java/android/os/IVibratorService.aidl
/frameworks/base/core/java/android/hardware/

这两个目录下都存在一些aidl文件。其他的目录下也存在一些aidl文件。
android.os下的aidl文件,通过其实现类,在SystemService中被调用,并添加到了ServiceManager中。同时通常能被应用程序通过getSystemService来访问使用。
在android.hardware下模块。通常允许应用程序调用andrid.hardware.xxx来实现相应的功能。例如开源的二维码扫描软件zxing,就利用android.hardware.camera来调用camera的相关接口。

aidl的写法

aidl内定义的是一些接口

package android.os;/** {@hide} */
interface IVibratorService
{boolean hasVibrator();void vibrate(int uid, String opPkg, long milliseconds, int usageHint, IBinder token);void vibratePattern(int uid, String opPkg, in long[] pattern, int repeat, int usageHint, IBinder token);void cancelVibrate(IBinder token);
}

首先需要指定包名。Vibrator位于android.os这个包下。
需要注意的是这些接口文件,需要使用/* {@hide} / 进行修饰一下
这些接口是隐藏的。

aidl的结果

将aidl文件放入
frameworks/base/core/java/android/os/目录下后,
修改framework/base/Android.mk 添加定义的aidl文件
使用 . build/envsetu.sh
lunch xxx
mmm framework/base

 将会在 /out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/

下生成 IVibratorService.java文件
生成的文件依然是一个interface类型的文件
内部还有一个静态的类。继承android.os.binder 并实现了 IVibratorService 这个接口

public interface IVibratorService extends android.os.IInterface{
public static abstract class Stub extends android.os.Binder implements android.os.IVibratorService
{}
}

android的编译系统自动帮助我们实现了binder机制,实现了这个interface。
必然存在一个文件实现这个interface

service来实现这个aidl

  • 代码的路径
/frameworks/base/services/core/java/com/android/server/VibratorService.java
  • 代码实现
public class VibratorService extends IVibratorService.Stubimplements InputManager.InputDeviceListener {//本地实现的方法 native static boolean vibratorExists();native static void vibratorOn(long milliseconds);native static void vibratorOff();//构造方法VibratorService(Context context) {// Reset the hardware to a default state, in case this is a runtime// restart instead of a fresh boot.vibratorOff();mContext = context;PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*vibrator*");mWakeLock.setReferenceCounted(true);mAppOpsService = IAppOpsService.Stub.asInterface(ServiceManager.getService(Context.APP_OPS_SERVICE));mBatteryStatsService = IBatteryStats.Stub.asInterface(ServiceManager.getService(BatteryStats.SERVICE_NAME));mVibrations = new LinkedList<Vibration>();IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_OFF);context.registerReceiver(mIntentReceiver, filter);}

SystemServer中注册这个服务

调用构造函数,同时将virbator添加到ServiceManager中

 VibratorService vibrator = null;
vibrator = new VibratorService(context);
ServiceManager.addService("vibrator", vibrator);try {vibrator.systemReady();} catch (Throwable e) {reportWtf("making Vibrator Service ready", e);}

service需要的jni文件

在构造函数中调用了
vibratorOff(); 这个本地方法

这个本地的方法是在
/frameworks/base/services/core/jni/com_android_server_VibratorService.cpp
中实现的

     static jboolean vibratorExists(JNIEnv *env, jobject clazz){return vibrator_exists() > 0 ? JNI_TRUE : JNI_FALSE;}static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms){// ALOGI("vibratorOn/n");vibrator_on(timeout_ms);}static void vibratorOff(JNIEnv *env, jobject clazz){// ALOGI("vibratorOff/n");vibrator_off();}static JNINativeMethod method_table[] = {{ "vibratorExists", "()Z", (void*)vibratorExists },{ "vibratorOn", "(J)V", (void*)vibratorOn },{ "vibratorOff", "()V", (void*)vibratorOff }};int register_android_server_VibratorService(JNIEnv *env){return jniRegisterNativeMethods(env, "com/android/server/VibratorService",method_table, NELEM(method_table));}

在jni中,可以知道最终调用的是 vibrator_off
这个vibrator_off 是在jni中实现的

OnLoad.cpp中添加jni文件

register_android_server_VibratorService(env);

hal

/hardware/libhardware/include/hardware/vibrator.h
/hardware/libhardware_legacy/vibrator/vibrator.c

在libhardware下的hal文件,形成的是libhardware.so这个动态库。

Context进行注册

    registerService(VIBRATOR_SERVICE, new ServiceFetcher() {public Object createService(ContextImpl ctx) {return new SystemVibrator(ctx);}});

应用程序的使用

vibrator=(Vibrator)getSystemService(Context.VIBRATOR_SERVICE);

其他

vibrator的java binder层面。在service部分,还有 binder的 死亡通知。
(还需要深入的理解)

总结

以上是从系统的角度来进行的硬件访问服务程序。

参考文献

Android震动vibrator系统开发全过程

这篇关于android系统级别硬件访问服务程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140219

相关文章

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断