Android 核心剖析
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核心剖析就是圍繞以上過程進行徹底的剖析。
相關文章
- okhttp 核心剖析HTTP
- Linux 核心剖析Linux
- Laravel核心概念剖析Laravel
- spark核心原始碼深度剖析Spark原始碼
- Java執行緒池核心原理剖析Java執行緒
- Activiyt中所有和狀態相關的回撥函式--Android核心剖析函式Android
- Android通知Notification全面剖析Android
- android視窗管理剖析Android
- Laravel 核心--深入剖析 Laravel 框架門面模式Laravel框架模式
- 為什麼寫《Tomcat核心設計剖析》Tomcat
- (PHP7核心剖析-11) 模組擴充套件PHP套件
- jQuery 原始碼剖析(一) - 核心功能函式jQuery原始碼函式
- Flink 核心元件 內部原理 多圖剖析元件
- 【Visual Leak Detector】核心原始碼剖析(VLD 2.5.1)原始碼
- 【Visual Leak Detector】核心原始碼剖析(VLD 1.0)原始碼
- ZStack原始碼剖析之核心庫鑑賞——Defer原始碼
- Qt核心剖析: 尋找 QObject 的原始碼薦QTObject原始碼
- Android核心庫Android
- Android核心分析Android
- [Android] Toast問題深度剖析(二)AndroidAST
- [Android] Toast問題深度剖析(一)AndroidAST
- Linux(核心剖析):19---中斷總體概述Linux
- 萬字剖析Ribbon核心元件以及執行原理元件
- 端智慧研發核心套件:MNN 工作臺深度剖析套件
- Guava Cache:核心引數深度剖析和原始碼分析Guava原始碼
- Android Framework核心之旅AndroidFramework
- Android核心和Linux核心的區別AndroidLinux
- Spring原始碼剖析2:初探Spring IOC核心流程Spring原始碼
- Apache Flink 進階(一):Runtime 核心機制剖析Apache
- Spring原始碼剖析1:初探Spring IOC核心流程Spring原始碼
- Laravel 核心--深入剖析 Laravel 框架 Jwt 元件的實現原理Laravel框架JWT元件
- linux系統下poll和epoll核心原始碼剖析Linux原始碼
- 剖析react核心設計原理--非同步執行排程React非同步
- 【恩墨學院】深入剖析 Group Replication核心的引擎特性
- 剖析Linux 2.6核心移植--超執行緒篇(zt)Linux執行緒
- 10分鐘剖析Android原始碼——序Android原始碼
- 另一個Android效能剖析工具——simpleperfAndroid
- 剖析 Android 架構元件之 ViewModelAndroid架構元件View