分析LightService和VibratorService较为容易些!
问题:总是看不懂Ixxx.Stub这个东西是啥?所以分析一下。
以VibratorService为例:
hardware\libhardware_legacy\vibrator\
vibrator.c
framework\
base\services\jni\
com_android_server_VibratorService.cpp
framework\base\core\java\android\os\
IVibratorService.aidl
framework\base\services\java\com\android\server\
VibratorService.java
framework\base\services\java\com\android\server\
SystemServer.java
使用服务的类:
framework\base\core\java\android\os\
SystemVibrator.java
1、首先是看服务写好后,如何使用:
ServiceManager.getService("vibrator"));返回的是一个IBinder对象,所以看得出服务都是IBinder的子类,然后通过IVibratorService.Stub.asInterface将IBinder类转成IVibratorService类并赋给mService,这样就可以通过mService来使用VibratorService里面的接口啦,like:
2、看VibratorService类如何实现?
前面说服务类都是IBinder的子类,所以VibratorService继承xxx.Stub,这个Stub是IBinder的子类。
然后VibratorService里面当然是实现所以的接口。
3、
VibratorService如何call JNI层的接口?
没错声明一下native函数就可以了。
4、JNI层如何能被call和它如何call底层代码?
com_android_server_VibratorService.cpp 中:
给对应的服务注册native方法。
而native的真正实现在
vibrator.c中。不要忘了#include <hardware_legacy/vibrator.h>
5、服务如何添加到系统中:
SystemServer.java中:
然后再回头看第一步如何使用,整个流程就清楚了!
小总结:
1、其实JNI call c/c++代码时,不一定非要用hw_module_t这种结构封装,就是不是非得用hardware.h里面的那套接口封装一下,直接定义函数就行,比如:
vibrator.c、uevent.c就没有用这套规则。
2、aidl这种思想是c/s架构,c通过binder call到s端的api,实现进程间通信,不过app层的写法和framework层写法有点不同。
3、InputManager.java和InputManagerService.java 就是binder通信的一个例子,可以再去看看。