11.23 通过一个最小的服务,学习Android系统服务框架

通过一个最小的服务,学习Android系统服务框架

简介

串口服务,提供系统串口的配置、读取、管理、打开操作。

服务端

SerialService代码位于下面的路径,只有64行。一个数组类型成员变量存储系统串口名称,一个构造方法,两个功能方法和一个native方法。

Frameworks/base/services/core/java/com/android/server/SerialService.java

1. 构造方法

通过一个最小的服务,学习Android系统服务框架

通过一个最小的服务,学习Android系统服务框架

构造方法,从系统的config.xml配置文件读取系统配置的串口名称,有些系统是没有配置的,比如我看的这个系统。

2. 功能方法

通过一个最小的服务,学习Android系统服务框架

此方法供调用,返回系统支持的串口。

首先进行权限检查,然后逐个检查构造方法从系统配置文件取得的串口在当前运行的系统上是不是存在,最后返回存在的串口。返回结果是一个字符串数组。

通过一个最小的服务,学习Android系统服务框架

此方法供调用,返回串口文件描述符。

首先进行权限检查,然后检查传入的串口是否在系统配置的串口之中,如果存在就调用native方法打开串口文件,否则,抛出参数异常。

3. native方法

通过一个最小的服务,学习Android系统服务框架

native方法是Java调用C/C++函数的一种定义形式,这个过程用到JNI技术。

以上是串口服务的Java代码,编译之后生成到system/framework/service.jar。system_service进程在启动serialservice的时候,会去这个jar包里面加载serialservice.class。

4. JNI部分

Framework/base/services/core/jni/com_android_server_SerialService.cpp

通过一个最小的服务,学习Android系统服务框架

SerialService调用native_open()的时候,会调用到这个方法里面(中间有个映射关系)。很简单,主要就是调用open()方法打开文件,然后返回文件句柄。

这里就是JNI的代码。系统服务的JNI代码编译生成/system/lib/libandroid_servers.so。system_server进程在启动的时候会加载这个动态链接库。

总结一下:服务端的Java代码和JNI的C++代码都是运行在系统服务进程system_server里面。system_server进程启动的时候会先加载JNI生成的动态链接库libandroid_servers.so,然后从服务的Java代码生成的services.jar中加载对应服务的class文件,完成服务的启动。

通过一个最小的服务,学习Android系统服务框架

这段代码是SystemServer里面的,是system_server进程启动SerialService的地方。实例化SerialService后,会调用ServiceManager.addService()方法,添加串口服务到服务管理里面去,对应名字"serial"。其它进程可以通过ServiceManager.getService("serial"),取得服务实例,进行方法调用。

客户端

Android SDK里面有提供API SerialManager,顾名思义串口管理类,供开发者使用。

Frameworks/base/core/java/android/hardware/SerialManager.java

通过一个最小的服务,学习Android系统服务框架

构造方法。构造方法其实我们不用关心,因为Android SDK另外提供一个API进行系统服务实例化,所有的系统服务都可以用这个接口去实例化:

SerialManager serialManager = (SerialManager)content.getSystemService(Context.SERIAL_SERVICE);

现在就可以通过serialManager去调用串口服务提供的方法了,比如取得系统的串口:

String[] serialPorts = serialManager.getSerialPorts();

SerialManager编译生成到/system/framework/framework.jar,Java世界的第一号进程zygote在启动的时候会通过配置文件preloaded-classes加载这个jar包里面的类。

所有的APP进程都是有zygote进程克隆而来,所以这些应用进程里面都存在串口管理类,开发者的程序就可以调用这些类。

总结

客户端和服务端是通过binder IPC机制进行通讯,在了解或不了解binder原理的情况下,只需要记住,XXXManager类必定对应一个XXXService类,这样在查看Android系统源码的时候,就不会遇到障碍。(如果遇到障碍了,欢迎评论交流)


分享到:


相關文章: