1. 驱动层
驱动代码路径device/YOUR_ISP_FACTORY/bigfish/sdk/source/kernel/linux-*.*.*/drivers/***.c
1.1 如何操作硬件?
不同硬件的操作方法不一样,比如用GPIO去控制相应的寄存器等,这个需要参考相应的技术手册。
将硬件映射为一个文件,比如/sys/devices/platform/misc_ctl/myservice_*,这样通过读写这个文件,就能操作硬件。
1.2 如何编译到Linux内核中?
修改对应的Kconfig 和 Makefile
2.HAL层
myservice : power qemu qemu_tracing uevent vibrator wifi audio and so on.
hardware/libhardware_legacy/include/hardware_legacy/myservice.h
hardware/libhardware_legacy/myservice/myservice.c --> 访问节点文件,并且提供相关的方法。
hardware/libhardware_legacy/Android.mk -->编译库
3.Service实现
frameworks/base/services/jni/com_android_server_***Service.cpp -->调用动态库中的方法
frameworks/base/services/jni/Android.mk --> 使用HAL层的动态库,编译库
frameworks/base/services/java/com/android/server/***Service.java -->通过JNI调用,并且实现Service的功能。
4.Framework层调用服务
frameworks/base/services/java/com/anroid/server/SystemServer.java -->启动和管理系统的服务
frameworks/base/core/java/android/os/I***Service.aidl --> 其他进程可以访问的Service外部接口,应用层API。
frameworks/base/core/java/android/os/***.java --> 抽象类,定义服务接口。
frameworks/base/core/java/android/os/System***.java --> ***.java的子类,通过Binder访问SM管理的Service对象,实现服务接口。
5.应用层调用服务
AndoridManifest.xml中添加相应的权限,
YourAndroidAPP.java --> getSystemService()获取服务,通过服务接口使用Service。
以上只是一个简单的粗略的流程。
要想了解具体的System Service可以查看源码。