Android系统中的服务
发布时间:2024年01月11日
1.简介
- 什么是服务?什么是Android系统服务?什么是Android Native服务 什么是Android Hal服务?
- 可能很多读者看了我上篇博客会有上面的疑问,这篇博客就是来解答上面的疑问的
2.CS软件架构
- 软件开发中经常涉及CS架构,BS架构。CS架构也就是客户端服务器模型,下图就是最简单的CS架构模型,在这种模型下有多个客户端向服务端发起请求,服务端再向客户端响应请求。
- 服务端和客户端本质上来说就是一个进程,他们可能位于不同系统中,物理距离可能很大,他们也可能位于一个系统中,只是一个系统的两个进程
- 服务就是提供的一些功能,比如查询功能、登录功能、获取资源功能。最终服务都要运行到服务端也就是服务进程中,然后一直监听客户端的请求,接收请求后做出响应。客户端就是发起请求,得到想要的服务。
- CS架构比较重要的就是服务端和客户端怎么通信。
- 当客户端与服务端位于不同主机时,通信问题就是远程进程间通信问题,目前应用最多的就是网络通信,通过tcp/ip在客户端服务端传输数据,一般app与后台服务器就是这样的模型
- 当客户端与服务端位于同一个主机时,通信问题就变成本地进程间通信问题,在Linux系统、Android系统等中的服务端客户端就是这样的模型
- 本地进程间通信方式有很多,比如Linux中的管道、有名管道、消息队列、信号量、共享内存、socket等,在Android中用于服务端客户端的进程间通信使用最多的是binder通信,当然Linux的进程间通信方式也存在
3.Android中的两类进程
Android系统基于Linux内核,实现了java虚拟机
- Native进程:Android系统是基于Linux内核的,所以可以运行C/C++代码编译出的可执行程序,在Android系统中直接运行可执行程序的机器码就叫Native层
- 虚拟机进程:对于java/kotlin语言来说是不能直接编译成机器指令的,在Android系统实现了ART运行时环境同java官方的jdk实现是类似的,也就是java虚拟机,在虚拟机中才可以运行java/kotlin编译出来的dex指令。在虚拟机进程中通过JNI技术就可以实现java代码与c代码相互调用
- Hal进程:Hal进程本质上也是在Native层进程,只是功能上划分出这特殊的一层,这一层的作用就是封装硬件的功能,隔离上层与硬件操作,更加方便维护底层模块,后续升级也可以单独升级这一个分区
- 进程线程相关问题后续会在其它专题详细讲解,这儿不重点讨论
4.Android系统的各种服务
- 系统服务:Android系统服务是指运行在Android原生system_server进程的服务,system_server进程是虚拟机进程,运行java/kotlin代码向客户端提供基本功能,比如AMS服务管理系统service activity组件,PMS服务管理系统所有的安装包等
- 普通服务服务:启动一个虚拟机进程,在进程中实现服务注册到系统中,这样也是能访问的服务,但是不运行在系统system_server进程中
- Native服务:运行在Native层的进程提供的服务,这样的服务虚拟机进程通过JNI或者binder直接来获取这个服务,比如sufaceflinger显示服务控制着系统显示功能,audioflinger音频服务控制着系统麦克风录音功能喇叭播放功能等
- Hal服务:运行在Hal层的进程提供的服务,这一层的服务可以被虚拟机进程或者Native进程来访问,比如halaudio服务音频操作内核驱动节点的功能
5.从APP启动来看系统服务的作用
- APP的启动就是activity组件的启动,当然有的APP只有service,这个另说,我们主要来具体看看系统服务的作用
- Activity的启动可以通过两种方式,一个是我们点击桌面图标,然后桌面进程(Launcher)来启动被点击app的主Activity。另一个是在任意APP里面直接调用系统接口来启动一个Activty,其实这样就实现了Android多个页面的简单跳转
- startActivity这个接口就会通过binder进程间通信访问system_server进程的ATMS AMS服务,然后AMS又作为客户端通过socket向zygote进程发起创建子进程的请求,这样就创建了一个新进程,在新进程执行我们app中的代码。可以看出一个进程可以是客户端,也可以是服务端,这取决于他在干什么。Android系统之所以开发APP非常高效、迅速就是因为系统中大量的服务在为APP的接口提供保障工作
6.客户端怎么获取服务?
- 在CS架构中,其本质上是进程间通信,有远程进程间通信、本地进程间通信
- 远程进程一般通过socket来实现通信
- 本地进程Android上使用最多的是binder进程间通信,也会使用socket网络通信
- 获取服务,实现服务就是进程间通信的实现,后续会在其它专题上详细讲解binder跨进程通信、socket网络通信、以及其它的各种进程间通信方式
文章来源:https://blog.csdn.net/vampier_l/article/details/135490701
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!