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



 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值