
- 系統(tǒng)啟動(dòng)時(shí)init進(jìn)程會(huì)創(chuàng)建Zygote進(jìn)程,Zygote進(jìn)程負(fù)責(zé)后續(xù)Android應(yīng)用程序框架層的其它進(jìn)程的創(chuàng)建和啟動(dòng)工作
- Zygote進(jìn)程會(huì)首先創(chuàng)建一個(gè)SystemServer進(jìn)程,SystemServer進(jìn)程負(fù)責(zé)啟動(dòng)系統(tǒng)的關(guān)鍵服務(wù),如包管理服務(wù)PackageManagerService和應(yīng)用程序組件管理服務(wù)ActivityManagerService
- 當(dāng)我們需要啟動(dòng)一個(gè)Android應(yīng)用程序時(shí),ActivityManagerService會(huì)通過(guò)Socket進(jìn)程間通信機(jī)制,通知Zygote進(jìn)程為這個(gè)應(yīng)用程序創(chuàng)建一個(gè)新的進(jìn)程。

Android的五層架構(gòu)從上到下依次是應(yīng)用層,應(yīng)用框架層,庫(kù)層,運(yùn)行時(shí)層以及Linux內(nèi)核層。
而在Linux中,它的啟動(dòng)可以歸為一下幾個(gè)流程:
Boot Loader-》初始化內(nèi)核-》。。。。。。
當(dāng)初始化內(nèi)核之后,就會(huì)啟動(dòng)一個(gè)相當(dāng)重要的祖先進(jìn)程,也就是init進(jìn)程,在Linux中所有的進(jìn)程都是由init進(jìn)程直接或間接fork出來(lái)的。
而對(duì)于Android來(lái)說(shuō),前面的流程都是一樣的,而當(dāng)init進(jìn)程創(chuàng)建之后,會(huì)fork出一個(gè)Zygote進(jìn)程,這個(gè)進(jìn)程是所有Java進(jìn)程的父進(jìn)程。我們知道,Linux是基于C的,而Android是基于Java的(當(dāng)然底層也是C)。所以這里就會(huì)fork出一個(gè)Zygote Java進(jìn)程用來(lái)fork出其他的進(jìn)程。
當(dāng)Zygote被初始化的時(shí)候,會(huì)fork出System Server進(jìn)程,這個(gè)進(jìn)程在整個(gè)的Android進(jìn)程中是非常重要的一個(gè),地位和Zygote等同,它是屬于Application Framework層的,Android中的所有服務(wù),例如AMS, WindowsManager,
PackageManagerService等等都是由這個(gè)SystemServer fork出來(lái)的。所以它的地位可見(jiàn)一斑。
而當(dāng)System Server進(jìn)程開(kāi)啟的時(shí)候,就會(huì)初始化AMS,同時(shí),會(huì)加載本地系統(tǒng)的服務(wù)庫(kù),創(chuàng)建系統(tǒng)上下文,創(chuàng)建ActivityThread及開(kāi)啟各種服務(wù)等等。而在這之后,就會(huì)開(kāi)啟系統(tǒng)的Launcher程序,完成系統(tǒng)界面的加載與顯示。
? 當(dāng)我們點(diǎn)擊桌面的APP圖標(biāo)時(shí),Launcher進(jìn)程會(huì)采用Binder的方式向AMS發(fā)出startActivity請(qǐng)求
? AMS在接收到請(qǐng)求之后,就會(huì)通過(guò)Socket向Zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請(qǐng)求
? Zygote進(jìn)程會(huì)fork出新的子進(jìn)程(APP進(jìn)程)
? 之后APP進(jìn)程會(huì)再向AMS發(fā)起一次請(qǐng)求,AMS收到之后經(jīng)過(guò)一系列的準(zhǔn)備工作再回傳請(qǐng)求。
? APP進(jìn)程收到AMS返回的請(qǐng)求后,會(huì)利用Handler向主線(xiàn)程發(fā)送LAUNCH_ACTIVITY消息
? 主線(xiàn)程在收到消息之后,就創(chuàng)建目標(biāo)Activity,并回調(diào)onCreate()/onStart()/onResume()等方法,UI渲染結(jié)束后便可以看到App主界面
? Android的主線(xiàn)程就是ActivityThread,主線(xiàn)程的入口方法是main方法,在main方法中系統(tǒng)會(huì)通過(guò)Looper.prepareMainLooper()來(lái)創(chuàng)建主線(xiàn)程的Looper以及MessageQueue,并通過(guò)Looper.loop來(lái)開(kāi)啟消息循環(huán),所以這一步實(shí)際上是系統(tǒng)已經(jīng)為我們做了,我們就不再需要自己來(lái)做。
ActivityThread通過(guò)AppplicationThread和AMS進(jìn)行進(jìn)程件通信,AMS以進(jìn)程間通信的方式完成ActivityThread的請(qǐng)求后會(huì)回調(diào)ApplicationThread中的Binder方法,然后ApplicationThread會(huì)向Handler發(fā)送消息,Handler收到消息后會(huì)將ApplicationThread中的邏輯切換到主線(xiàn)程中去執(zhí)行,這個(gè)過(guò)程就是主線(xiàn)程的消息循環(huán)模型。
? 上面總結(jié)到了APP開(kāi)始運(yùn)行,依次調(diào)用onCreate/onStart/onResume等方法。

第一、 引起調(diào)用AMS的對(duì)象通常有Context 、 Instrumentation、ActivityThread等調(diào)用ActivityManagerNative.getDefault()得到AMS的遠(yuǎn)程的代理ActivityManagerProxy對(duì)象。
第二、當(dāng)AMS接受到來(lái)自某個(gè)應(yīng)用程序傳來(lái)的消息后,在AMS內(nèi)部處理完畢后,會(huì)通過(guò)Binder機(jī)制回調(diào)回該應(yīng)用程序所在進(jìn)程的ApplicationThread類(lèi),即ActivityThread.java類(lèi)。
第三、當(dāng)ActivityThread接受到AMS傳遞過(guò)來(lái)的消息后,進(jìn)行內(nèi)部處理。如果需要的話(huà),會(huì)繼續(xù)與AMS通信。
最后,當(dāng)整個(gè)通信完成時(shí),ActivityThread會(huì)選擇合適的對(duì)象,例如Service、Activity、BroadcastReceiver等去做相應(yīng)的處理。
1、View.java
功能有: 繪制圖形、處理觸摸、按鍵事件等;
2、ActivityManagerService.java簡(jiǎn)稱(chēng)為 AMS
功能有:管理所有應(yīng)用程序的Activity 、內(nèi)存管理等 。
3、WindowManagerService.java簡(jiǎn)稱(chēng)為WMS
功能有:為所有應(yīng)用程序分配窗口,并管理這些窗口
AMS作為一種系統(tǒng)級(jí)服務(wù)管理所有Activity,由于AMS記錄了所有Activity的信息,當(dāng)然能夠主動(dòng)的調(diào)度這些Activity,甚至在內(nèi)存不足時(shí),主動(dòng)殺死后臺(tái)的Activity.
ActivityManagerService.java
說(shuō)明:該類(lèi)的父類(lèi)ActivityManagerNative實(shí)現(xiàn)IActivityManager,是一個(gè)Binder類(lèi), 即可實(shí)現(xiàn)跨進(jìn)程通信,因此可以接受從客戶(hù)端,例如Instrumentation、Context等調(diào)用過(guò)來(lái)的信息。
ActivityManagerService提供了全局的代理對(duì)象供IPC調(diào)用.
ActivityManagerProxy.java
說(shuō)明:該類(lèi)是遠(yuǎn)程AMS的代理,實(shí)現(xiàn)IActivityManager接口,應(yīng)用程序進(jìn)程ContextImpl,Instrumentation、ActivityThread等直接通過(guò)ActivityManagerNative.getDefault().即ActivityManagerProxy
ActivityThread:
說(shuō)明: 該類(lèi)為應(yīng)用程序(即APK包)所對(duì)應(yīng)進(jìn)程(一個(gè)進(jìn)程里可能有多個(gè)應(yīng)用程序)的主線(xiàn)程類(lèi),即我們通常所說(shuō)的UI線(xiàn)程/主線(xiàn)程,它里面存在一個(gè)main()方法,這也是APP的真正入口,當(dāng)APP啟動(dòng)時(shí),就會(huì)啟動(dòng)ActivityThread中的main方法,它會(huì)初始化一些對(duì)象,然后開(kāi)啟消息循環(huán)隊(duì)列(之后總結(jié)),之后就會(huì)Looper.loop死循環(huán),如果有消息就執(zhí)行,沒(méi)有就等著,也就是事件驅(qū)動(dòng)模型(edt)的原理
ApplicationThread:
說(shuō)明:該類(lèi)是一個(gè)Binder類(lèi),即可實(shí)現(xiàn)跨進(jìn)程通信。繼承ApplicationThreadNative繼承Binder,并且實(shí)現(xiàn)IApplicationThread接口
主要用于接受從AMS傳遞過(guò)來(lái)的消息,繼而做相應(yīng)處理,是Activity整個(gè)框架中客戶(hù)端和服務(wù)端AMS之間通信的接口,同時(shí)也是ActivityThread的內(nèi)部類(lèi)。這樣就有效的把ActivityThread和AMS綁定在一起了
ApplicationThreadProxy: 實(shí)現(xiàn)IApplicationThread接口,是遠(yuǎn)程ApplicationThread 代理類(lèi),在AMS進(jìn)程里面把ApplicationThread()
改造成ApplicationThreadProxy。
Instrumentation
說(shuō)明: 該類(lèi)用于具體操作某個(gè)Activity的功能----單向(oneway)調(diào)用AMS以及統(tǒng)計(jì)、測(cè)量該應(yīng)用程序的所有開(kāi)銷(xiāo)。一個(gè)Instrumentation類(lèi)對(duì)應(yīng)于一個(gè)進(jìn)程。每個(gè)Activity內(nèi)部都有一個(gè)該Instrumentation對(duì)象的引用。
ProcessRecord
說(shuō)明: 記錄每個(gè)進(jìn)程的里的全部信息 。 主要信息包括該進(jìn)程中包含的Activity、Provider、Service等信息、進(jìn)程文件信息、該進(jìn)程的內(nèi)存狀態(tài)信息
具體類(lèi)關(guān)系:

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 {
}