<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • Android系統(tǒng)架構(gòu)ABC

            目錄

            創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供尚義網(wǎng)站建設(shè)、尚義做網(wǎng)站、尚義網(wǎng)站設(shè)計(jì)、尚義網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、尚義企業(yè)網(wǎng)站模板建站服務(wù),10年尚義做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

            Android系統(tǒng)架構(gòu)ABC

            1)      Android的歷史

            2)      Android系統(tǒng)框架一覽

            a)應(yīng)用程序?qū)?/p>

            b)應(yīng)用程序框架層

            c)系統(tǒng)庫(kù)和Android運(yùn)行時(shí)

            Dalvik模式的缺點(diǎn)

            ART模式(Android Runtime)的優(yōu)點(diǎn)

            d)Linux內(nèi)核

            Android開(kāi)源框架

            Android標(biāo)準(zhǔn)庫(kù)

            3)     通信基石 – Binder模式

            IPC機(jī)制種類(lèi)

            Binder通信機(jī)制簡(jiǎn)介

            為啥新發(fā)明一個(gè)Binider通信機(jī)制

            Binder通信模型

            Binder通信機(jī)制原理圖

            J2EE和Android兩種RPC的比較:

            4)     消息隊(duì)列(MessageQueue, Looper, Handler)

            5)      Framework啟動(dòng)過(guò)程: zygote進(jìn)程和system進(jìn)程

            6)     包管理服務(wù)PackageManagerService

            7)     第一個(gè)應(yīng)用程序進(jìn)程的啟動(dòng)過(guò)程

            8)      AMS活動(dòng)管理, WMS窗口管理, View系統(tǒng)的工作原理

            android內(nèi)核三大核心成員介紹

            整個(gè)Android生態(tài)系統(tǒng)工作原理概述

            9)     總結(jié)

             

            1)    Android的歷史

            了解一個(gè)事物,往往要從其出身開(kāi)始,這樣才能完整地明白它到底是什么東西。Android的歷史淵源要追溯到90年代初,Andriod之父 Andy Rubin還在蘋(píng)果子公司開(kāi)發(fā)第一代手機(jī)OS “MagicCap”開(kāi)始。

             

            我用一段話簡(jiǎn)短概述iPhone和Android,蘋(píng)果和谷歌之間的爭(zhēng)端的歷史緣由:

             

            IOS產(chǎn)生的歷史:

            Steve Jobs于1976年創(chuàng)建了蘋(píng)果公司,后于1985年離開(kāi)蘋(píng)果,創(chuàng)立了“NeXTComputer”這家公司,創(chuàng)建了一款用Object-C語(yǔ)言編寫(xiě)的叫“NeXTSTEP”的OS,之后在”NeXTSTEP”基礎(chǔ)上創(chuàng)造了“Mac OSX”系統(tǒng),這就是iPhone OS的基礎(chǔ),簡(jiǎn)稱IOS。后來(lái)1996年底,蘋(píng)果公司又收購(gòu)NeXT公司,這樣Jobs又回到了蘋(píng)果公司。

             

            Android產(chǎn)生的歷史:

            1990年,蘋(píng)果公司的手持設(shè)備部門(mén)獨(dú)立,特地成立了”GeneralMagic”的子公司,研究手機(jī)操作系統(tǒng)?!?strong>Android之父”,89年剛進(jìn)蘋(píng)果公司的26歲的年輕人——Andy Rubin,認(rèn)定手機(jī)OS發(fā)展前景良好,也加入了這個(gè)部門(mén),參與了”MagicCap” OS的開(kāi)發(fā),后于95年離開(kāi)了蘋(píng)果公司。2003年,Andy Rubin創(chuàng)建了Android公司,僅僅22個(gè)月之后,2005年被谷歌收購(gòu)!然后,谷歌Android部門(mén)立馬投入展開(kāi)了短信、手機(jī)檢索等業(yè)務(wù),同時(shí)基于Linux的通用平臺(tái)也進(jìn)入了開(kāi)發(fā)。經(jīng)過(guò)2年的研究,2007年11月5日, Android第一代系統(tǒng) 1.0 beta發(fā)布,不過(guò)只作為一個(gè)面向開(kāi)發(fā)者的軟件開(kāi)發(fā)包(SDK)進(jìn)行發(fā)布。之后經(jīng)過(guò)1年的不斷優(yōu)化,于2008年9月23日,發(fā)布Android操作系統(tǒng)中的第一個(gè)正式版本:Android 1.0,代號(hào)為鐵臂阿童木(Astro)。僅僅1年之后,便開(kāi)始了Android打敗諾基亞的Symbian,與IPhone兩分天下的輝煌時(shí)代!

             

            總而言之,無(wú)論Android還是 iPhone,都是蘋(píng)果的員工辭職之后,搞出來(lái)的。這就是Android和iPhone與蘋(píng)果公司的淵源?。?!這也是蘋(píng)果一直將安卓列為侵權(quán)產(chǎn)品的緣由。蘋(píng)果方面表示,Android系統(tǒng)創(chuàng)始人Andy Rubin有關(guān)Android系統(tǒng)的理念之一誕生于他供職蘋(píng)果期間。

             

            具體iPhone和Android產(chǎn)生的歷史淵源可以查看鏈接:

            http://tech.163.com/14/0426/11/9QOMTFMT00094ODU.html

             

            具體Android各個(gè)歷史版本可以查看鏈接:

            http://zh.wikipedia.org/zh-cn/Android%E6%AD%B7%E5%8F%B2%E7%89%88%E6%9C%AC

            2)    Android系統(tǒng)框架一覽

             

            Android系統(tǒng)架構(gòu)ABC


            a)應(yīng)用程序?qū)?/strong>

                  該層提供一些核心應(yīng)用程序包,例如電子郵件、短信、日歷、地圖、瀏覽器和聯(lián)系人管理等。同時(shí),開(kāi)發(fā)者可以利用Java語(yǔ)言設(shè)計(jì)和編寫(xiě)屬于自己的應(yīng)用程序,而這些程序與那些核心應(yīng)用程序彼此平等、友好共處。

            b) 應(yīng)用程序框架層

                該層是Android應(yīng)用開(kāi)發(fā)的基礎(chǔ),開(kāi)發(fā)人員大部分情況是在和她打交道。應(yīng)用程序框架層包括活動(dòng)管理器、窗口管理器、內(nèi)容提供者、視圖系統(tǒng)、包管理器、電話管理器、資源管理器、位置管理器、通知管理器和XMPP服務(wù)十個(gè)部分。在Android平臺(tái)上,開(kāi)發(fā)人員可以完全訪問(wèn)核心應(yīng)用程序所使用的API框架。并且,任何一個(gè)應(yīng)用程序都可以發(fā)布自身的功能模塊,而其他應(yīng)用程序則可以使用這些已發(fā)布的功能模塊?;谶@樣的重用機(jī)制,用戶就可以方便地替換平臺(tái)本身的各種應(yīng)用程序組件。

            c)系統(tǒng)庫(kù)和Android運(yùn)行時(shí)

                系統(tǒng)庫(kù)包括九個(gè)子系統(tǒng),分別是圖層管理、媒體庫(kù)、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android運(yùn)行時(shí)包括核心庫(kù)和Dalvik虛擬機(jī),前者既兼容了大多數(shù)Java語(yǔ)言所需要調(diào)用的功能函數(shù),又包括了Android的核心庫(kù),比如android.os、android.net、android.media等等。后者是一種基于寄存器的java虛擬機(jī),Dalvik虛擬機(jī)主要是完成對(duì)生命周期的管理、堆棧的管理、線程的管理、安全和異常的管理以及垃圾回收等重要功能。不過(guò),最新的AndroidL 5.0將徹底拋棄Dalvik虛擬機(jī),改用ART模式。

            Dalvik模式的缺點(diǎn):

            在Dalvik虛擬機(jī)中,因此應(yīng)用程序每次運(yùn)行的時(shí)候,一部分代碼都需要重新進(jìn)行編譯,這過(guò)程需要消耗一定的時(shí)間和降低應(yīng)用的執(zhí)行效率,最明顯的便是拖延了應(yīng)用的啟動(dòng)時(shí)間和降低運(yùn)行速度。

            ART模式(Android Runtime)的優(yōu)點(diǎn):

            通過(guò)在安裝應(yīng)用程序時(shí),自動(dòng)對(duì)程序進(jìn)行代碼預(yù)讀取編譯(可能比較耗時(shí),占用更多ROM內(nèi)存),讓程序直接編譯成機(jī)器語(yǔ)言,免去了Dalvik模式要時(shí)時(shí)轉(zhuǎn)換代碼,實(shí)現(xiàn)高效率、省電、占用更低的系統(tǒng)內(nèi)存、手機(jī)運(yùn)行流暢。

            d) Linux內(nèi)核

                Android核心系統(tǒng)服務(wù)依賴于Linux2.6內(nèi)核,如安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型。Linux內(nèi)核也是作為硬件與軟件棧的抽象層。驅(qū)動(dòng):顯示驅(qū)動(dòng)、攝像頭驅(qū)動(dòng)、鍵盤(pán)驅(qū)動(dòng)、WiFi驅(qū)動(dòng)、Audio驅(qū)動(dòng)、flash內(nèi)存驅(qū)動(dòng)、Binder(IPC)驅(qū)動(dòng)、電源管理等。

             

            Android 開(kāi)源框架

            在下面的圖中,綠色的大部分組件是基于Apache許可證開(kāi)源,其余基于GPL、LGPL和BSD。

             Android系統(tǒng)架構(gòu)ABC

            Android 標(biāo)準(zhǔn)庫(kù)

            Android系統(tǒng)架構(gòu)ABC

            3)    通信基石 – Binder模式

            在Linux中,是以進(jìn)程為單位分配和管理資源的。出于保護(hù)機(jī)制,一個(gè)進(jìn)程不能直接訪問(wèn)另一個(gè)進(jìn)程的資源,也就是說(shuō),進(jìn)程之間互相封閉

            IPC機(jī)制種類(lèi):

            1-采用命名管道(named  pipe)

            2-消息隊(duì)列(message queue)

            3-信號(hào)(signal)                

            4-共享內(nèi)存(share memory)

            5 - Socket

             

            在Android終端上的應(yīng)用軟件的通信幾乎看不到這些IPC通信方式,取而代之的是Binder方式。

             

            Binder通信機(jī)制簡(jiǎn)介

            Android系統(tǒng)架構(gòu)ABC

            Binder使用Client-Server通信方式:一個(gè)進(jìn)程作為Server提供諸如視頻/音頻解碼,視頻捕獲,地址本查詢,網(wǎng)絡(luò)連接等服務(wù);多個(gè)進(jìn)程作為Client向Server發(fā)起服務(wù)請(qǐng)求,獲得所需要的服務(wù)。要想實(shí)現(xiàn)Client-Server通信據(jù)必須實(shí)現(xiàn)以下兩點(diǎn):

             

            一,是server必須有確定的訪問(wèn)接入點(diǎn)或者說(shuō)地址來(lái)接受Client的請(qǐng)求,并且Client可以通過(guò)某種途徑獲知Server的地址

            二,是制定Command- Reply協(xié)議來(lái)傳輸數(shù)據(jù)。例如在網(wǎng)絡(luò)通信中Server的訪問(wèn)接入點(diǎn)就是Server主機(jī)的IP地址+端口號(hào),傳輸協(xié)議為T(mén)CP協(xié)議。對(duì)Binder而言,Binder可以看成Server提供的實(shí)現(xiàn)某個(gè)特定服務(wù)的訪問(wèn)接入點(diǎn), Client通過(guò)這個(gè)‘地址’向Server發(fā)送請(qǐng)求來(lái)使用該服務(wù);對(duì)Client而言,Binder可以看成是通向Server的管道入口,要想和某個(gè) Server通信首先必須建立這個(gè)管道并獲得管道入口

             

            為啥新發(fā)明一個(gè)Binider通信機(jī)制

            1,復(fù)雜度

             也可以在這些底層機(jī)制上架設(shè)一套協(xié)議來(lái)實(shí)現(xiàn)Client-Server通信,但這樣增加了系統(tǒng)的復(fù)雜性,在手機(jī)這種條件復(fù)雜,資源稀缺的環(huán)境下可靠性也難以保證。

            2,傳輸性能

            socket作為一款通用接口,其傳輸效率低,開(kāi)銷(xiāo)大,主要用在跨網(wǎng)絡(luò)的進(jìn)程間通信和本機(jī)上進(jìn)程間的低速通信。

            消息隊(duì)列和管道采用存儲(chǔ)-轉(zhuǎn)發(fā)方式,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開(kāi)辟的緩存區(qū)中,然后再?gòu)膬?nèi)核緩存區(qū)拷貝到接收方緩存區(qū),至少有兩次拷貝過(guò)程。

            共享內(nèi)存雖然無(wú)需拷貝,但控制復(fù)雜,難以使用

             

            數(shù)據(jù)拷貝次數(shù)比較圖:

            IPC進(jìn)程間通信類(lèi)型
            數(shù)據(jù)拷貝次數(shù)
            共享內(nèi)存0
            Binder1
            Socket/管道/消息隊(duì)列2
            3,安全性考慮

            Android作為一個(gè)開(kāi)放式,擁有眾多開(kāi)發(fā)者的的平臺(tái),應(yīng)用程序的來(lái)源廣泛,確保智能終端的安全是非常重要的。終端用戶不希望從網(wǎng)上下載的程序在不知情的情況下偷窺隱私數(shù)據(jù),連接無(wú)線網(wǎng)絡(luò),長(zhǎng)期操作底層設(shè)備導(dǎo)致電池很快耗盡等等。傳統(tǒng)IPC沒(méi)有任何安全措施,完全依賴上層協(xié)議來(lái)確保。

             

            首先傳統(tǒng)IPC的接收方無(wú)法獲得對(duì)方進(jìn)程可靠的UID/PID(用戶ID/進(jìn)程ID),從而無(wú)法鑒別對(duì)方身份。Android為每個(gè)安裝好的應(yīng)用程序分配了自己的UID,故進(jìn)程的UID是鑒別進(jìn)程身份的重要標(biāo)志。使用傳統(tǒng)IPC只能由用戶在數(shù)據(jù)包里填入U(xiǎn)ID/PID,但這樣不可靠,容易被惡意程序利用??煽康纳矸輼?biāo)記只有由IPC機(jī)制本身在內(nèi)核中添加。

             

            其次傳統(tǒng)IPC訪問(wèn)接入點(diǎn)是開(kāi)放的,無(wú)法建立私有通道。比如命名管道的名稱,system V的鍵值,socket的ip地址或文件名都是開(kāi)放的,只要知道這些接入點(diǎn)的程序都可以和對(duì)端建立連接,不管怎樣都無(wú)法阻止惡意程序通過(guò)猜測(cè)接收方地址獲得連接

            Binder通信模型

            • Binder框架定義了四個(gè)角色:Server,Client,ServiceManager(以后簡(jiǎn)稱SMgr)以及驅(qū)動(dòng)。

            • 其中 Server,Client,SMgr運(yùn)行于用戶空間,驅(qū)動(dòng)運(yùn)行于內(nèi)核空間。這四個(gè)角色的關(guān)系和互聯(lián)網(wǎng)類(lèi)似:Server是服務(wù)器,Client是客戶終端,SMgr是域名服務(wù)器(DNS),驅(qū)動(dòng)是路由器。

               

              Android進(jìn)程間通信的底層,都是靠binder驅(qū)動(dòng)傳輸信息, 如圖:

            Android系統(tǒng)架構(gòu)ABC

            第一步,Server給Binder實(shí)體登記

            • 和DNS類(lèi)似,SMgr的作用是將字符形式的Binder名字轉(zhuǎn)化成Client中對(duì)該Binder的引用,使得Client能夠通過(guò)Binder名字獲得對(duì)Server中Binder實(shí)體的引用。注冊(cè)了名字的Binder叫實(shí)名Binder,就象每個(gè)網(wǎng)站除了有IP地址外都有自己的網(wǎng)址

            • 。 Server創(chuàng)建了Binder實(shí)體,為其取一個(gè)字符形式,可讀易記的名字,將這個(gè)Binder連同名字以數(shù)據(jù)包的形式通過(guò)Binder驅(qū)動(dòng)發(fā)送給 SMgr,通知SMgr注冊(cè)一個(gè)名叫張三的Binder,它位于某個(gè)Server中。驅(qū)動(dòng)為這個(gè)穿過(guò)進(jìn)程邊界的Binder創(chuàng)建位于內(nèi)核中的實(shí)體節(jié)點(diǎn)以及 SMgr對(duì)實(shí)體的引用,將名字及新建的引用傳遞給SMgr。SMgr收數(shù)據(jù)包后,從中取出名字和引用填入一張查找表中。

            •  

            第二步,Client獲取Binder實(shí)體

            • Server向SMgr注冊(cè)了Binder實(shí)體及其名字后,Client就可以通過(guò)名字獲得該Binder的引用了。Client也利用保留的0號(hào)引用向SMgr請(qǐng)求訪問(wèn)某個(gè)Binder:我申請(qǐng)獲得名字叫張三的Binder的引用。

            • SMgr收到這個(gè)連接請(qǐng)求,從請(qǐng)求數(shù)據(jù)包里獲得Binder的名字,在查找表里找到該名字對(duì)應(yīng)的條目,從條目中取出Binder的引用,將該引用作為回復(fù)發(fā)送給發(fā)起請(qǐng)求的Client。從面向?qū)ο蟮慕嵌龋@個(gè)Binder對(duì)象現(xiàn)在有了兩個(gè)引用:一個(gè)位于SMgr中,一個(gè)位于發(fā)起請(qǐng)求的Client中。

            • 如果接下來(lái)有更多的Client請(qǐng)求該Binder,系統(tǒng)中就會(huì)有更多的引用指向該Binder,就象java里一個(gè)對(duì)象存在多個(gè)引用一樣。而且類(lèi)似的這些指向Binder的引用是強(qiáng)類(lèi)型,從而確保只要有引用 Binder實(shí)體就不會(huì)被釋放掉。。

            Binder通信機(jī)制原理圖

            Android系統(tǒng)架構(gòu)ABC

            J2EE和Android兩種RPC的比較:

            Android系統(tǒng)架構(gòu)ABC

            4)    消息隊(duì)列(MessageQueue,Looper, Handler)

            • 處理多線程的時(shí)候,Android繼承了java的消息隊(duì)列機(jī)制。

            • Android系統(tǒng)的消息隊(duì)列和消息循環(huán)都是針對(duì)具體線程的,一個(gè)線程可以存在(當(dāng)然也可以不存在)一個(gè)消息隊(duì)列和一個(gè)消息循環(huán)(Looper),特定線程的消息只能分發(fā)給本線程,不能進(jìn)行跨線程,跨進(jìn)程通訊。但是創(chuàng)建的工作線程默認(rèn)是沒(méi)有消息循環(huán)和消息隊(duì)列的,如果想讓該線程具有消息隊(duì)列和消息循環(huán),需要在線程中首先調(diào)用Looper.prepare()來(lái)創(chuàng)建消息隊(duì)列,然后調(diào)用Looper.loop()進(jìn)入消息循環(huán)。

               

               

            消息隊(duì)列里對(duì)象的數(shù)量對(duì)比圖
            Android系統(tǒng)架構(gòu)ABC

            Android消息隊(duì)列運(yùn)行機(jī)制原理圖
            Android系統(tǒng)架構(gòu)ABC


            5)    Framework啟動(dòng)過(guò)程: zygote進(jìn)程和system進(jìn)程

            在android中,大部分的應(yīng)用程序進(jìn)程都是由zygote來(lái)創(chuàng)建的,為什么用大部分,因?yàn)檫€有一些進(jìn)程比如系統(tǒng)引導(dǎo)進(jìn)程、init進(jìn)程等不是有zygote創(chuàng)建的。相反,zygote還是在init進(jìn)程之后才被創(chuàng)建的。

            注:init進(jìn)程是盤(pán)古開(kāi)天地級(jí)別的進(jìn)程。

            zygote在android中主要有兩個(gè)作用:

            建立運(yùn)行時(shí)環(huán)境并啟動(dòng)虛擬機(jī),

            為應(yīng)用程序創(chuàng)建DVM進(jìn)程。

              1. 啟動(dòng)SystemServer:

              2. 啟動(dòng)應(yīng)用進(jìn)程:

                 

            Zygote進(jìn)程運(yùn)行示意圖

            Android系統(tǒng)架構(gòu)ABC


             

            1,SystemService的啟動(dòng)是在Zygote進(jìn)程創(chuàng)建好后進(jìn)行的,并且由Zygote進(jìn)程建立好DVM運(yùn)行環(huán)境,加載ZygoteInit的main函數(shù),最終調(diào)用Zygote的本地方法forkSystemServer,并執(zhí)行l(wèi)inux的fork方法創(chuàng)建SystemServer進(jìn)程。

             

            2,應(yīng)用程序的進(jìn)程也是由Zygote創(chuàng)建的,在ActivityManagerService中的startProcessLocked中調(diào)用了Process.start()方法。并通過(guò)連接調(diào)用Zygote的native方法forkAndSpecialize,執(zhí)行fork任務(wù)

             

             ActivityThread啟動(dòng)過(guò)程簡(jiǎn)要序列圖

            Android系統(tǒng)架構(gòu)ABC

            6)    包管理服務(wù)PackageManagerService

            PackagemanagerService主要管理apk,其實(shí)就是管理其中的組件等,如Activiey、Service,從apk中解析其中的組件,保存到相關(guān)結(jié)構(gòu)中,以使得后面可以通過(guò)相關(guān)的接口可以查詢系統(tǒng)安裝組件,apk的安裝,卸載,刪除都是由PackageManagerService負(fù)責(zé)的。

            簡(jiǎn)言之:PMS掌管APK的生死,手里有本生死簿,類(lèi)于閻王。

            7)    第一個(gè)應(yīng)用程序進(jìn)程的啟動(dòng)過(guò)程

            啟動(dòng)過(guò)程簡(jiǎn)要序列圖

            Android系統(tǒng)架構(gòu)ABC

            8)    AMS活動(dòng)管理, WMS窗口管理, View系統(tǒng)的工作原理

            android內(nèi)核三大核心成員介紹:

            (1)WMS:WindowManager Service.Android上發(fā)生的事件,例如,觸屏,按鈕什么的都是由WMS獲取的。并且WMS負(fù)責(zé)了窗口的顯示和控制。


            (2)AMS:ActivityManager Service.總共有三部分的功能。
                  1.activity的管理調(diào)度,但是只是在全局負(fù)責(zé)activity的管理和組織,任何activty的啟動(dòng),都需要提前通知AMS,并由其進(jìn)行調(diào)度但是不干涉activity內(nèi)部的東西
                  2.內(nèi)存管理,有的時(shí)候,activity過(guò)多,可能會(huì)導(dǎo)致內(nèi)存不夠,AMS會(huì)根據(jù)內(nèi)存情況,決定殺死某個(gè) activity。
                 3.進(jìn)程管理,AMS會(huì)提供API供用戶查詢當(dāng)前activity的進(jìn)程信息。



            另外包括了兩個(gè)消息處理的類(lèi)KeyQ和InputDispatcherThread,前者是WMS的內(nèi)部類(lèi),當(dāng)它有一個(gè)對(duì)象建立的時(shí)候,將會(huì)監(jiān)聽(tīng)UI上所有的用戶操作,包括觸屏,按鍵等,并且把消息放到隊(duì)列當(dāng)中,等待應(yīng)用的調(diào)用。后者的話主要負(fù)責(zé)從前者放入的消息隊(duì)列(QueueEvent)當(dāng)中獲取相應(yīng)的消息并且以一定規(guī)則予以消息的過(guò)濾,并且發(fā)放到相應(yīng)的應(yīng)用程序當(dāng)中,類(lèi)的作用可以顧名思義。

             

            (3)View
            View是什么了,每個(gè)人都有自己的理解。在Android的官方文檔中是這樣描述的:這個(gè)類(lèi)表示了用戶界面的基本構(gòu)建模塊。一個(gè)View占用了屏幕上的一個(gè)矩形區(qū)域并且負(fù)責(zé)界面繪制和事件處理。View是用來(lái)構(gòu)建用戶界面組件(Button,Textfields等等)的基類(lèi)。ViewGroup子類(lèi)是各種布局的基類(lèi),它是個(gè)包含其他View(或其他ViewGroups)和定義這些View布局參數(shù)的容器。

             

            整個(gè)Android生態(tài)系統(tǒng)工作原理概述

            • 客戶端中的線程

            • 包含有Activity的客戶端程序至少包含3個(gè)線程,(每個(gè)Binder對(duì)應(yīng)一個(gè)線程)

            • 1、UI主線程

            • 2、ApplicationThread對(duì)象(繼承自Binder)(負(fù)責(zé)AmS的IPC調(diào)用)

            • 3、ViewRoot.W對(duì)象(繼承自Binder)        (負(fù)責(zé)WmS的IPC調(diào)用)


            Android生態(tài)系統(tǒng)工作原理圖:


            Android系統(tǒng)架構(gòu)ABC

            分三步講解整個(gè)過(guò)程:

            apk程序的運(yùn)行過(guò)程 (一)前期準(zhǔn)備

            • (看上面大圖的中上角,或者看下面的局部截圖) 

            • 首先,ActivityThread從main()函數(shù)開(kāi)始執(zhí)行,調(diào)用prepareMainLooper()為UI線程創(chuàng)建一個(gè)消息隊(duì)列(MessageQueue)。

            •  然后創(chuàng)建一個(gè)ActivityThread對(duì)象,在ActivityThread的初始化代碼中會(huì)創(chuàng)建一個(gè)H(Handler)對(duì)象和一個(gè)ApplicationThread(Binder)對(duì)象。其中Binder負(fù)責(zé)接收遠(yuǎn)程AmS的IPC調(diào)用,接收到調(diào)用后,則通過(guò)Handler把消息發(fā)送到消息隊(duì)列中,UI主線程會(huì)異步的從消息隊(duì)列中取出消息并執(zhí)行相應(yīng)的操作,比如start stop pause等。

            • 接著UI主線程調(diào)用Looper.loop()方法進(jìn)入消息循環(huán)體,進(jìn)入后就會(huì)不斷的從消息隊(duì)列中讀取并處理消息。

            Android系統(tǒng)架構(gòu)ABC

            apk程序的運(yùn)行過(guò)程 (二)啟動(dòng)Activity

            • (看上面大圖的中間部分,或者看下面的局部截圖)

            • 當(dāng)ActivityThread接收到AmS發(fā)送start某個(gè)Activity后,就會(huì)創(chuàng)建指定的Activity對(duì)象,Activity又會(huì)創(chuàng)建PhoneWindow類(lèi)——>DecorView類(lèi)——>創(chuàng)建相應(yīng)的View或者ViewGroup。

            • 創(chuàng)建完成后,Activity需要把創(chuàng)建好的界面顯示到屏幕上,于是調(diào)用WindowManager類(lèi),后者于是創(chuàng)建一個(gè)ViewRoot對(duì)象,該對(duì)象實(shí)際上創(chuàng)建了ViewRoot類(lèi)和W類(lèi),創(chuàng)建ViewRoot對(duì)象以后,WindowManager再調(diào)用WmS提供的遠(yuǎn)程調(diào)用接口完成添加一個(gè)窗口并顯示到屏幕上。

            Android系統(tǒng)架構(gòu)ABC

            apk程序的運(yùn)行過(guò)程(三)響應(yīng)用戶屏幕操作

            •  (看上面大圖最左側(cè),或者看下面的局部截圖)

            • 接下來(lái),用戶開(kāi)始在程序界面上操作,KeyQ線程不多把用戶消息存儲(chǔ)到QueueEvent隊(duì)列中,InputDispatcherThread線程逐個(gè)取出消息,然后調(diào)用WmS中的相關(guān)函數(shù)處理該消息,當(dāng)WmS發(fā)現(xiàn)該消息屬于客戶端某個(gè)窗口時(shí),就會(huì)調(diào)用相應(yīng)的窗口W接口。

            •  W類(lèi)是一個(gè)Binder,負(fù)責(zé)接收WmS的IPC調(diào)用,并把調(diào)用消息傳遞給ViewRoot,ViewRoot再把消息傳遞給UI主線程ActivityThread,ActivityThread解析該消息并作相應(yīng)的處理,在客戶端程序中,首先處理消息的是DecorView,如果DecorView不想處理該消息,則可以把該消息傳遞給其內(nèi)部包含的子View或者ViewGroup,如果還沒(méi)有處理,則傳遞給PhoneWindow,最后在傳遞給Activity。

               

               

            Android系統(tǒng)架構(gòu)ABC

            9)    總結(jié)

            本文僅從總體概念和基本原理上,介紹了Android系統(tǒng)的基本架構(gòu)、核心功能組件和工作原理,由于篇幅所限,不可能就每章每點(diǎn)都詳細(xì)講解,只是蜻蜓點(diǎn)水,一掠而過(guò),只希望能激發(fā)初學(xué)者的好奇心,通過(guò)本文所撕開(kāi)的Android外衣的一角,讓你窺到一點(diǎn)秘密,激起你對(duì)Android的興趣。如果想繼續(xù)深入了解Android的深層原理,還需要大家一起研究學(xué)習(xí)討論。讓我們一起,繼續(xù)向Android的最高殿堂前進(jìn)!

             

            —— 空谷幽蘭 2014-7-7

            本文題目:Android系統(tǒng)架構(gòu)ABC
            文章URL:http://www.jbt999.com/article14/jhdede.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、網(wǎng)站維護(hù)、域名注冊(cè)動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 欧美mv日韩mv国产网站 | 日本黄色视屏网站 | 苍井さくら在线一区二区 | 国产无码一二三 | 免费黄片网站 |