- 系統(tǒng)啟動時init進程會創(chuàng)建Zygote進程,Zygote進程負責后續(xù)Android應用程序框架層的其它進程的創(chuàng)建和啟動工作
- Zygote進程會首先創(chuàng)建一個SystemServer進程,SystemServer進程負責啟動系統(tǒng)的關鍵服務,如包管理服務PackageManagerService和應用程序組件管理服務ActivityManagerService
- 當我們需要啟動一個Android應用程序時,ActivityManagerService會通過Socket進程間通信機制,通知Zygote進程為這個應用程序創(chuàng)建一個新的進程。
Android的五層架構從上到下依次是應用層,應用框架層,庫層,運行時層以及Linux內(nèi)核層。
而在Linux中,它的啟動可以歸為一下幾個流程:
Boot Loader-》初始化內(nèi)核-》。。。。。。
當初始化內(nèi)核之后,就會啟動一個相當重要的祖先進程,也就是init進程,在Linux中所有的進程都是由init進程直接或間接fork出來的。
而對于Android來說,前面的流程都是一樣的,而當init進程創(chuàng)建之后,會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,同時,會加載本地系統(tǒng)的服務庫,創(chuàng)建系統(tǒng)上下文,創(chuàng)建ActivityThread及開啟各種服務等等。而在這之后,就會開啟系統(tǒng)的Launcher程序,完成系統(tǒng)界面的加載與顯示。
? 當我們點擊桌面的APP圖標時,Launcher進程會采用Binder的方式向AMS發(fā)出startActivity請求
? AMS在接收到請求之后,就會通過Socket向Zygote進程發(fā)送創(chuàng)建進程的請求
? Zygote進程會fork出新的子進程(APP進程)
? 之后APP進程會再向AMS發(fā)起一次請求,AMS收到之后經(jīng)過一系列的準備工作再回傳請求。
? APP進程收到AMS返回的請求后,會利用Handler向主線程發(fā)送LAUNCH_ACTIVITY消息
? 主線程在收到消息之后,就創(chuàng)建目標Activity,并回調(diào)onCreate()/onStart()/onResume()等方法,UI渲染結束后便可以看到App主界面
? Android的主線程就是ActivityThread,主線程的入口方法是main方法,在main方法中系統(tǒng)會通過Looper.prepareMainLooper()來創(chuàng)建主線程的Looper以及MessageQueue,并通過Looper.loop來開啟消息循環(huán),所以這一步實際上是系統(tǒng)已經(jīng)為我們做了,我們就不再需要自己來做。
ActivityThread通過AppplicationThread和AMS進行進程件通信,AMS以進程間通信的方式完成ActivityThread的請求后會回調(diào)ApplicationThread中的Binder方法,然后ApplicationThread會向Handler發(fā)送消息,Handler收到消息后會將ApplicationThread中的邏輯切換到主線程中去執(zhí)行,這個過程就是主線程的消息循環(huán)模型。
? 上面總結到了APP開始運行,依次調(diào)用onCreate/onStart/onResume等方法。
第一、 引起調(diào)用AMS的對象通常有Context 、 Instrumentation、ActivityThread等調(diào)用ActivityManagerNative.getDefault()得到AMS的遠程的代理ActivityManagerProxy對象。
第二、當AMS接受到來自某個應用程序傳來的消息后,在AMS內(nèi)部處理完畢后,會通過Binder機制回調(diào)回該應用程序所在進程的ApplicationThread類,即ActivityThread.java類。
第三、當ActivityThread接受到AMS傳遞過來的消息后,進行內(nèi)部處理。如果需要的話,會繼續(xù)與AMS通信。
最后,當整個通信完成時,ActivityThread會選擇合適的對象,例如Service、Activity、BroadcastReceiver等去做相應的處理。
1、View.java
功能有: 繪制圖形、處理觸摸、按鍵事件等;
2、ActivityManagerService.java簡稱為 AMS
功能有:管理所有應用程序的Activity 、內(nèi)存管理等 。
3、WindowManagerService.java簡稱為WMS
功能有:為所有應用程序分配窗口,并管理這些窗口
AMS作為一種系統(tǒng)級服務管理所有Activity,由于AMS記錄了所有Activity的信息,當然能夠主動的調(diào)度這些Activity,甚至在內(nèi)存不足時,主動殺死后臺的Activity.
ActivityManagerService.java
說明:該類的父類ActivityManagerNative實現(xiàn)IActivityManager,是一個Binder類, 即可實現(xiàn)跨進程通信,因此可以接受從客戶端,例如Instrumentation、Context等調(diào)用過來的信息。
ActivityManagerService提供了全局的代理對象供IPC調(diào)用.
ActivityManagerProxy.java
說明:該類是遠程AMS的代理,實現(xiàn)IActivityManager接口,應用程序進程ContextImpl,Instrumentation、ActivityThread等直接通過ActivityManagerNative.getDefault().即ActivityManagerProxy
ActivityThread:
說明: 該類為應用程序(即APK包)所對應進程(一個進程里可能有多個應用程序)的主線程類,即我們通常所說的UI線程/主線程,它里面存在一個main()方法,這也是APP的真正入口,當APP啟動時,就會啟動ActivityThread中的main方法,它會初始化一些對象,然后開啟消息循環(huán)隊列(之后總結),之后就會Looper.loop死循環(huán),如果有消息就執(zhí)行,沒有就等著,也就是事件驅動模型(edt)的原理
ApplicationThread:
說明:該類是一個Binder類,即可實現(xiàn)跨進程通信。繼承ApplicationThreadNative繼承Binder,并且實現(xiàn)IApplicationThread接口
主要用于接受從AMS傳遞過來的消息,繼而做相應處理,是Activity整個框架中客戶端和服務端AMS之間通信的接口,同時也是ActivityThread的內(nèi)部類。這樣就有效的把ActivityThread和AMS綁定在一起了
ApplicationThreadProxy: 實現(xiàn)IApplicationThread接口,是遠程ApplicationThread 代理類,在AMS進程里面把ApplicationThread()
改造成ApplicationThreadProxy。
Instrumentation
說明: 該類用于具體操作某個Activity的功能----單向(oneway)調(diào)用AMS以及統(tǒng)計、測量該應用程序的所有開銷。一個Instrumentation類對應于一個進程。每個Activity內(nèi)部都有一個該Instrumentation對象的引用。
ProcessRecord
說明: 記錄每個進程的里的全部信息 。 主要信息包括該進程中包含的Activity、Provider、Service等信息、進程文件信息、該進程的內(nèi)存狀態(tài)信息
具體類關系:
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 {
}