没有合适的资源?快使用搜索试试~ 我知道了~
android震动(vibrator)系统开发全过程.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 83 浏览量
2021-12-30
23:14:48
上传
评论
收藏 226KB DOCX 举报
温馨提示
试读
11页
android震动(vibrator)系统开发全过程.docx
资源推荐
资源详情
资源评论
一、前言
Android震动系统开发全过程
本人刚学习安卓驱动开发,水平不能说菜,是根本没有水平,在这里把学习过程贴出来,跟大家一起
学习交流,还望大家多多指正,转载的请标明出处。
二、android驱动介绍
安卓总体架构是在 Linux内核基础上,增加硬件抽象层(HAL ),运行库,java虚拟机,程序框架等组
成的,具体如下图。
安卓的应用程序是从 application framewo层rk架构上建立的。所有 APK 应用程序都是通过 framework
层来运行的。application framewo是rk google写好的,除非自己深度定制,一般是不会更改这个层的。
对于驱动开发来讲,我们要做的就是让 framework 层能认识并操作我们的硬件设备就 OK 了。因此我们关
心主要有 3 个层面:
linux Kerne层l
HAL 层
JNI层
1. linux Kern:el是 google在 linux内核基础上,专门为移动设备优化后的内核,增加修改一些东西,
担修改的不多,对于内核驱动来讲,基本没有修改,做过 linux驱动开发的人应该很容易理解。
2. HAL ,硬件抽象层:简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实
现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Spac)e,一层放在内
核空间(Kernel Spac)e,其中,硬件抽象层运行在用户空间。用户空间不属于内核不必遵守 GPL
协议,各个厂商可以把与自己硬件设备相关,具有商业机密的一些代码放在 HAL 层。
3. JNI层:提供 java和底层 C、C++的动态链接库的接口。我理解的是 JNI就是一个代理,可以把 C
和 C++生成的接口函数翻译成 Java可用,提供给 framework 层。
三、振动系统开发过程
1. 硬件平台
CPU:IMX6Q 4 核 1G
RAM:1G
FLASH:8G 板载
这次开发用的代码都是 google 和飞思卡尔提供的具体的就不再说明了,因为每个平台代码都有所不同,
而且买开发板时候都会带相应的资料。
2.
震动系统是 android
里面比较简单的一个系统,
我采用的是从高层到底层的学习方式。因为我们的
驱
动最终是给应用程序用的,从 application 的需求分析 JNI,然后分析 HAL 最后在我们写 linux kernel驱
动时候,很容易理解为什么要这么写。好了开始正式分析。
3. Application 层:通过 google 我找到关于 APK 访问震动的如下说明:
A、通过系统服务获得手机震动服务,Vibrator vibrator =
(Vibrator)getSystemService(VIBRATOR_SERVICE);
B、得到震动服务后检测 vibrator 是否存在:
vibrator.hasVibrator();
检测当前硬件是否有 vibrator,如果有返回 true,如果没有返回 false。
C、根据实际需要进行适当的调用,
vibrator.vibrate(long milliseconds);
开始启动 vibrator 持续 milliseconds 毫秒。
vibrator.vibrate(long[] pattern, int repeat);
以 pattern 方式重复 repeat 次启动 vibrator。
(pattern 的形式为 new long[]{arg1,arg2,arg3,arg4......},其中以两个一组的如 arg1 和 arg2 为一
组、arg3 和 arg4 为一组,每一组的前一个代表等待多少毫秒启动vibrator,后一个代表vibrator
持续多少毫秒停止,之后往复即可。Repeat 表示重复次数,当其为-1 时,表示不重复只以
pattern 的方式运行一次)。
D、vibrator.cancel();
Vibrator 停止。
从上面的说明,可以看出应用程序调用震动系统,是调用一个叫 VIBRATOR_SERVICE 的服务,这个服
务有 3 个函数,分别是 hasVibrator(),r.vibrate,.cancel();当然这个三个函数可能在 framework 层进行
的另一层的封装,我没有去深究。但可以推测出 JNI 层要做的是与注册 VIBRATOR_SERVICE 服务和实
现这三个函数相关的.
4. HAL 层:这一层我找到了具体的代码我们会好分析很多,其代码是:
#define LOG_TAG "VibratorService"
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware_legacy/vibrator.h>
#include <stdio.h>
namespace android
android\frameworks\base\services\jni\com_android_server_VibratorService.cpp
{
static jbooleanvibratorExists(JNIEnv *env, jobjectclazz)//判断振动器是否存在
{
returnvibrator_exists() > 0 ? JNI_TRUE : JNI_FALSE;
}
static void vibratorOn(JNIEnv *env, jobjectclazz, jlongtimeout_ms)//打开振动器
{
// LOGI("vibratorOn\n");
vibrator_on(timeout_ms);
}
static void vibratorOff(JNIEnv *env, jobjectclazz)//关闭振动器
{
// LOGI("vibratorOff\n");
vibrator_off();
}
staticJNINativeMethodmethod_table[] = {
{ "vibratorExists", "()Z", (void*)vibratorExists },
{ "vibratorOn", "(J)V", (void*)vibratorOn },
{ "vibratorOff", "()V", (void*)vibratorOff }
};
intregister_android_server_VibratorService(JNIEnv *env)
{
//注册 vibrator 服务
returnjniRegisterNativeMethods(env, "com/android/server/VibratorService",
method_table, NELEM(method_table));
}
从上面代码可以看出,JNI 做了两件事:其一注册 vibrator 服务,其二,实现了 vibratorExists,
vibratorOn,vibratorOff 三个服务函数。进而我们可以分析出 HAL 层主要的就是实现次代码里调用
的三个函数 vibrator_exists(),vibrator_on(timeout_ms),vibrator_off()。
5. HAL 层:经过各种查找我们找到了 vibrator 的 hal 层代码:
\android40\hardware\libhardware_legacy\vibrator\vibrator.c
#include <hardware_legacy/vibrator.h>
#include "qemu.h"
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
剩余10页未读,继续阅读
资源评论
进击的朱亚文
- 粉丝: 0
- 资源: 4万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功