最近有学习android的想法,并不是为了开发,
主要是为了项目管理上方便,想了解一下关于android studio,
写了一个简单的hollow world,理解了activity/service/broadcast receiver/content provider的概念。
同时大致料及了一下android的整体架构,毕竟自己也是做嵌入式的。
网上有比较清晰的资料如下:
这其中,HAL层感觉还是比较有意思,把他其中的STUB的大致的处理整理出来以便以后参照
代码的实现都是在
hardware/libhardware/include/hardware/hardware.h
hardware/libhardware/hardware.c
STUB的作用主要是让上层可以很自由的调用各个硬件的具体操作函数(这里也不是直接操作硬件)
具体的实现步骤
1:每一个操作硬件驱动(非驱动)的处理最终都编译成固定文件名(硬件类型命名的ID)的so文件,比如nfc.so
2:hardware.h中定义了hw_device_t->hw_module_t->hw_module_methods_t这三个结构体,我们需要在各个硬件的处理的so文件中重新跟他们赋值
3:hardware.c中的hw_get_module函数可以通过ID来获取hw_device_t,从而得到hw_device_t->hw_module_t->hw_module_methods_t->open的函数
(获取hw_device_t的时候用到了dlsym,它可以得到so中的具体的变量的指针)
4:然后通过open函数获取各个.so中定义的hw_device_t结构体
(注意这个结构体很可能被重写,从而实现各自不同的接口函数,而hw_get_module的调用方必须知道重写后的结构体)
5:接下来就可以调用hw_device_t的各个结构体中的回调函数来进行硬件的操作了(比如get/set)
虽然知道了HAL STUB了,具体从android的应用程序中如何调用这些HAL的接口呢?
难道是andorid APP -> JNI -> HAL Stub?