1.Linux驱动实现

2.Linux内核驱动测试

3.Android HAL层实现

4.Aidl实现

5.Service java实现

6.Service jni 实现

7.注册service和jni方法

8.Android App调用测试

开发环境

751d9df5c34e8e394d6532450ac414d0.png

1.linux驱动实现。

下面我就简单实现一个字符驱动

7f3d92709f1185182e4293cb840d5938.png

47bf9edbe928e3e527e70401d5ec4207.png

5715adf53b38b958b45e80bebcf06f6a.png

代码编译

在kernel/goldfish/drivers/下创建驱动文件夹,这里我创建test2,

然后编写对应的Kconfig/Makefile文件。这2个文件比较简单。

Kconfig:

6b2233686d9f1d727ee284026cee2e9c.png

把这2个文件都放在test2目录下。

当然仅仅这样还不够,因为你并没有让内核编译关联到我们新创建的test2驱动。

在kernel/goldfish/drivers/Makefile中添加

d1914aec25543d21b70955c4effe251b.png

在kernel/goldfish/arch/arm/Kconfig中添加

1e8cec19db6ba52c8a87d0b5e3a0c4f9.png

然后在kernel/goldfish下执行命令make menuconfig

82fd290d029d6808e560510255f4756b.png

然后找到对应的驱动,按键按Y,启动该驱动,然后exit退出保存。

6c0881a4ce4231b55935c2321cc7cc86.png

最后执行,make

d2b46846e8e01218393a3fe2e3509202.png

成功生成zImage文件

查看驱动

启动android虚拟机,并指定内核为当前生成的内核。

emulator -kernel kernel/goldfish/arch/arm/boot/zImage

然后执行adb shell进入android系统控制台

执行 cat /proc/devices

f395287c7188f595b9ca34327bf2921b.png

可以看到test2驱动已经注册了。

但是,我们还希望能在/dev下有test2驱动,那么还需要在test_init最后面再添加2行代码。

19c522d344a962dee807aeafb9a83bce.png

然后替换掉原来的test2.c文件,重新make生成zImage文件,然后再调用

emulator -kernel kernel/goldfish/arch/arm/boot/zImage 重新启动模拟器

就会发现,/dev下出现了test2驱动

c018826593e4f1e54a145372a18b831b.png

这里编写一个字符设备cdev驱动,详情请看 linux设备驱动学习(二)——字符设备编写及测试

2.Linux内核驱动测试

建立globalmemTest测试文件,代码如下所示:

#include#includeint main(void)

{

char s[] = "Linux Programmer!\n";

char buffer[80];

int fd=open("/dev/globalmem",O_RDWR);//打开globalmem设备,fd返回大于2的数则成功,O_RDWR为权限

write(fd,s,sizeof(s));          //将字符串s写入globalmem字符设备中

printf("test write %d %s\n",fd,s );

close(fd);  //关闭设备

fd=open("/dev/globalmem",O_RDWR);

read(fd,buffer,sizeof(buffer));   //读取globalmem设备中存储的数据

printf("test read %d %s\n",fd,buffer);  //输出结果显示

return 0;

}

结果展示:

584bbf3e4b4aae18c5d81e2b96ca0eb1.png

3.在虚拟机里面测试

在Android源码目录的external下新建globalmem文件夹,将globalmemTest.c放入这里面,之后在这里面新建Android.mk

bb42e981457bb29bf77b27c89c02b7c2.png

Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES :=$(call all-subdir-c-files)

LOCAL_MODULE :=globalmemTest

include $(BUILD_EXECUTABLE)

退回至Android源码根目录下,执行source build/envsetup.sh ,再用lunch加载特定类型,选择你用的分支数字,之后再make

命令:source build/envsetup.sh

lunch

你产品分支数字

make  [模块名(Android.mk中模块名字)]

a36da994c9589f813a07d8d1b5dae2c4.png

之后再目标目录可以找到编译后生成的文件,在虚拟机中进入adb shell后执行它即可。

4.HAL层可查看这篇文章

Android HAL层编写

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐