- 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作
- Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService
- 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。
Android的五层架构从上到下依次是应用层,应用框架层,库层,运行时层以及Linux内核层。
而在Linux中,它的启动可以归为一下几个流程:
Boot Loader-》初始化内核-》。。。。。。
当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的。
而对于Android来说,前面的流程都是一样的,而当init进程创建之后,会fork出一个Zygote进程,这个进程是所有Java进程的父进程。我们知道,Linux是基于C的,而Android是基于Java的(当然底层也是C)。所以这里就会fork出一个Zygote Java进程用来fork出其他的进程。
当Zygote被初始化的时候,会fork出System Server进程,这个进程在整个的Android进程中是非常重要的一个,地位和Zygote等同,它是属于Application Framework层的,Android中的所有服务,例如AMS, WindowsManager,
PackageManagerService等等都是由这个SystemServer fork出来的。所以它的地位可见一斑。
而当System Server进程开启的时候,就会初始化AMS,同时,会加载本地系统的服务库,创建系统上下文,创建ActivityThread及开启各种服务等等。而在这之后,就会开启系统的Launcher程序,完成系统界面的加载与显示。
• 当我们点击桌面的APP图标时,Launcher进程会采用Binder的方式向AMS发出startActivity请求
• AMS在接收到请求之后,就会通过Socket向Zygote进程发送创建进程的请求
• Zygote进程会fork出新的子进程(APP进程)
• 之后APP进程会再向AMS发起一次请求,AMS收到之后经过一系列的准备工作再回传请求。
• APP进程收到AMS返回的请求后,会利用Handler向主线程发送LAUNCH_ACTIVITY消息
• 主线程在收到消息之后,就创建目标Activity,并回调onCreate()/onStart()/onResume()等方法,UI渲染结束后便可以看到App主界面
• Android的主线程就是ActivityThread,主线程的入口方法是main方法,在main方法中系统会通过Looper.prepareMainLooper()来创建主线程的Looper以及MessageQueue,并通过Looper.loop来开启消息循环,所以这一步实际上是系统已经为我们做了,我们就不再需要自己来做。
ActivityThread通过AppplicationThread和AMS进行进程件通信,AMS以进程间通信的方式完成ActivityThread的请求后会回调ApplicationThread中的Binder方法,然后ApplicationThread会向Handler发送消息,Handler收到消息后会将ApplicationThread中的逻辑切换到主线程中去执行,这个过程就是主线程的消息循环模型。
• 上面总结到了APP开始运行,依次调用onCreate/onStart/onResume等方法。
第一、 引起调用AMS的对象通常有Context 、 Instrumentation、ActivityThread等调用ActivityManagerNative.getDefault()得到AMS的远程的代理ActivityManagerProxy对象。
第二、当AMS接受到来自某个应用程序传来的消息后,在AMS内部处理完毕后,会通过Binder机制回调回该应用程序所在进程的ApplicationThread类,即ActivityThread.java类。
第三、当ActivityThread接受到AMS传递过来的消息后,进行内部处理。如果需要的话,会继续与AMS通信。
最后,当整个通信完成时,ActivityThread会选择合适的对象,例如Service、Activity、BroadcastReceiver等去做相应的处理。
1、View.java
功能有: 绘制图形、处理触摸、按键事件等;
2、ActivityManagerService.java简称为 AMS
功能有:管理所有应用程序的Activity 、内存管理等 。
3、WindowManagerService.java简称为WMS
功能有:为所有应用程序分配窗口,并管理这些窗口
AMS作为一种系统级服务管理所有Activity,由于AMS记录了所有Activity的信息,当然能够主动的调度这些Activity,甚至在内存不足时,主动杀死后台的Activity.
ActivityManagerService.java
说明:该类的父类ActivityManagerNative实现IActivityManager,是一个Binder类, 即可实现跨进程通信,因此可以接受从客户端,例如Instrumentation、Context等调用过来的信息。
ActivityManagerService提供了全局的代理对象供IPC调用.
ActivityManagerProxy.java
说明:该类是远程AMS的代理,实现IActivityManager接口,应用程序进程ContextImpl,Instrumentation、ActivityThread等直接通过ActivityManagerNative.getDefault().即ActivityManagerProxy
ActivityThread:
说明: 该类为应用程序(即APK包)所对应进程(一个进程里可能有多个应用程序)的主线程类,即我们通常所说的UI线程/主线程,它里面存在一个main()方法,这也是APP的真正入口,当APP启动时,就会启动ActivityThread中的main方法,它会初始化一些对象,然后开启消息循环队列(之后总结),之后就会Looper.loop死循环,如果有消息就执行,没有就等着,也就是事件驱动模型(edt)的原理
ApplicationThread:
说明:该类是一个Binder类,即可实现跨进程通信。继承ApplicationThreadNative继承Binder,并且实现IApplicationThread接口
主要用于接受从AMS传递过来的消息,继而做相应处理,是Activity整个框架中客户端和服务端AMS之间通信的接口,同时也是ActivityThread的内部类。这样就有效的把ActivityThread和AMS绑定在一起了
ApplicationThreadProxy: 实现IApplicationThread接口,是远程ApplicationThread 代理类,在AMS进程里面把ApplicationThread()
改造成ApplicationThreadProxy。
Instrumentation
说明: 该类用于具体操作某个Activity的功能----单向(oneway)调用AMS以及统计、测量该应用程序的所有开销。一个Instrumentation类对应于一个进程。每个Activity内部都有一个该Instrumentation对象的引用。
ProcessRecord
说明: 记录每个进程的里的全部信息 。 主要信息包括该进程中包含的Activity、Provider、Service等信息、进程文件信息、该进程的内存状态信息
具体类关系:
ActivityManagerNative:
public abstract class ActivityManagerNative extends Binder implements IActivityManager{
static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj);
}
static public IActivityManager getDefault() {
return gDefault.get();
}
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};
}
ActivityManagerProxy:
class ActivityManagerProxy implements IActivityManager
{
public ActivityManagerProxy(IBinder remote)
{
mRemote = remote;
}
}
ActivityManagerService:
public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
}
ApplicationThreadNative:
public abstract class ApplicationThreadNative extends Binder
implements IApplicationThread {
static public IApplicationThread asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IApplicationThread in =
(IApplicationThread)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ApplicationThreadProxy(obj);
}
}
ApplicationThreadProxy:
class ApplicationThreadProxy implements IApplicationThread {
private final IBinder mRemote;
public ApplicationThreadProxy(IBinder remote) {
mRemote = remote;
}
}
ApplicationThread
private class ApplicationThread extends ApplicationThreadNative {
}