android啟動及一些類含義

此圖盜用
  1. 系統(tǒng)啟動時init進程會創(chuàng)建Zygote進程,Zygote進程負責后續(xù)Android應用程序框架層的其它進程的創(chuàng)建和啟動工作
  2. Zygote進程會首先創(chuàng)建一個SystemServer進程,SystemServer進程負責啟動系統(tǒng)的關鍵服務,如包管理服務PackageManagerService和應用程序組件管理服務ActivityManagerService
  3. 當我們需要啟動一個Android應用程序時,ActivityManagerService會通過Socket進程間通信機制,通知Zygote進程為這個應用程序創(chuàng)建一個新的進程。

微信圖片_20171012164156.png

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等方法。

微信圖片_20170623113005.png

第一、 引起調(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)信息
具體類關系:

微信圖片_20170623160852.png

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

微信圖片_20170623164417.png

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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內(nèi)容