网上的东西有好有坏,网上的东西容易过时,这个时候,就需要我来做一个更新和整理
Android驱动开发全过程(有图有真相)
附上为我领路的 文件,表示感谢
做一下总结:
我将从从下往上的步骤进行描述:
重点:在编译过程中遇到了好几个问题,导致编译不过。具体问题和解决方法如下:
解决方法:
1. 把 create_proc_entry 方法 换为 proc_create 。
2. 然后将下边的if 语句注释掉
3. 给proc_create 最后添加一个参数 &hello_fops。
修改后的样子:(注意下边的if 语句要使用图中方式注释掉)
解决方法:
1. 将 init_MUTEX 换为 sema_init
2. 给 sema_init 添加一个参数
修改后的样子:
解决方法:
1. 添加头文件
修改后的样子:
到这儿,恭喜大家,驱动已经加载成功了!!!!!!!!
这一步只是用可执行程序来验证硬件驱动程序是否可用,用命令行就可以实现,这一步不是必须的。
这一部分,文档中写的很详细,也没有遇到什么问题。但需要注意的就是,Android.mk 文件中的每一行的末尾尽量不要出现空格,不然也许会编译不过。所以直接复制过去的童鞋们需要注意一下。
如果以前使用过 aidl (进程间通信)的话,会好理解一些,如果没有的话,建议先去看一下aidl 的相关知识。
在这一层遇到过一个问题,解了好久。
Native registration unable to find class ‘com/android/server/HelloService’, aborting
现象:无法开机,看log, HelloService 找不到。
解决步骤:
首先看一下 com_android_server_HelloService.cpp 中的register_android_server_HelloService 方法
int register_android_server_HelloService(JNIEnv *env) {
return jniRegisterNativeMethods(env, "com/android/server/HelloService", method_table,
NELEM(method_table));
这个路径是 我们 HelloService 的路径,必须一丝不差。
2、该文档中有很多处把 android 写成 Android 地方,编译时会出现很多找不到类,方法等的错误,需要注意一下。
3、如果以上都没有错误,但还是无法开机,建议把 out 目录删掉,重新进行编译。
在这一块可能出现的问题:
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 目录,里面有一个名为uevent.rc
文件,往里面添加一行:/dev/hello 0666 root root
在这儿,需要说的就是,修改完之后不要去编译 system/core ,我在本地一直无法编译通过。并且报出和很多问题,导致无法开机。所以,直接去全部编译就好了。
I/SystemServer( 461): Hello Service
I/HelloService( 461): Hello JNI: initializing……
E/HelloService( 461): Hello JNI: failed to get hello stub module.
最后报错,出现这样一个问题,是因为在全编的时候没有编译生成 hello.default.so ,所以无法找到。
解决方法:
自己编译 mmm hardware/libhardware/modules/hello/
然后 打包烧写,就可以解决这个问题了。
至于在全编的时候编译到自己添加的东西,后续再研究。
在整个流程中,遇到了许多问题,在这儿无法完全叙述出来,如果有童鞋遇到了不同的问题,可以在评论区留言,一起交流。