业界动态
android自定义驱动编译+Framework层调用android手机驱动「android自定义驱动编译+Framework层调用」
2025-02-13 17:43

1、内核源码目录/drivers/下,新建hello目录

2、在hello目录下创建hello.h文件

 

3、在hello目录下创建hello.c文件

 

4、在hello目录下创建Kconfig和Makefile两个文件

Makefile文件

 

Kconfig文件: 

 

        说明:在Kconfig配置文件中,tristate表示编译选项HELLO支持在编译内核时,hello模块支持以模块、内建和不编译三种编译方法,默认编译为模块,因此,在编译内核前,我们需要使用make menuconfig命令配置编译选项,使得hello可以以模块或者内建的方法进行编译。 在Makefile文件中,根据选择HELLO的值,执行不同的编译方法。

5、添加hello模块项目到驱动程序中

修改drivers/Kconfig 在menu "Device Drivers"后添加一行

 

将我们自定义的hello模块引入,修改drivers/Makefile,添加hello编译模块在里面添加,在最前面一行添加

 

        在内核目录/arch/x86/configs/x86_64_ranchu_defconfig文件中添加一行:(因为我源码用的是goldfish-refs_heads_android-goldfish-4.14-gchips,而且编译用的是aosp_x86_64-eng模式,如果刷机用的是实际设备,且编译模式用的是aosp_ranchu-userdebug,就需选择内核目录/arch/arm64/configs/arm64_ranchu_defconfig)

 

        这里m表示编译成module,y表示编译进kernel只可以看到.o不会生成.ko 这样,执行make menuconfig时,就可以配置hello模块的编译选项了,配置为编译成模块。.

6、配置编译选择

步骤如下

a、内核目录下执行make menuconfig,弹窗选择框,进入Device Drivers-->选择First Android Driver 按y键是选中,n是不选中

b、注意: 如果内核不支持动态加载模块,这里不能选择m,虽然我们在Kconfig文件中配置了HELLO选项为tristate。要支持动态加载模块选项,必须要在配置菜单中选择Enable loadable module support选项;在支持动态卸载模块选项,必须要在Enable loadable module support菜单项中,选择Module unloading选项。 我们这里是支持动态加载的,因此选择m,方便加载调试。

7、编译内核

make kernel

        完成内核驱动程序后,便可以在Android系统中得到三个文件/dev/hello、/sys/class/hello/hello/val和/proc/hello。我们将通过/dev/hello来连接硬件抽象层模块(HAL)和Linux内核驱动程序模块。

1、定义HAL抽象层hello.h头文件

进入到hardware/libhardware/include/hardware目录,新建hello.h文件

 

        这里按照标准Android硬件标准抽象层规范要求,分别定义模块ID、模块结构体以及硬件接口结构体。在硬件接口结构体中,fd表示设备文件描述符,对应我们将要处理的设备/dev/hello,set_val和get_val为该HAL对上提供的函数接口。

2、实现硬件访问hello.c

进入到hardware/libhardware/modules目录,新建hello目录,并添加hello.c文件。

 

3、节点权限问题

        DEVICE_NAME定义为"/dev/hello"。由于设备文件是在内核驱动里面通过device_create创建的,而device_create创建的设备文件默认只有root用户可读写,而hello_device_open一般是由上层APP来调用的,这些APP一般不具有root权限,这时候就导致打开设备文件失败: Hello Stub: failed to open /dev/hello -- Permission denied. 解决办法: 类似于Linux的udev规则,打开Android源代码工程目录下,修改system/core/rootdir/ueventd.rc文件,往里面添加一行

 

4、在hardware/libhardware/modules/hello目录中,新建Android.bp文件

 

        注意: LOCAL_MODULE的定义规则,hello后面跟有default, hello.default能够保证我们的模块总能被硬象抽象层加载到

5、将hello模块添加到系统

这里的目的是保证在整编译系统的时候,才会将hello模块打包到vendor.img镜像中; 需要在/hardware/libhardware/modules/Android.mk中添加hello模块

 

6、编译,执行命令

 

编译成功后,就可以在Android/out/target/product/angler/vendor/lib64/hw目录下看到hello.default.so文件了。

7、so库导入系统中

        如果不想重新打包镜像系统,这里我们可以通过adb push的方式将hello.default.so文件push到手机系统/vendor/lib64/hw/目录下,并添加777权限;可以通过adb shell命令,进入到此文件夹观察hello.default.so文件是否存在此目录下.

8、这样hello.default.so文件已经存在系统的vendor/lib64/hw文件夹中,但添加app后打开HAL层后仍报错:log显示 : Access denied finding property "ro.hardware.hello" 很明显是权限不允许。然后从Hello JNI: failed to get hello stub hw_module.的打印可以知道是 hw_get_module 的时候没有找到我们新添加的HAL层。 其实后面还有一句比较长的log

 

通过前的log我们知道,这个是selinux权限的问题,因此这里需要配置selinux的权限

修改两个文件:/system/sepolicy/prebuilts/api/29.0/public/property_contexts和/system/sepolicy/public/property_contexts

 

之后还是报错

 

还需要修改 /system/sepolicy/vendor/file_contexts

 

编译完后又发现有报错

 

还需要配置selinux权限,分别修改/system/sepolicy/private/和/system/sepolicy/prebuilts/api/29.0/private/文件夹下的file_contexts和system_server.te文件,/system/sepolicy/public/和/system/sepolicy/prebuilts/api/29.0/public/文件夹下的device.te文件

file_contexts:

 

system_server.te:

 

device.te:

 

之后重新编译完成就可以了,但是直接编译m可能会出错,也是由于权限策略的问题,可以使用命令

 

正常完成编译并打开系统应用后,初始化可以得到以下日志

 

可以发现已经找到驱动并已经打开,说明HAL层添加成功。

因为android10之后已不再支持HDIL调用,故仅支持此jni调用。

1、实现JNI

在目录新建文件: 实现JNI方法。

 

2、同时在此文件夹下修改onload.cpp文件

 

3、修改同目录下的Android.bp文件

 

4、编译,单模块编译如下

 
 

1、定义AIDL接口

在frameworks/base/core/java/android/app目录下创建IHelloManager.aidl文件

 

2、在frameworks/base/core/java/android/app目录下创建服务HelloManager.java

 

3、在frameworks/base目录下修改Android.bp文件

 

4、创建服务HelloManagerService.java

        在frameworks/base/service/core/java/com/android/server下新建hello文件夹,并在此文件夹下新建HelloManagerService.java文件

 

5、修改Context,在frameworks/base/core/java/android/content/Context.java中加入常量

 

6、在frameworks/base/services/java/com/android/server/SystemServer.java中 注册系统服务

在系統服務中startOtherService()方法中注冊自定義服務。

 

7、在frameworks/base/core/java/android/app/SystemServiceRegistry.java注册服务获取器

 

8、配置SeLinux權限

在 system/sepolicy/prebuilts/api/29.0/private/ 与 system/sepolicy/private/ 目录下,分别修改

注意:兩個目錄下文件 需要一致,即使空格和標點符號也要一致

service_contexts: 在中間插入:

 

service.te 在末尾添加

 

9、更新api

 

10、編譯

 

11、修改SDK

a、在SDK/platforms目錄下復制一份android-29(android10),並改名爲:android-311,刪除裏面的android.jar文件,並將源碼中out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes-header.jar文件復制到文件夾,其將其改名爲android.jar。

注意:我之前在编译android12源码时在上面这个文件夹下拿的classes-header.jar文件有57M,可以确定这个jar包应该包含了sdk包中android12平台下android.jar包的全部内容,并且还包含了我们自定义服务的HelloManager.class(在此jar包的/android/app/文件夹下),但android10源码编译平台编译后在此文件夹下生成的classes-header.jar包只有6.1M,虽然含有我们的HelloManager.class,但肯定不能完全包含sdk包中的android10平台下的android.jar包全部内容,故我是把android10平台编译生成的classes-header.jar包中的HelloManager.class文件拷贝到sdk中的android10平台中的android.jar中的。如果谁知道android10平台编译的完整的classes-header.jar文件是在哪个文件夹下,也可以回复我,这个完整的jar包确实我是找了好久没找到,因为我最开始是编译android12源码的,只知道android12源码编译完整的jar包是在这个文件夹下。

b、修改SDK/platforms/android-311文件夾中的source.properties、package.xml文件.

source.properties文件

 

c、復制SDK/source/android-31文件夾並更名爲android-311

修改source.properties文件

 

12、在Android Studio中配置build.gradle:

 

13、新建工程調用LanceManager自定義系統服務

 

接下来即可使用已注册的api:     

    以上就是本篇文章【android自定义驱动编译+Framework层调用android手机驱动「android自定义驱动编译+Framework层调用」】的全部内容了,欢迎阅览 ! 文章地址:http://fabua.ksxb.net/news/8623.html 
     文章      相关文章      动态      同类文章      热门文章      栏目首页      网站地图      返回首页 海之东岸资讯移动站 http://fabua.ksxb.net/mobile/ , 查看更多   
最新文章
gps定位在哪里开启手机定位在哪里打开「gps定位在哪里开启」
**GPS定位在哪里开启**在现代科技生活中,GPS定位功能已经成为我们日常出行、导航和寻找位置的重要工具。然而,不同设备的GPS开
海尔空调遥控器(海尔智家)海尔空调手机遥控「海尔空调遥控器(海尔智家)」
海尔空调遥控器是智能家居的软件,人性化的智能搜索,按型号搜索遥控器,海尔的商品全部都使用,一键设置参数,让手机变成家里智
为什么OLED屏的手机会容易烧屏?我们又该如何去尽量避免这种情况手机烧屏是什么意思「为什么OLED屏的手机会容易烧屏?我们又该如何去尽量避免这种情况」
如今随着越来越多的采用OLED屏幕手机的出现,也就逐渐的使得一个之前比较小众但在如今却不得不被重视的问题开始逐渐的受到了不少
超震撼低价 苹果iPhone 5惠州售3680元低价苹果手机「超震撼低价 苹果iPhone 5惠州售3680元」
(中关村在线广州站)16GB苹果5(行货)今日在商家“惠州随心换数码”处到货,报出了3680。16GB苹果是一款配有苹果A6处理器的前
荣耀手机哪款性价比高?值得入手的5款荣耀手机推荐荣耀手机哪款性价比高「荣耀手机哪款性价比高?值得入手的5款荣耀手机推荐」
之前荣耀依靠华为,为自己在手机市场打出一片天地,各个价位的手机层出不穷,而且使用稳定且流畅,现在虽然脱离华为,但依旧有华
苹果耳机属于什么水平苹果手机耳机「苹果耳机属于什么水平」
  苹果手机在中国一直是非常受欢迎的,而您在购买苹果手机的时候,包装内都会附赠有苹果的耳机,那么苹果耳机属于什么水平?下
电视剧江姐演员表手机电视剧演员表「电视剧江姐演员表」
  江竹筠 (丁柳元 饰)  江竹筠(1920-1949),曾用名江志炜,四川人,1920年8月20日出生于四川省自贡市大安区大山铺镇江家湾。
Meizu Pay怎么用?Meizu Pay使用操作指南魅族查找手机「Meizu Pay怎么用?Meizu Pay使用操作指南」
  Meizu Pay怎么用?哪些机型支持Meizu Pay?Meizu Pay如何进行操作?魅族正式上线MeizuPay,对于魅族用户来说是个好消息!但是Mei
苹果怎样录屏并且录声音「最新iPhone录屏的同时录音的教程」苹果手机怎样录屏「苹果怎样录屏并且录声音「最新iPhone录屏的同时录音的教程」」
php小编小新为您带来最新iphone录屏的同时录音的教程。在日常使用中,我们经常会遇到需要录制屏幕和声音的情况,比如演示操作步
如何在苹果手机上安装Java模拟器?ios手机模拟器「如何在苹果手机上安装Java模拟器?」
苹果手机是一款功能强大的智能手机,但它并不支持Java应用程序直接运行。然而,如果你想在你的苹果手机上使用Java模拟器,这是可