企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
前面提到,Android系统的硬件访问服务通常是在系统进程System中启动的,而系统进程System是由应用程序孵化器进程Zygote1负责启动的。由于应用程序孵化器进程Zygote是在系统启动时启动的,因此,把硬件访问服务运行在系统进程System中,就实现了开机时自动启动。 在本节中,我们把硬件访问服务FregService运行在系统进程System中,因此,进入到frameworks/base/services/java/com/android/server目录中,打开里面的SystemServer.java文件,修改ServerThread类的成员函数run的实现,如下所示。 ~~~ class ServerThread extends Thread { ...... @Override public void run() { ...... if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { ...... try { Slog.i(TAG, "Freg Service"); ServiceManager.addService("freg", new FregService()); } catch (Throwable e) { Slog.e(TAG, "Failure starting Freg Service", e); } } ...... } ...... } ~~~ 系统进程System在启动时,会创建一个ServerThread线程来启动系统中的关键服务,其中就包括一些硬件访问服务。在ServerThread类的成员函数run中,首先创建一个FregService实例,然后把它注册到Service Manager中。Service Manager是Android系统的Binder进程间通信机制的一个重要角色,它负责管理系统中的服务对象。注册到Service Manager中的服务对象都有一个对应的名称,使用这些服务的Client进程就是通过这些名称来向Service Manager请求它们的Binder代理对象接口的,以便可以访问它们所提供的服务。硬件访问服务FregService注册到Service Manager之后,它的启动过程就完成了。 最后,我们需要执行mmm命令来重新编译services模块。 ~~~ USER@MACHINE:~/Android$ mmm ./frameworks/base/services/java/ ~~~ 编译后得到的services.jar文件就包含有硬件访问服务FregService,并且在系统启动时,将它运行在系统进程System中。 至此,硬件访问服务FregService就完全实现好了。我们可以执行make snod命令来重新打包Android系统镜像文件system.img。 ~~~ USER@MACHINE:~/Android$ make snod ~~~ 在接下来的2.5小节中,我们将开发一个Android应用程序来访问虚拟硬件设备freg的寄存器val的值,这是通过调用硬件访问服务FregService的成员函数setVal和getVal实现的。 > 注: > 1. 第11章将详细分析应用程序孵化器进程Zygote。