Android启动各种系统服务线程
SystemServer进程在Android的运行环境中扮演了"神经中枢"的作用,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。下面就来介绍到底都有哪些服务线程,及其启动的顺序。
SystemServer的main()函数首先调用的是init1()函数,这是一个native函数,内部会进行一些与Dalvik虚拟机相关的初始化工作。该函数执行完毕后,其内部会调用Java端的init2()函数,这就是为什么Java源码中没有引用init2()的地方,主要的系统服务都是在init2()函数中完成的。
该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,如以下代码所示:
public static final void init2() { Slog.i(TAG, "Entered the Android system server!"); Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start(); }
于是,从ServerThread的run()方法内部开始真正启动各种服务线程。
基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种,如图所示。
模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。
模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。
模式三是指从服务类的main()函数中开始执行。
无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动,当然这些都是服务类内部自定义的。为了区分以上启动的不同,以下采用一种新的方式描述该启动过程。比如当一个服务对象是通过模式一创建,并调用init()完成该服务的启动,我们就用模式1.2表示;如果构造函数返回后就已经启动,而无须任何其他调用,即什么都不做(nothing),我们就用模式1.1表示。
表中列出了SystemServer中所启动的所有服务,以及这些服务的启动模式。
SystemServer中启动服务列表
服务类名称 |
作用描述 |
启动模式 |
EntropyService |
提供伪随机数 |
1.0 |
PowerManagerService |
电源管理服务 |
1.2/3 |
ActivityManagerService |
最核心的服务之一,管理Activity |
自定义 |
TelephonyRegistry |
通过该服务注册电话模块的事件响应,比如重启、关闭、启动等 |
1.0 |
PackageManagerService |
程序包管理服务 |
3.3 |
AccountManagerService |
账户管理服务,是指联系人账户,而不是Linux系统的账户 |
1.0 |
ContentService |
ContentProvider服务,提供跨进程数据交换 |
3.0 |
BatteryService |
电池管理服务 |
1.0 |
LightsService |
自然光强度感应传感器服务 |
1.0 |
VibratorService |
震动器服务 |
1.0 |
AlarmManagerService |
定时器管理服务,提供定时提醒服务 |
1.0 |
WindowManagerService |
Framework最核心的服务之一,负责窗口管理 |
3.3 |
BluetoothService |
蓝牙服务 |
1.0 + |
DevicePolicyManagerService |
提供一些系统级别的设置及属性 |
1.3 |
StatusBarManagerService |
状态栏管理服务 |
1.3 |
ClipboardService |
系统剪切板服务 |
1.0 |
InputMethodManagerService |
输入法管理服务 |
1.0 |
NetStatService |
网络状态服务 |
1.0 |
NetworkManagementService |
网络管理服务 |
NMS.create() |
ConnectivityService |
网络连接管理服务 |
2.3 |
ThrottleService |
暂不清楚其作用 |
1.3 |
AccessibilityManagerService |
辅助管理程序截获所有的用户输入,并根据这 些输入给用户一些额外的反馈,起到辅助的效果 |
1.0 |
MountService |
挂载服务,可通过该服务调用Linux层面的mount程序 |
1.0 |
NotificationManagerService |
通知栏管理服务,Android中的通知栏和状 态栏在一起,只是界面上前者在左边,后者在右边 |
1.3 |
DeviceStorageMonitorService |
磁盘空间状态检测服务 |
1.0 |
LocationManagerService |
地理位置服务 |
1.3 |
SearchManagerService |
搜索管理服务 |
1.0 |
DropBoxManagerService |
通过该服务访问Linux层面的Dropbox程序 |
1.0 |
WallpaperManagerService |
墙纸管理服务,墙纸不等同于桌面背景, 在View系统内部,墙纸可以作为任何窗口的背景 |
1.3 |
AudioService |
音频管理服务 |
1.0 |
BackupManagerService |
系统备份服务 |
1.0 |
AppWidgetService |
Widget服务 |
1.3 |
RecognitionManagerService |
身份识别服务 |
1.3 |
DiskStatsService |
磁盘统计服务 |
1.0 |
AmS的启动模式如下:
调用main()函数,返回一个Context对象,而不是AmS服务本身。
调用AmS.setSystemProcess()。
调用AmS.installProviders()。
调用systemReady(),当AmS执行完systemReady()后,会相继启动相关联服务的systemReady()函数,完成整体初始化。
关于具体某个服务的内部启动过程,请参照源码,这些过程一般都比较简单。
SystemServer.java文件目录:frameworks\base\services\java\com\android\server\SystemServer.java
该文件中定义了另外一个类:ServerThread(ServerThread extends Thread )
参考:http://book.51cto.com/art/201109/291271.htm
另外:
参考:http://webservices.ctocio.com.cn/4/12163004_5.shtml Android系统进程Zygote启动过程的源代码分析
发表评论
-
资料上传备份
2012-07-02 07:28 0对付对付对付对付 -
Android-sharedUserId数据权限
2012-05-02 10:16 1444Android-sharedUserId数据权限 An ... -
Android Service学习之本地服务
2012-04-18 10:28 862转: Android Service学习之本地服务 htt ... -
match_parent和fill_parent的区别 .
2012-02-18 11:49 1839match_parent和fill_parent的区别 有 ... -
Android中SQLiteOpenHelper类的onUpgrade方法的作用
2012-02-09 11:50 4600Android中SQLiteOpenHelper类的onUpg ... -
android
2012-02-08 09:22 0Android数据库内容变化的监听 首先介绍内容监 ... -
在线升级Android应用程序的思路
2012-02-07 11:34 876在线升级Android应用程序的思路 http://www. ... -
Android数据库内容变化的监听
2012-02-07 11:31 6032Android数据库内容变化的监听 首先介绍内容监 ... -
android中的数据库操作
2012-02-07 10:50 1449android中的数据库操作 ... -
SQLiteOpenHelper类与自动升级数据库
2012-02-07 10:31 2281SQLiteOpenHelper类与自动升级数据库 S ... -
SQLite外键的实现
2012-02-07 10:30 1715SQLite外键的实现 SQLite现在的版本还不支持 ... -
Android到处都在使用的回调分析
2011-12-21 15:53 3545Android到处都在使用的回调分析 ... -
android中LayoutInflater的使用
2011-12-21 11:35 1932android中LayoutInflater的使用 ... -
SIM卡满处理流程分析
2011-12-19 15:15 1881SIM卡满处理流程分析 //框架层分析 // SMSD ... -
短信发送状态报告流程分析
2011-12-19 15:07 2392短信发送状态报告流程分析 //应用层分析: //Sms ... -
Android平台 短信接送流程剖析(含编码)
2011-12-16 15:29 3227Android平台 短信接送流程剖析(含编码) ... -
修改语言环境方法
2011-12-16 15:20 1038修改语言环境方法 private void se ... -
Android平台 短信发送流程剖析(含编码)
2011-12-12 17:12 4333Android平台 短信发送流程剖析(含编码) 本文对A ... -
Android 应用程序签名
2011-11-27 11:34 1641Android 应用程序签名 转:http://www ... -
理解Android 上的安全性
2011-11-27 11:18 1473理解 Android 上的安全性 ...
相关推荐
本文将深入解析Android线程启动的方法,并通过源代码示例帮助初学者理解和掌握这一关键技能。 Android系统基于Java,因此其线程机制遵循Java的基本规则,但同时也有一些特定于Android平台的特性。在Android中,主要...
在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或大计算量的任务。本篇文章将深入探讨如何合理地结束Android中的线程,以确保应用程序的性能和稳定性。 首先,理解...
在Android系统中,服务(Service)是一种用于在后台执行长时间运行操作的应用组件。它们不提供用户界面,但可以与其他组件(如Activity)交互。当需要使用C语言(Native代码)来实现系统服务时,这通常涉及到Android...
在Android开发中,后台多任务多线程断点下载是一项重要的功能,特别是在处理大文件时,如游戏安装包、视频或者其他大型数据包。这个过程涉及到多个关键知识点,下面将逐一详细解释。 首先,**Android后台服务...
最近在将 HevSocks5Client 移植到 Android 上了,在经过增加 signalfd 和 timerfd 相关的系统调用支持后,就可以直接使用 NDK 编译出 executable 了。直接的 native exectuable 在 Android 系统总还是不太方便用哦。...
当应用程序启动时,系统会自动创建一个主线程,通常称为UI线程或主线程,它负责处理所有与用户界面(UI)相关的事件,如按键、触摸屏事件以及屏幕绘制等。这意味着所有的UI更新操作都必须在这个线程中执行,以确保UI...
另外,从Android 3.0(API level 11)开始,AsyncTask在后台运行的线程池大小由系统决定,可能导致并发任务执行顺序不确定。因此,对于复杂的多线程需求,可能需要考虑使用其他的并发控制机制,如IntentService、...
Android系统默认在主线程(UI线程)执行所有的用户交互,如果在这个线程中执行耗时操作,会导致应用程序无响应(ANR)。因此,理解并熟练掌握多线程管理对于开发流畅的Android应用至关重要。 ### 1. 主线程与工作...
本文将深入探讨如何创建一个Android启动页,解决图片被拉伸和压缩的问题,以及如何适配虚拟导航栏。 首先,我们需要了解启动页的基本结构。一个简单的启动页通常由一个SplashActivity组成,该Activity会在应用启动...
Android 自动启动服务,也可以手动启动或停止指定的服务,这只是一个例子,演示在android环境下,如何在后台自动运行Service。 public void onDestroy() {//重写的onDestroy方法 myThread.flag = false;//停止...
当应用程序启动时,系统会自动创建这个线程。为了确保用户界面的响应性,耗时的操作如网络请求、数据库操作或大量计算不应在主线程中执行,否则会导致UI卡顿,甚至触发ANR(Application Not Responding)错误。 ...
本文将深入探讨Android线程的概念、类型以及如何有效地利用线程进行编程,包括各种经典用法,并提供完整的代码示例。 一、Android线程基础 在Android系统中,主线程也称为UI线程,负责处理用户界面的所有交互。由于...
在开发跨平台应用程序时,Qt框架提供了一个强大的工具集,允许开发者在多个...这个过程需要对Qt、Android服务、JNI以及多线程编程有深入的理解。理解并掌握这些技术,将有助于开发出更高效、更可靠的Android应用程序。
在Android开发中,多线程下载是一项常见的技术,特别是在处理大文件或网络资源时,为了提高下载速度和用户体验,开发者通常会采用多线程来分块下载数据。Android Studio作为官方推荐的Android集成开发环境,提供了...
Android系统默认运行在一个单线程环境中,即主线程,也被称为UI线程。主线程主要负责处理UI更新、用户交互事件。如果在主线程中执行耗时操作,应用程序将会出现“Application Not Responding”(ANR)错误,用户体验...
在Android系统中,服务(Service)是一种特殊类型的组件,它在后台长时间运行,即使用户界面不在前台也可以执行任务。服务通常用于处理不需用户交互但需要持续运行的任务,如播放音乐、定时任务或者网络通信等。本...
在`SurfaceCreated`回调中,我们通常会启动一个自定义的绘图线程,比如`RenderThread`。这个线程负责在`Surface`上进行绘制操作,确保与UI线程分离,避免阻塞UI。 ```java private class RenderThread extends ...
在 Android 系统中,Launcher 应用程序的启动过程是由 ActivityManagerService 启动的,而 ActivityManagerService 和 PackageManagerService 一样,都是在开机时由 SystemServer 组件启动的。SystemServer 组件首先...
总之,"android 多任务+多线程+断点下载"项目涵盖了Android开发中的多个核心知识点,包括多线程与服务的使用、网络请求、文件管理、UI优化和状态保存。这些技术对于构建高效、流畅的Android下载应用至关重要。