实现 Android 字符设备驱动

发布时间:2026/10/14 21:07:52

实现 Android 字符设备驱动 这个模块共有四篇1.实现 Android 字符设备驱动2.Android 15 及以上版本创建系统级 app 并测试驱动3.在 Android 系统中自定义 LedManagerService 服务并提供给 app 使用4.为 LedManagerService 添加区权限申请功能一、开发环境LineageOS 23.2 Android 16Ubuntu 24.04.4 LTS红米9 lancelot已解锁 BL 并刷如 LineageOS 23.2二、实现字符设备驱动这里以模拟LED为例实现一个字符设备驱动用于控制LED的亮灭。首先在 YourSource/kernel/xiaomi/mt6768/drivers/char 目录下创建一个目录 myled用于存放字符设备驱动的源文件。创建驱动文件 YourSource/kernel/xiaomi/mt6768/drivers/char/myled/myled.c#includelinux/module.h#includelinux/kernel.h#includelinux/init.h#includelinux/fs.h#includelinux/cdev.h#includelinux/uaccess.h#includelinux/miscdevice.h#defineLED_ON1#defineLED_OFF0staticintled_fd-1;staticintled_stateLED_OFF;staticssize_tmyled_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*f_pos){printk(KERN_ALERT############# myled_write ########\n);charled_on;if(count!1)return-EINVAL;if(copy_from_user(led_on,buf,1))return-EFAULT;if(led_onLED_ONled_state!LED_ON){// 确保LED硬件处于关闭状态再打开// ... 执行打开LED的操作 ...}elseif(led_onLED_OFFled_state!LED_OFF){// 确保LED硬件处于打开状态再关闭// ... 执行关闭LED的操作 ...}else{// 如果请求的LED状态与当前状态相同则无需操作return0;}led_stateled_on?LED_ON:LED_OFF;return1;}staticssize_tmyled_read(structfile*file,char__user*buf,size_tcount,loff_t*ppos){printk(KERN_ALERT############# myled_read ########\n);// 实现读逻辑return0;}staticconststructfile_operationsmyled_fops{.ownerTHIS_MODULE,.readmyled_read,.writemyled_write,};staticstructmiscdevicemyled_misc{.minorMISC_DYNAMIC_MINOR,.namemyled,.fopsmyled_fops,.mode0666,// 根据安全需求调整这里设置无效需要单独配置 SELinux 和 UAC 权限};staticint__initled_init(void){// 用 misc_register() 而非 register_chrdev()因为前者会自动处理设备号分配并触发热插拔事件简化设备节点的创建// led_fd register_chrdev(0, myleddev, myled_fops);// return 0;returnmisc_register(myled_misc);}staticvoid__exitled_exit(void){// unregister_chrdev(led_fd, myleddev);misc_deregister(myled_misc);}module_init(led_init);module_exit(led_exit);MODULE_LICENSE(GPL);MODULE_AUTHOR(LED);MODULE_DESCRIPTION(A simple LED driver for Android.);创建配置文件 YourSource/kernel/xiaomi/mt6768/drivers/char/myled/Kconfigconfig MY_LED boolMy Led Testdefaulty help This is a led demo to test kernel experiment On Android.创建 Makefile 文件 YourSource/kernel/xiaomi/mt6768/drivers/char/myled/Makefile#obj-m 会编译成 myled.o 文件,这里使用 obj-y 直接编译到 boot.img 中obj-ymyled.o三、将驱动配置到 kernelconfig 中配置好后才能编译到 boot.img 中在 YourSource/kernel/xiaomi/mt6768/drivers/char/Kconfig 中添加以下内容sourcedrivers/char/myled/Kconfig在 YourSource/kernel/xiaomi/mt6768/drivers/char/Makefile 中添加以下内容obj-ymyled/四、配置 SELinux 权限在 YourSource/device/xiaomi/mt6768-common/sepolicy/vendor/file.te 中添加以下内容#myled为led驱动定义一个设备类型以方便SELinux权限管理type myled_device,dev_type;在 YourSource/device/xiaomi/mt6768-common/sepolicy/vendor/file_contexts 中添加以下内容#myled/dev/myled u:object_r:myled_device:s0因为 myled 挂载在 /dev 下面所以在 file_contexts 中添加上面的权限即可如果是在 /sys 下面需要使用 genfscon sysfs 来添加权限请自行搜索 genfscon sysfs、genfscon debugfs 和 genfscon devtmpfs 的使用方法。在 YourSource/device/xiaomi/mt6768-common/sepolicy/vendor/system_app.te 中添加以下内容#myledallow system_app myled_device:chr_file{getattr open read write ioctl};五、配置 UAC 权限在 YourSource/device/xiaomi/mt6768-common/rootdir/etc/ueventd.mtk.rc 中添加以下内容/dev/myled 0660 system system六、编译并刷入镜像驱动在 boot 分区需要编译 boot.img 文件# 编译 boot.img 文件mka bootimage# 进入 fastboot 模式adbrebootbootloader# 刷入 boot.img 文件fastboot flash boot boot.imgSELinux 配置在 vendor 分区需要编译 vendor.img 文件# 编译 vendor.img 文件mka vendorimage# android 10 以上需要进入 fastbootd 模式adbrebootfastboot# 刷入 vendor.img 文件fastboot flash vendor vendor.img七、测试驱动验证驱动是否刷入成功执行下面的命令后显示如下则说明正确配置并刷入了。(base)testtest:~$ adb shellls-l/dev/myled crw-rw----1system system10,612026-09-2810:55 /dev/myled(base)testtest:~$ adb shellls-Z/dev/myled u:object_r:myled_device:s0 /dev/myled因为 LED 驱动在 system 域所以需要创建个系统级 app 来测试驱动。由于 Android 15 及以上版本在 app 中添加 sharedUserId“android.uid.system” 并不能实现系统级权限所以还是在下一篇中介绍怎么处理吧。八、总结驱动在 boot 分区需要编译 boot.img 文件SELinux 配置在 vendor 分区需要编译 vendor.img 文件而 Android 10 以上需要进入 fastbootd 模式
延伸阅读

更多相关文章

2026/10/14 21:07:52

微信小程序扫码连WiFi:完整源码与权限避坑指南

简介:微信扫码一键连接WiFi的小程序完整源码,专为需要在小程序端快速实现扫码配网功能的开发者准备,也适合刚接触小程序开发的学习者对照研究。压缩包共16个文件,以脚本、配置、样式表和页面结构四类文件为主,整体仅10…

2026/10/14 21:07:52

ffmpeg精准提取MP4音频:保音质、多音轨选择与时间轴对齐

简介:本资源是一套面向多媒体开发工程师、音视频处理初学者及C#/.NET开发者的技术实践包,聚焦使用FFmpeg从MP4视频中高效提取并转码为MP3音频的核心场景。内容涵盖命令行基础语法详解、质量控制参数(如-b:a 128k)、多语言调用方案…

2026/10/14 21:07:52

jdk-8u431-windows-x64.zip 环境配置与避坑指南

简介:jdk-8u431-windows-x64.zip 是面向 Java 开发者、运维人员及计算机专业学生的 JDK 1.8 第 431 次更新的 Windows 64 位安装包,适合搭建 Java 8 开发环境、维护旧有企业级应用或学习 Java 8 核心特性。压缩包共 458 个文件,约 123.33MB&a…

2026/10/14 22:34:22

RT-Thread信号量本质:资源协调而非加锁

1. 为什么信号量不是“加锁”而是“协调”——从一个死锁现场说起刚接触 RT-Thread 时,我下意识把信号量(Semaphore)当成和互斥锁(Mutex)差不多的东西:不就是“上锁—干活—解锁”三步走?直到在…

2026/10/14 22:34:22

CoNED沿海高程数据在GEE中的淹没模拟实践与避坑指南

做沿海洪水淹没评估、海平面上升情景推演、风暴潮风险制图这类工作,第一道坎几乎都卡在高程数据上。很多新手一开始去下载普通陆地DEM,拿到沿海区域一画就露馅:陆地部分看着还行,一到滩涂、河口、潮间带,要么是空的&am…

2026/10/14 22:34:22

两台Spark实测:16GB小主机如何跑稳长上下文Agent

两台 Spark 是什么?说白了,就是我自己手头两台配置差不多的本地算力小主机,我给它们起了个代号叫 Spark,一台负责跑推理服务,一台负责干 Agent 编排和杂活。这次专门拿它们来跑本地 Agent,核心就测一件事&a…

2026/10/14 22:34:22

Certbot泛域名SSL证书自动化部署与DNS-01验证实战

1. 为什么泛域名证书不再是“高级玩家专属”——从手动折腾到一键签发的实操跃迁你有没有过这样的经历:给公司新上线的五个子站(admin.example.com、api.example.com、docs.example.com、blog.example.com、staging.example.com)逐个申请SSL证…

2026/10/14 22:34:22

生产环境Agent编排的失败降级策略:从原理到代码实践

生产环境 Agent 编排:我为什么给每个环节都加了失败降级凌晨 2 点 47 分,监控告警把我从梦里拽了出来。生产环境的某个 Agent 工作流卡在了“调用外部工具”这一步,上下游全部堵死,队列里的任务越堆越多。我爬起来看了一眼日志&am…

2026/10/14 22:29:21

C#配书代码实战:从环境配置到模块拆解与异步改造指南

简介:《C#典型模块精解》配书源代码是一套面向C#初中级学习者的配套实例工程,集中展示从基础语法到高级特性的完整落地写法。内容覆盖变量与流程控制、面向对象三大特性、ADO.NET/Entity Framework数据访问、TCP/HTTP网络通信、多线程并发、Windows Form…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑