天天看點

Android應用架構之Application&ActivityThread

不同于其他系統,在android中application并不是一個重要的概念,甚至開發人員在開發的過程中很少需要直接與application打交道,其提供的也僅僅是一個上下文環境。至于為什麼會這樣,還是與設計者的設計思想有關。android的設計者希望呈現給使用者的是一個元件化的作業系統,開發者隻需要與<code>activity</code>,<code>service</code>,<code>broadcatreceiver</code>,<code>contentprovider</code>進行互動就行了,并且上述這些元件才是android的核心概念。

但是android畢竟是給予linux的,一個應用程式需要跑起來也必須依托于一個程序之上,所有的元件也必須寄宿在某一個程序之上。是以application實際上是一個容器或者宿主,用于盛放各個元件。

當第一個<code>activity</code>被建立時,系統會為通過<code>makeapplication</code>方法建立一個application執行個體,同時也會建立一個程序。預設情況下這個程序的名字和包名相同。當然開發者也可以通過<code>android:process=name</code>的方式設定程序名。之後再建立其他元件時,也會被放入到這個程序中。

盡管application名字聽起來很唬人,但實際上真正的應用架構在activitythread:

naivestart.main() zygoteinit.main zygoteinit$methodandargscall.run method.invoke method.invokenative activitythread.main() looper.loop() ....

以上是應用的啟動堆棧,從中可以看到真正的入口是<code>activitythread</code>。

應用程式以<code>activitythread.main()</code>為入口啟動,同時進入到<code>looper.loop()</code>建立的消息循環中。作為一個人機互動的系統,一個應用最為核心的就是消息循環與事件分發處理,而消息循環就在<code>activitythread</code>中。除此之外,<code>activitythread</code>還提供了一個<code>iactivitythread</code>接口給<code>activity service manager(ams)</code>作為與ams通信的接口。

接下來來看看<code>activitythread</code>是如何建立的。實際上<code>activitythread</code>與<code>activity manager service</code>的關系和<code>viewroot</code>與<code>window manager service</code>的關系很類似。而建立<code>activitythread</code>的過程就有點類似于<code>viewroot</code>的<code>addview</code>。其過程大緻可以分為兩個步驟:

1 activity manager建立程序

2 被建立的程序attach到activity manager,建立與am之間的聯系

在am本地用processrecord來指代一個應用程序。同時ams還維護兩個數組:mprocessnames以及mpidsselflocked。兩者存儲的對象如下圖所示:

Android應用架構之Application&amp;ActivityThread
Android應用架構之Application&amp;ActivityThread

1)activity manager service首先通過<code>startprocesslocked(processname,appinfo.uid)</code>建立一個程序對象,類型是processrecord,加入到mprocessnames數組中。在這個數組中應用通過包名和uid辨別自己,如果在同一個package中的activity,如果都使用預設設定,那麼這些activity都會托管在同一個程序中,這是因為他們在帶的applicationinfo中的processname都是一樣的。

2)android.app.activitythread程序啟動。android.app.activitythread程序建立後,将跳入到activitythread的main函數開始運作,進入消息循環。應用程序使用thread.attach()發起ams的attachapplicationlocked調用,并傳遞 actvitiythread對象和callingpid。attachapplicationlocked将根據callingpid在mpidsselflocked找到對應的processrecord執行個體app,将actvitiythread放置在app.thread中。這樣應用程序和ams建立起來雙向連接配接。am可以使用aidl接口,通過app.thread可以通路應用程序的對象。

Android應用架構之Application&amp;ActivityThread

繼續閱讀