Android 核心剖析

來源:互聯網
上載者:User

Android作業系統是基於Linux實現的,然而Android的核心價值卻不是Linux,所以說,Android的核心不是指Linux,本書不是一本介紹Linux的書。這就好比蘋果的作業系統iOS是基於Unix實現的,然而iOS的核心價值卻不是Unix。

  那麼,Android的核心是什麼,它的核心價值都包含什嗎?

  大家聽過和Android核心最多的詞語應該是“Android Framework”以及“Dalvik虛擬機器”,那麼,這兩個核心部分從內部運行機制的角度來看,到底扮演著什麼角色,彼此之間如何協同工作呢?瞭解清楚了這些,也就瞭解了所謂Android的核心價值,即Android核心。

  從進程的角度來看,Android的運行環境如所示:

  

  當Linux核心啟動後,此時系統的狀態和普通的Linux系統基本相同,通過配置Linux中的init.rc檔案,可以指定核心啟動後都要執行什麼程式,而這之後所啟動的程式才是Android系統和普通Linux應用系統的區別。

  init.rc中所啟動的一個重要進程被稱作zygote進程,如中紅色邊框所示,zygote這個英文單詞的意思是“受精卵”,本書將其稱為“種子進程”,從進程的角度來看,種子進程僅僅是一個Linux進程而已,它和一個只包含main()函數的C程式所產生的進程是同一個層級,如中雙實線邊框所示。

  種子進程裡面所啟動並執行程式基本上就是Android核心的精華所在,其內部主要完成了兩件事情。第一件事情是裝載了一段程式碼,這些代碼都是用C語言寫的,這段代碼的作用只是為了能夠執行Java編譯器編譯出的位元組碼,這段代碼就是傳說中的Java虛擬機器,在Android中稱為Dalvik虛擬機器。

  第二件事情必須基於第一件事情之後,即當Dalvik虛擬機器代碼初始化完成後,從一個名為ZygoteInit.java類中的main()函數中開始執行。這裡大家就奇怪了,Dalvik虛擬機器如何知道ZygoteInit這個Java類在哪個Jar包裡面?實際上,這個Jar包的目錄位置資訊正是在init.rc中進行配置的,只不過沒有直接指定,而是使用一個標誌符,當這個標誌符是“zygote”時,Dalvik虛擬機器就會從“寫入程式碼”的字串中得到ZygoteInit類所在的Jar包,而這個Jar包正是framework.jar。

  接下來的事情即是簡單的,又是複雜的。所謂簡單是指,ZygoteInit類中main()函數所做的事情和Linux本身就沒多大關係了,理論上完全可以在該main()函數中實現任意簡單的功能;所謂複雜是指,該main()函數中才剛剛開始啟動Android的核心功能。

  在ZygoteInit類中的main()函數中,首先載入一些類檔案,這些類將作為以後所有其它Apk程式共用的類,接著,會建立一個Socket服務端,該服務端將用於通過Socket啟動新進程。

  該進程之所以被稱為“種子”進程的原因就是,當其內部的Socket服務端收到啟動新的Apk進程的請求時,會使用Linux的一個系統調用folk()函數從自身複製出一個新的進程,新進程和Zygote進程將共用已經裝載的類,這些類都是在framework.jar中定義的。

  以上從進程的角度分析了Android核心的概念,下面從圖形化使用者介面的角度再來看看Android核心的含義。大家都知道,Linux核心所提供的功能主要包括:

  l 進程調度

  l 記憶體管理

  l 驅動模型

  這些功能都是和使用者介面沒有關係的,核心一般僅僅會通過USB介面或者RS232串口輸出一些狀態資訊,而對於視窗作業系統而言,這還遠遠不夠,最重要的就是作業系統應該提供一套使用者介面子系統,該子系統包含如何建立、刪除視窗,以及使用者如何和視窗進行互動,同時還應該提供一套介面程式庫,以便第三方開發商能夠基於該介面庫快速的開發一些視窗應用程式。而這就是Android最核心的內容,完成這些功能的代碼大部分都在那個framework.jar檔案中,Dalvik虛擬機器只不過是執行這些功能代碼的一個環境而已。

  因此,如果考慮圖形化使用者介面,則一個Android應用程式的內部關係如所示:

  

  首先,內部模組可分為三個大部分,分別是:

  第一部分,Linux驅動端。該模組重新把標準Linux驅動抽象為Android所定義的硬體介面,從而保持了Android核心代碼的獨立性,即當Linux驅動有變動時,只需要修改該適配層,而不需要再修改Android核心的代碼。該驅動端也被稱作硬體抽象層(Harware Abstarction Layout)。

  第二部分,Framework服務端,該服務端主要進行輸入訊息的處理,並將訊息傳遞給視窗管理服務線程(WmS),WmS內部會根據當前所有應用視窗的層次關係,決定應該把這個訊息派發給哪個視窗。除了WmS外,還包含一個核心執行緒元件,即Activity管理線程(AmS),Activity是Android中定義的一個程式片段,這個片段可理解為“可以被動態載入的程式”,即,當應用線程啟動後,可以根據使用者的操作,有選擇的載入不同的Activity。

  第三部分,Apk應用程式用戶端。每一個Apk應用程式的用戶端都是從ActivityThread類中的main()函數開始執行,這和一個普通的Java程式完全相同,當ActivityThread啟動後,會向AmS報告說“自己已經啟動了,請告訴我要執行哪一個Activity片段”,AmS會通過處理序間通訊(Inter
Process Communication)的方式把要載入的Activity資訊告訴給ActivityThread,從而ActivityThread執行指定的Activity,而在Activity內部會調用Framework中提供的各種添加視窗的函數進行視窗的添加和刪除。

  Android核心剖析就是圍繞以上過程進行徹底的剖析。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.