Android系统中震动器服务-VibratorService的分析,从App层到硬件抽象层(HAL层)

 简介:

VibratorService是Android系统中的一个服务,作用是设置手机震动。Vibrator,即震动器,或者称之为马达,在真实的设备中,对应有一个小马达,是安装在手机里的硬件设备。
Android系统提供了硬件抽象层HAL,来让底层驱动开发者适配,这样,整个Android系统的框架层不需要做变更。

应用层调用VibratorService提供的服务:

在应用程序中,可以这样使用VibratorService:

Vibrator vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
if (vibrator.hasVibrator()) {
    vibrator.vibrate(3000); // 振动3秒
    vibrator.cancel();
}

分析:

我们可以直接调用getSystemService方法来获取某一个服务,这个方法是Context类的一个abstract方法,实现在ContextImpl中,如下:

@Override
    public Object getSystemService(String name) {
        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
        return fetcher == null ? null : fetcher.getService(this);
    }

VibratorService框架层:

VibratorService类图如下:

相关代码:

frameworks/base/services/java/com/android/server/VibratorService.java
frameworks/base/core/java/android/os/IAlarmManager.aidl

分析: 

1) VibratorService是一个典型的服务,通过Binder IPC与其它组件或者App进行通信;

2)真正实现核心功能的其实是VibrateThread这个内部线程类。

3)IVibratorService,Sub,Proxy都是编译后的IVibratorService.java中定义的;通过aidl方式对IVibratorService.aidl进行编译,就能得到这三个接口或类的实现。

4)VibratorService的初始化:

VibratorService的初始化工作是在SystemServer的内部类ServerThread中完成的:

frameworks/base/services/java/com/android/server/SystemServer.java中,

vibrator = new VibratorService(context);
ServiceManager.addService("vibrator", vibrator);


创建VibratorService后,将其放入到ServiceManager,由ServiceManager管理起来,以后就可以通过

ServiceManager.getService(name)
来获取到这个Service了。

VibratorService jni层:

VibratorService对应的jni的代码在:
frameworks/base/services/com_android_server_VibratorService.cpp中,有:

namespace android
{

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));
}

};

可以看到,对应的注册函数。这些函数最终调用到了native层的对应的函数中,对应关系如下:

jni层native层
vibratorExists
vibrator_exists
vibratorOn
vibrator_on
vibratorOff
vibrator_off

VibratorService对应的Native层的代码在HAL层的对应的代码中。

VibratorService HAL层:

HAL,即Hardware Abstract Layer,硬件抽象层。Android系统提供了硬件抽象层HAL,来让底层驱动开发者适配,这样,整个Android系统的框架层不需要做变更。

VibratorService HAL代码:

从头文件

#include <hardware_legacy/vibrator.h>

中可以看到,在hardware_legacy目录相关的代码中,如下:

/hardware/libhardware_hegacy/vibrator/vibrator.c

vibrator.c的实现:

在源码中:

#define THE_DEVICE "/sys/class/timed_output/vibrator/enable"

int vibrator_exists()
{
    int fd;

#ifdef QEMU_HARDWARE
    if (qemu_check()) {
        return 1;
    }
#endif

    fd = open(THE_DEVICE, O_RDWR);
    if(fd < 0)
        return 0;
    close(fd);
    return 1;
}
static int sendit(int timeout_ms)
{
    int nwr, ret, fd;
    char value[20];

#ifdef QEMU_HARDWARE
    if (qemu_check()) {
        return qemu_control_command( "vibrator:%d", timeout_ms );
    }
#endif

    fd = open(THE_DEVICE, O_RDWR);
    if(fd < 0)
        return errno;

    nwr = sprintf(value, "%d\n", timeout_ms);
    ret = write(fd, value, nwr);

    close(fd);

    return (ret == nwr) ? 0 : -1;
}

int vibrator_on(int timeout_ms)
{
    /* constant on, up to maximum allowed time */
    return sendit(timeout_ms);
}

int vibrator_off()
{
    return sendit(0);
}

总结:

从framework -> jni ->native(包括HAL) ,Android提供了完整的框架服务,用户只需要调用这些服务提供的方法即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值