前言
Android基于Linux内核,其进程管理模型沿用Linux进程模型,但是由于Goodle为了方便App开发,将进程进行了了封装,应用层几乎看不到进程的概念,开发者接触到的只是组件的概念。
- 当按下Android设备电源键时究竟发生了什么?
- Android的启动过程是怎么样的?
- 什么是Linux内核?
- 桌面系统linux内核与Android系统linux内核有什么区别?
- 什么是引导装载程序?
- 什么是Zygote?
- 什么是X86以及ARM linux?
- 什么是init.rc?
- 什么是系统服务?
Android系统的启动
当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程,init是第一个进程,可以说它是root进程或者说有进程的父进程会启动第一个用户级别的 init进程是Linux内核启动的第一个用户级进程,
<img src=”http://jbcdn2.b0.upaiyun.com/2014/06/e516252bdb5ae1c1798ec9507a060f19.png”/ width=600>
Android进程类型
在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的fork方法创建SystemServer进程。应用程序的进程也是由Zygote创建的,在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。
- init进程
- init.rc中的Service进程
- zygote进程及守护进程rild、ServiceManager进程等
- SystemServer及其他系统服务
- Android Application进程
init进程
当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程,init是第一个进程,可以说它是root进程或者说有进程的父进程会启动第一个用户级别的 init进程是Linux内核启动的第一个用户级进程。init进程是linux系统中用户空间的第一个进程,进程号为1,有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本。
Zygote加载进程及守护进程rild、media、ServiceManager进程等
Zygote进程 service zygote /system/bin/app_process -Xzygote /system/bin –zygote
registerZygoteSocket();//登记Listen端口
startSystemServer();//启动SystemServer
Zygote进程是Android Java世界的开创者,所有的Java应用程序进程都由Zygote进程创建,在Java中,虚拟机实例会为不同的应用分配不同的内存,Android应用应该尽可能快地启动,但如果Android系统为每一个应用启动不同的Dalvik虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android系统创造了”Zygote”。Zygote让Dalvik虚拟机共享代码、低内存占用以及最小的启动时间成为可能。Zygote是一个虚拟器进程,正如我们在前一个步骤所说的在系统引导的时候启动。Zygote预加载以及初始化核心库类。通常,这些核心类一般是只读的,也是Android SDK或者核心框架的一部分。在Java虚拟机中,每一个实例都有它自己的核心库类文件和堆对象的拷贝。
- 加载ZygoteInit类,源代码:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
- registerZygoteSocket()为zygote命令连接注册一个服务器套接字。
- preloadClassed “preloaded-classes”是一个简单的包含一系列需要预加载类的文本文件,你可以在
/frameworks/base找到“preloaded-classes”文件。 - preloadResources() preloadResources也意味着本地主题、布局以及android.R文件中包含的所有东西都会用这个方法加载,在这个阶段,你可以看到启动动画。
ServiceManager守护类进程
init.rc中的Service其实都可以看做是守护进程,他们的父进程都是init。
SystemServer进程
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
由于配置了参数–start-system-server,因此SystemServer进程会伴随Zygote进程的启动而启动,SystemServer虽然也是又Zygote进程孵化出来,但和普通的应用程序进程的启动方式有所不同,这里是通过调用startSystemServer()函数来启动SystemServer进程的, 与普通的区别是没用通过socke请求开启新进程。
try {
//参数解析
parsedArgs = new ZygoteConnection.Arguments(args);
//打开系统调试属性
ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
/* 请求fork SystemServer进程*/
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
parsedArgs.debugFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
}
系统服务
完成了Zygote进程后,运行环境请求Zygote运行系统服务。系统服务同时使用native以及java编写,系统服务可以认为是一个进程。同一个系统服务在Android SDK可以以System Services形式获得。系统服务包含了所有的System Services。这些服务其实都是运行在SystemServer中,只是添加了一些Binder实体。
核心服务:
- 启动电源管理器;
- 创建Activity管理器;
- 启动电话注册;
- 启动包管理器;
- 设置Activity管理服务为系统进程;
- 启动上下文管理器;
- 启动系统Context Providers;
- 启动电池服务;
- 启动定时管理器;
- 启动传感服务;
- 启动窗口管理器;
- 启动蓝牙服务;
- 启动挂载服务。
-
其他服务:
- 启动状态栏服务;
- 启动硬件服务;
- 启动网络状态服务;
- 启动网络连接服务;
- 启动通知管理器;
- 启动设备存储监视服务;
- 启动定位管理器;
- 启动搜索服务;
- 启动剪切板服务;
- 启动登记服务;
- 启动壁纸服务;
- 启动音频服务;
- 启动耳机监听;
- 启动AdbSettingsObserver(处理adb命令)。
其实可以从代码中看出:
Installer installer = null;
AccountManagerService accountManager = null;
ContentService contentService = null;
LightsService lights = null;
PowerManagerService power = null;
DisplayManagerService display = null;
BatteryService battery = null;
VibratorService vibrator = null;
AlarmManagerService alarm = null;
MountService mountService = null;
NetworkManagementService networkManagement = null;
NetworkStatsService networkStats = null;
NetworkPolicyManagerService networkPolicy = null;
ConnectivityService connectivity = null;
WifiP2pService wifiP2p = null;
WifiService wifi = null;
NsdService serviceDiscovery= null;
IPackageManager pm = null;
Context context = null;
WindowManagerService wm = null;
BluetoothManagerService bluetooth = null;
DockObserver dock = null;
UsbService usb = null;
SerialService serial = null;
TwilightService twilight = null;
UiModeManagerService uiMode = null;
RecognitionManagerService recognition = null;
NetworkTimeUpdateService networkTimeUpdater = null;
CommonTimeManagementService commonTimeMgmtService = null;
InputManagerService inputManager = null;
TelephonyRegistry telephonyRegistry = null;
以上服务都是位于SystemServer进程中 ,并且这些服务都没注册到ServiceManager中,ServiceManager中能注册普通Service吗?