从驱动层到应用层打通Android系统通路

本文参考CSDN大V罗升阳编写的《Android系统源码情景分析》
大纲概要
经过测试,能够打通整个安卓通路,所使用的是Android 5.02版本,在虚拟机Ubuntu系统中操作。具体代码及操作细节请参考其博客,本文仅对流程做一个总结!另外,随着安卓版本的更新,一些目录不是太准确,测试时候请注意。
为了便于描述,以hello命名驱动模块

一、添加Linux内核驱动程序

1、进入到kernel/common/drivers目录,新建hello目录,并在hello目录中增加hello.h文件
2、hello目录下增加驱动文件hello.c
3、hello目录中新增Kconfig和Makefile文件
4、修改arch/arm/Kconfig和drivers/kconfig两个文件,在menu”DeviceDrivers”和endmenu之间添加一行:source “drivers/hello/Kconfig”
5、 修改drivers/Makefile文件,添加一行:

   obj-$(CONFIG_HELLO) += hello/

6、配置编译选项

USER-NAME@MACHINE-NAME:~/Android/kernel/common$ make menuconfig

7、编译

make

之后便能发现在/dev下面挂载的hello模块了

二、HAL层模块访问Linux内核驱动程序

1、进入到在hardware/libhardware/include/hardware目录,新建hello.h文件
2、进入到hardware/libhardware/modules目录,新建hello目录,并添加hello.c文件
3、在hello目录下新建Android.mk文件
4、编译

mmm .

5、打包Android镜像

make snod

至此,在Android系统上硬件增加了一个硬件抽象层模块

三、编写jni方法提供访问HAL层接口

1、进入到frameworks/base/services/jni目录,新建com_android_server_HelloService.cpp文件
2、修改同目录下的onload.cpp文件
3、修改同目录下的Android.mk文件
4、编译

mmm .

5、打包Android镜像

make snod

四、编写APP需要用到的硬件访问服务

1、定义好通信接口
硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件服务的应用程序与这些硬件服务之间的通信需要通过代理来进行
进入到frameworks/base/core/java/android/os目录,新增IHelloService.aidl接口定义文件
2、返回到frameworks/base目录,修改Android.mk文件
3、编译IHelloService.aidl接口
4、进入到frameworks/base/services/java/com/android/server目录,新增HelloService.java文件
5、修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码
6、编译HelloService和重新打包system.img

五、编写系统级APP进行测试

1、利用AndroidStdio工具编写APP,保留Hello.java、main.xml、AndroidManifest.xml等文件
2、将Hello目录拷贝至packages/experimental目录,新增Android.mk文件
3、编译并重新打包镜像
4、这时候在模拟器中就可以看到相应的app能够调用相关驱动了

六、测试时遇到的bug

有关SELinux权限问题,会引起APP崩溃

你可能感兴趣的:(从驱动层到应用层打通Android系统通路)