Android中一个服务的整体分析

分析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通信的一个例子,可以再去看看。



 

你可能感兴趣的:(Android中一个服务的整体分析)