本文转载自:大神

通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一下如何通过编译Android源码来手动添加一个系统服务,让编译之后的Android系统中存在我们的这个服务,每个应用都可以调用。但是本文得先介绍一下如何编写一个简单的驱动程序,先介绍了驱动程序,然后在通过JNI让framework层访问这个驱动程序,在通过注册服务来封装这个功能,最后在把这个服务添加到系统中,实现上层应用通过访问这个服务来操作驱动,当然你必须要掌握和了解 Android中如何编译源码 如果没有编译过Android源码的话,下面的内容将会看的很吃力的。

声明:本文内容参考罗升阳的书籍:《Android系统源代码情景分析》 如果想了解更详细的内容非常建议购买此书

非常感谢罗神的这本书,给我带来很多未知的知识,大神的博客地址:http://blog.csdn.net/luoshengyang

一、编写内核驱动小程序

这里不会介绍内核驱动小程序内容,因为没什么好说的,就是Linux系统api,然后在了解一下驱动的概念即可。这里主要介绍操作步骤,关于代码后面我会给出下载地址,感兴趣的同学可以自己详细看一下。

第一步:进入源码内核目录创建驱动程序目录

cd kernel/drivers

在这个目录中,我们新建一个我们自己的驱动目录freg:

看到这个目录中有很多系统的驱动程序。然后就在这个freg目录中编写驱动程序:

这里的freg.c就是驱动程序,这里,我们不会为真实的硬件设备编写内核驱动程序。为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写。

第二步:配置驱动程序编译信息

在freg目录中新增Kconfig和Makefile两个文件,其中Kconfig是在编译前执行配置命令make menuconfig时用到的:

而Makefile是执行编译命令make是用到的:

第三步:将驱动程序到系统配置中

上面配置完了驱动程序自身的编译信息,如果想把这个驱动程序编译到内核中,还需要配置内核信息,修改arch/arm/Kconfig和drivers/kconfig两个文件,在menu “Device Drivers”和endmenu之间添加一行:

source “drivers/hello/Kconfig”

  
这样,执行make menuconfig时,就可以配置hello模块的编译选项了。修改drivers/Makefile文件,添加一行:

第四步:编译内核驱动

在内核目录下运行命令:make menuconfig

“Device Drivers” => “First Android Drivers”选项,设置为y:

这样就编译驱动程序成功了,下面就开始编译内核源码

第五步:启动模拟器检查驱动程序

到源码的根目录中,运行命令:emulator -kernel ./kernel/common/arch/arm/boot/zImage &

有的同学可能会遇到这个错误,不过没关系,咋们在运行一下脚本文件:

如果运行成功的话,就可以看到模拟器了:

这时候,我们使用adb shell命令查看驱动程序的功能:

首先驱动程序肯定是存放在/dev目录中的,如果要进行操作驱动程序,需要到/proc目录中找到指定驱动程序,然后可以使用echo命令写入数据,cat命令读取数据。

到这里,我们就成功的编写了虚拟驱动程序,并且编译到内核中,通过命令访问也是测试通过了。这里采用的是系统提供的方法和驱动程序进行交互,也就是通过proc文件系统和devfs文件系统的方法。

二、编写内核驱动访问程序

有了上面的驱动程序内容,下面为了更好的方便操作这个驱动,我们可以在编写一个简单的C语言来直接访问这个驱动,而操作驱动的方法也很简单,使用open方法即可。

第一步:建立系统程序目录

进入/external/目录,新建一个freg程序目录:

第二步:编写操作驱动程序

这里的代码比较简单,在main函数中直接使用open打开驱动,然后就可以直接读写操作了

第三步:建立编译脚本,然后编译程序

在程序的同一目录下,创建编译脚本:Android.mk文件

参照如何单独编译Android源代码中的模块一文,使用mmm命令进行编译:
mmm ./external/freg
编译成功后,就可以在out/target/product/gerneric/system/bin目录下,看到可执行文件hello了。
重新打包Android系统文件system.img:
make snod
这样,重新打包后的system.img文件就包含刚才编译好的hello可执行文件了。

第四步:运行模拟器

运行模拟器的命令上面已经介绍了,这里就不在演示了,运行成功之后,就可以使用/system/bin/hello可执行程序来访问Linux内核驱动程序:

系统命令都是存放在/system/bin目录下的,我们可以看到找到我们编译的读取驱动的系统命令程序freg,然后可以运行这个程序进行驱动的读写操作了。到此就完成了使用C程序来操作驱动了。

项目案例代码:http://download.csdn.net/detail/jiangwei0910410003/9642364

三、总结

本文介绍了如何通过编译Android内核源码,来手动的编写一个简单的虚拟驱动程序,然后在写一个简单的C程序访问这个驱动,后续将会介绍如何在Framework层通过JNI来访问这个驱动。

Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】的更多相关文章

  1. Android系统篇之—-编写系统服务并且将其编译到系统源码中【转】

    本文转载自:http://www.wjdiankong.cn/android%E7%B3%BB%E7%BB%9F%E7%AF%87%E4%B9%8B-%E7%BC%96%E5%86%99%E7%B3% ...

  2. v86.01 鸿蒙内核源码分析 (静态分配篇) | 很简单的一位小朋友 | 百篇博客分析 OpenHarmony 源码

    本篇关键词:池头.池体.节头.节块 内存管理相关篇为: v31.02 鸿蒙内核源码分析(内存规则) | 内存管理到底在管什么 v32.04 鸿蒙内核源码分析(物理内存) | 真实的可不一定精彩 v33 ...

  3. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  4. 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02

    百篇博客系列篇.本篇为: v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  5. 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01

    百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...

  6. 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01

    百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  7. 鸿蒙内核源码分析(静态站点篇) | 五一哪也没去就干了这事 | 百篇博客分析OpenHarmony源码 | v52.02

    百篇博客系列篇.本篇为: v52.xx 鸿蒙内核源码分析(静态站点篇) | 五一哪也没去就干了这事 | 51.c.h.o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...

  8. 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06

    百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...

  9. 鸿蒙内核源码分析(进程回收篇) | 老父亲如何向老祖宗临终托孤 ? | 百篇博客分析OpenHarmony源码 | v47.01

    百篇博客系列篇.本篇为: v47.xx 鸿蒙内核源码分析(进程回收篇) | 临终前如何向老祖宗托孤 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

随机推荐

  1. 利用nginx搭建https服务器

    一.HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块.服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加 ...

  2. oracle中的minus数据比对

    1.要有唯一索引或者主键作为前提,减少数据冲突的数量,如示例标红的地方:   2.当有in查询的时候,尽量用exists,这样能提高查询效率: create table TF_F_USER_DIFF1 ...

  3. [译]GLUT教程 - 动画

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation 前面章节我们已经创建了一个白色三角形的窗体.还没到 ...

  4. NPOI 添加下拉列表

    需求 给指定列添加下拉列表.如下图: 思路 NPOI的文档网站不能访问了,这里参考的POI文档. 加下拉列表有两种方式,一种直接写字符串,例如 new String[]{"10", ...

  5. .net 字符串驻留

    .net中的string表达的是常量字符串. JIT编译器编译时判断遇到的常量字符串是否在内部散列表中,如果不在,添加进去.当第一次执行到含字符串的方法时,CLR会检查该字符串是否在内部的一个散列表中 ...

  6. 【JavaEE】Springmvc搭建方法及example

    现在介绍SSH的文章很多,但是适合自己需求的却经常找不到,这些东西呢,会了之后总会感觉别人的程序哪里哪里别扭,会之前呢就感觉很混乱,而且SSH的官方文档,至少在我看来是“会者勉强能看.不会者一片迷茫” ...

  7. XSD文件详解

    XSD (xml Schema Definition) Xml Schema的用途 1.  定义一个Xml文档中都有什么元素 2.  定义一个Xml文档中都会有什么属性 3.  定义某个节点的都有什么 ...

  8. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  9. rm -rf 删除文件找回

    一个不小心rm掉文件了吧? 后悔莫及了吧! 把这段代码加入你的home目录的.bashrc或者.zshrc就可以了! 工作原理: 在你的home目录会创建一个.trash文件夹 里面会按照删除时间 年 ...

  10. 【python】-- 队列(Queue)、生产者消费者模型

    队列(Queue) 在多个线程之间安全的交换数据信息,队列在多线程编程中特别有用 队列的好处: 提高双方的效率,你只需要把数据放到队列中,中间去干别的事情. 完成了程序的解耦性,两者关系依赖性没有不大 ...