Android 核心剖析

鴨脖發表於2012-10-01
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核心剖析就是圍繞以上過程進行徹底的剖析。

相關文章