一、前言
1、安卓平台分层简介
安卓系统由上往下主要分为以下几层:
系统应用层:主要是一些系统自带的APP和开发者开发的app;
Java API框架层:主要是开发所需的Android和Java的类库;
Native C/C++层:native层,主要时C和C++编写的一些类库,与Java Framework层相互调用;
Android Runtime层:主要包括运行时虚拟机和运行时所需的核心类库;
Hardware Abstraction Layer硬件抽象层:对蓝牙、音视频、传感器、相机组件的抽象;
Linux内核层:主要时Linux操作系统和各种硬件驱动;
2、安卓系统启动的简化流程
Boot ROM — Boot Loader — Kernel — init — Zygote — SystemServer — App
设备上电后首先从ROM特定区域启动loader的一个小程序,然后通过loader拉起linux内核,接着会启动第一个用户进程init,然后init进程启动Zygote进程,Zygote进程接着启动SystemServer进程,最后启动Launcher应用程序进程显示桌面图标;
二、主要进程的简要分析
1、init进程
1)、创建和挂载启动所需要的文件目录
2)、初始化和启动属性服务
3)、解析init.rc配置文件并启动Zygote进程
2、Zygote进程
所有的Java应用程序进程及系统服务SystemServer进程都由Zygote进程通过linux的fork()函数孵化出来的,Zgyote是Android中的第一个art虚拟机,他通过socket的方式与其他进程进行通信,这个其他进程主要是指SystemServer进程。Zygote进程作为服务端,主要作用如下;
1)、负责创建java虚拟机;
2)、加载系统资源;
3)、启动SystemServer进程;
4)、等待普通应用请求,创建应用程序进程,中间一般是通过AMS请求;等待的过程在runSelectLoop函数中;
3、SystemServer进程
SystemServer进程启动过程在SystemServer的main函数中,main函数又调用了run函数,主要流程如下;
注释1处先创建了主线程的looper;
注释2处创建了SystemContext;
注释3、4、5启动各种服务;
注释6开启loop循环;
//创建消息Looper
Looper.prepareMainLooper(); //1
//创建系统的Context
createSystemContext(); //2
// Start services.
traceBeginAndSlog("StartServices");
//启动引导服务
startBootstrapServices(); //3
//启动核心服务
startCoreServices(); //4
//启动其他服务
startOtherServices(); //5
// Loop forever.
Looper.loop(); //6
复制代码
注释2处函数如下:
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
复制代码
注释3处启动引导服务的函数如下所示;
在注释a处的startService会调用mServices.add(service),这个mServices是存储SystemService类型的ArrayList,用于保存所有开启的服务;
注释b处的方法会调用ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);将AMS添加到ServiceManager中,这样AMS就可以用于Binder进程间通信了;
这里我们就举例了一个引导服务中非常重要的AMS,并且没有展开介绍AMS,我们后边会单独介绍AMS,还有很多其他重要的服务我们后边也再单独介绍,例如WMS、PMS、PKMS、IMS等等;正是借助这些系统服务才使得android系统中各个应用之间有条不紊的运行;
private void startBootstrapServices() {
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService(); //a
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
、、、
// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
mActivityManagerService.setSystemProcess(); //b
traceEnd();
、、、
}
复制代码