本文介紹Android系統調用介紹很好,故轉載保留,如有侵權請告知,以刪除,感謝。
本文轉載於:Android系统框架和几种调用流程 .
內容如下:——摘錄一本書中的部分章節,對理解整個Android系統的架構有幫助,轉載如下。 )
1.1.1 Android 的系統構架
要深入學習Android,首先需要學習Android的系統構架。 Android的系統構架和其操作系統一樣,
採用了分層的構架,層次非常清晰,因此要掌握它的構架並不難。下圖為為Android 的系統構架圖,如果
你對該圖已經不陌生,並且理解圖中所示的構架,那麼你可以跳過這部分內容(或者快速瀏覽) ;如果
你是第一次見到該圖,建議你詳細閱讀該部分內容,因為整本書的內容都是以這幅圖為基礎的。我們會對
圖中的每一個模塊進行詳細地分析,讓你真正掌握Android 的技術內幕。
Android 分為五層,從高層到低層分別是應用程序層(Applications) 、應用程序框架層(Application Framework) 、
系統運行庫層(Libraries和Android Runtime)和Linux內核層(Linux Kernel) 。下面分別來看各個層次為我們
提供了什麼功能,以及如何來運用這些功能。
1.應用程序層
Android會與核心應用程序包一起發布, 該應用程序包包括圖1為大家展示的主屏(Home) 、E-mail 客戶端、
SMS/MMS短消息程序、日曆、地圖、瀏覽器、聯繫人管理程序等。所有的應用程序都是使用Java語言編寫的,通過
調用應用程序框架層(Application Framework)所提供的API來完成。當然,你也可以使用Java通過JNI的方式,
配合Android NDK來開發原生的應用程序,這樣可以提高應用程序的效率,但是難度也大大增加——你需要精通C和
C++等語言,並且對Android NDK所提供的為數不多的功能有很深的認識。因為 Android NDK提供的功能不是太多,
為了避免你做了很久之後才發現——原來NDK 不支持某項功能,大家可以根據自己的需求來選擇是否採NDK 開發原生程序。
2.應用程序框架層
應用程序框架層為開發人員提供了可以完全訪問核心應用程序所使用的API 框架。該應用程序的構架設計簡化了組
件的重用,任何一個應用程序(以及任何其他應用程序)都可以發布自己的功能模塊(在遵循框架的安全性限制的前提下) 。
同樣,該應用程序重用機制也使用戶可以方便地替換程序組件。下面來看一下該層的每一個模塊為我們提供的組件,
如表 1-1所示。
系統運行庫層(Libraries和Android Runtime)和Linux內核層(Linux Kernel) 。下面分別來看各個層次為我們
提供了什麼功能,以及如何來運用這些功能。
1.應用程序層
Android會與核心應用程序包一起發布, 該應用程序包包括圖1為大家展示的主屏(Home) 、E-mail 客戶端、
SMS/MMS短消息程序、日曆、地圖、瀏覽器、聯繫人管理程序等。所有的應用程序都是使用Java語言編寫的,通過
調用應用程序框架層(Application Framework)所提供的API來完成。當然,你也可以使用Java通過JNI的方式,
配合Android NDK來開發原生的應用程序,這樣可以提高應用程序的效率,但是難度也大大增加——你需要精通C和
C++等語言,並且對Android NDK所提供的為數不多的功能有很深的認識。因為 Android NDK提供的功能不是太多,
為了避免你做了很久之後才發現——原來NDK 不支持某項功能,大家可以根據自己的需求來選擇是否採NDK 開發原生程序。
2.應用程序框架層
應用程序框架層為開發人員提供了可以完全訪問核心應用程序所使用的API 框架。該應用程序的構架設計簡化了組
件的重用,任何一個應用程序(以及任何其他應用程序)都可以發布自己的功能模塊(在遵循框架的安全性限制的前提下) 。
同樣,該應用程序重用機制也使用戶可以方便地替換程序組件。下面來看一下該層的每一個模塊為我們提供的組件,
如表 1-1所示。
3.系統運行庫層
系統運行庫層包括程序庫和Android 運行庫兩部分,下面分別來介紹這兩個部分。
(1)程序庫
Android 包含一些C/C++庫,這些庫能被Android 系統中的不同組件使用,它們通過應用程序框架為開發者提供服務,
表1-2 給出了這些核心庫的功能介紹。
系統運行庫層包括程序庫和Android 運行庫兩部分,下面分別來介紹這兩個部分。
(1)程序庫
Android 包含一些C/C++庫,這些庫能被Android 系統中的不同組件使用,它們通過應用程序框架為開發者提供服務,
表1-2 給出了這些核心庫的功能介紹。
(2)Android 運行時庫
從圖1 可以看出,Android 運行時庫又分為核心庫和Dalvik 虛擬機兩部分。核心庫提供了Java語言核心庫的大多數功能,
這裡主要通過JNI的方式向應用程序框架層提供調用底層程序庫的接口。 Dalvik 虛擬機是為了能同時高效地運行多個VMs 而實現的。
Dalvik 虛擬機執行.dex 的Dalvik可執行文件,該格式的文件針對最小內存使用做了優化。 Dalvik虛擬機是基於寄存器的,所有的類都
經由Java彙編器編譯,然後通過SDK中的dx工具轉化成.dex格式並由虛擬機執行。 Dalvik虛擬機依賴Linux的一些功能,比如線程機制
和底層的內存管理機制。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik 虛擬機實例。關於這部分內容,
先簡單向大家介紹到這裡,後面會給大家詳細分析Android SDK 工具包和Dalvik 虛擬機。
4. Linux內核層
Android依賴於Linux 2.6 版內核提供的核心系統服務,例如安全、內存管理、進程管理、網絡棧、驅動模塊等。內核作為一個抽
象層,存在於軟件棧層和硬件層之間,Android 對內核進行了增強,主要表現在以下幾個方面:
從圖1 可以看出,Android 運行時庫又分為核心庫和Dalvik 虛擬機兩部分。核心庫提供了Java語言核心庫的大多數功能,
這裡主要通過JNI的方式向應用程序框架層提供調用底層程序庫的接口。 Dalvik 虛擬機是為了能同時高效地運行多個VMs 而實現的。
Dalvik 虛擬機執行.dex 的Dalvik可執行文件,該格式的文件針對最小內存使用做了優化。 Dalvik虛擬機是基於寄存器的,所有的類都
經由Java彙編器編譯,然後通過SDK中的dx工具轉化成.dex格式並由虛擬機執行。 Dalvik虛擬機依賴Linux的一些功能,比如線程機制
和底層的內存管理機制。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik 虛擬機實例。關於這部分內容,
先簡單向大家介紹到這裡,後面會給大家詳細分析Android SDK 工具包和Dalvik 虛擬機。
4. Linux內核層
Android依賴於Linux 2.6 版內核提供的核心系統服務,例如安全、內存管理、進程管理、網絡棧、驅動模塊等。內核作為一個抽
象層,存在於軟件棧層和硬件層之間,Android 對內核進行了增強,主要表現在以下幾個方面:
到這裡, 我們對Android系統構架的分析就告一段落了, 你現在至少應該明白整個Android系統的構架和每
個模塊的功能, 以便為後面的深入學習打下基礎。 Android系統是如何啟動的?啟動過程中需要初始化什麼內容?
如果你不知道(或不完全知道)這些問題的答案,不必擔心,下一小節將剖析Android 系統啟動時的初始化操作。
1.1.2 Android 的初始化流程
上一小節分析了Android的系統構架,讓大家對Android系統有了一個深入的認識;但是,Android 系統本身非常
龐大,在深入分析每個模塊的具體功能之前,有必要對其啟動過程進行分析。我們需要了解這麼一個龐大的系統在啟動
的時候需要執行哪些初始化操作。 Android 系統在啟動時首先會啟動Linux 基礎系統,然後引導加載Linux Kernel 並
啟動初始化進程(Init) ,如圖1-1 所示。
個模塊的功能, 以便為後面的深入學習打下基礎。 Android系統是如何啟動的?啟動過程中需要初始化什麼內容?
如果你不知道(或不完全知道)這些問題的答案,不必擔心,下一小節將剖析Android 系統啟動時的初始化操作。
1.1.2 Android 的初始化流程
上一小節分析了Android的系統構架,讓大家對Android系統有了一個深入的認識;但是,Android 系統本身非常
龐大,在深入分析每個模塊的具體功能之前,有必要對其啟動過程進行分析。我們需要了解這麼一個龐大的系統在啟動
的時候需要執行哪些初始化操作。 Android 系統在啟動時首先會啟動Linux 基礎系統,然後引導加載Linux Kernel 並
啟動初始化進程(Init) ,如圖1-1 所示。
接著,啟動Linux守護進程(daemons) 。這個過程主要需要啟動以下內容,如圖1-2所示。
‰ 啟動USB守護進程(usbd)來管理USB連接。
‰ 啟動Android Debug Bridge守護進程(adbd)來管理ADB連接。
‰ 啟動Debug 守護進程(debuggerd)來管理調試進程的請求(包括內存轉換等) 。
‰ 啟動無線接口守護進程(rild)來管理無線通信。
‰ 啟動USB守護進程(usbd)來管理USB連接。
‰ 啟動Android Debug Bridge守護進程(adbd)來管理ADB連接。
‰ 啟動Debug 守護進程(debuggerd)來管理調試進程的請求(包括內存轉換等) 。
‰ 啟動無線接口守護進程(rild)來管理無線通信。
在啟動Linux守護進程的同時還需要啟動Zygote進程,如圖1-3所示。它主要包括以下需要啟動和註冊的內容:
‰ 初始化一個 Dalvik 虛擬機實例。
‰ 裝載 Socket請求所需的類和監聽。
‰ 創建虛擬機實例來管理應用程序的進程。
‰ 初始化一個 Dalvik 虛擬機實例。
‰ 裝載 Socket請求所需的類和監聽。
‰ 創建虛擬機實例來管理應用程序的進程。
runtime 進程初始化之後,runtime 進程將發送一個請求到Zygote,開始啟動系統服務,這時Zygote 將為系統服務進程建
立一個虛擬機實例,並啟動系統服務,如圖1-5 所示。
立一個虛擬機實例,並啟動系統服務,如圖1-5 所示。
緊接著,系統服務將啟動原生系統服務,主要包括Surface Flinger和Audio Flinger。這些本地系統服務將註冊到服務
管理器(Service Manager)作為IPC服務的目標, 如圖1-6所示。
管理器(Service Manager)作為IPC服務的目標, 如圖1-6所示。
系統服務將啟動Android 管理服務,Android 管理服務將都被註冊到服務管理器上,如圖1-7 所示。
最後,當系統加載完所有的服務之後會處於等待狀態,等待程序運行。但是,每一個應用程序都將啟動一個
單獨的進程。如圖1-8 所示,系統啟動了一個Home 進程和一個Contacts 進程。那麼,各個進程之間如何進行
交互呢?這就需要使用IPC機制了,後面會詳細介紹。
單獨的進程。如圖1-8 所示,系統啟動了一個Home 進程和一個Contacts 進程。那麼,各個進程之間如何進行
交互呢?這就需要使用IPC機制了,後面會詳細介紹。
到這裡, 系統的整個啟動過程就結束了, 可以在上面運行應用程序了。你也應該對Android系統啟動過程的
每一步都有了深入的理解。實際上,這個啟動過程就是從Android系統構架圖中最底層的Linux內核層一步一步加載和
註冊到應用程序框架層,最終在應用程序層運行我們自己的應用程序。那麼,各個層次之間又有什麼樣的關係呢?應用
程序在最上層又是如何調用到最底層的核心服務的呢?下一小節將為大家分析各個層次之間的關係。
1.1.3 各個層次之間的相互關係
上一小節介紹了Android 系統的啟動過程,本小節將介紹Android 應用程序是如何按照層次關係來調用最底層的硬件和
服務的。如果你對上一節的內容理解得還不夠深入,那麼可以回去再仔細地看一遍,這樣才能更好地理解本小節的內容。
好的,相信你已經準備好了,開始吧。在Android 中運行的應用程序都是通過以下三種方式來層層深入的:
‰ App→Runtime Service→Lib
‰ App→Runtime Service→Native Service→Lib
‰ App→Runtime Service→Native Daemon→Lib
下面就分別來分析這三種方式,我們還是採用流程圖的方式來為大家展示。
App→Runtime Service→Lib 方式對應的流程圖如圖1-9 所示。
每一步都有了深入的理解。實際上,這個啟動過程就是從Android系統構架圖中最底層的Linux內核層一步一步加載和
註冊到應用程序框架層,最終在應用程序層運行我們自己的應用程序。那麼,各個層次之間又有什麼樣的關係呢?應用
程序在最上層又是如何調用到最底層的核心服務的呢?下一小節將為大家分析各個層次之間的關係。
1.1.3 各個層次之間的相互關係
上一小節介紹了Android 系統的啟動過程,本小節將介紹Android 應用程序是如何按照層次關係來調用最底層的硬件和
服務的。如果你對上一節的內容理解得還不夠深入,那麼可以回去再仔細地看一遍,這樣才能更好地理解本小節的內容。
好的,相信你已經準備好了,開始吧。在Android 中運行的應用程序都是通過以下三種方式來層層深入的:
‰ App→Runtime Service→Lib
‰ App→Runtime Service→Native Service→Lib
‰ App→Runtime Service→Native Daemon→Lib
下面就分別來分析這三種方式,我們還是採用流程圖的方式來為大家展示。
App→Runtime Service→Lib 方式對應的流程圖如圖1-9 所示。
通過圖1-9我們可以看出, 在Android平台上, 應用程序首先是在應用程序層通過Binder IPC調用應用程序框架
層的Runtime Service,然後再通過JNI與運行庫中的原生服務綁定,並動態地加載Hal庫,進而調用Linux內核層
的Kernel Driver。為了便於大家更好地理解,我們通過一個實例(Location Manager)來為分析該流程,如圖1-10 所示。
層的Runtime Service,然後再通過JNI與運行庫中的原生服務綁定,並動態地加載Hal庫,進而調用Linux內核層
的Kernel Driver。為了便於大家更好地理解,我們通過一個實例(Location Manager)來為分析該流程,如圖1-10 所示。
以上就是第一種方式的調用過程,接下來我們再看一下第二種方式(App→Runtime Service→Native Service→Lib)
是如何調用的。這種方式通常被Android原生服務所採用,同樣先看一下調用流程圖,如圖1-11 所示。
是如何調用的。這種方式通常被Android原生服務所採用,同樣先看一下調用流程圖,如圖1-11 所示。
圖1-11為我們展示了Android原生服務的調用流程,可以看出,與第一種方式相比,只多了一個通過IPC機制調用原
生服務並進行動態裝載的過程。所以,這裡我們就不再重複介紹,但還是給出一個Audio 的例子,如圖1-12 所示。
生服務並進行動態裝載的過程。所以,這裡我們就不再重複介紹,但還是給出一個Audio 的例子,如圖1-12 所示。
從圖1-12 可以看出,應用程序調用了應用程序框架層的MediaPlayer,然後調用系統運行庫層的MediaPlaye。這時MediaPlaye
又分別調用了Media Framework和AudioFlinger,而後通過AudioFlinger 調用指定的庫(libaudio.so) ,最後才調用到Kernel Driver。
下面來看一下最後一種方式“App→Runtime Service→Native Daemon→Lib” ,如圖1-13所示。這種方式通常用於守護進程的連接。
又分別調用了Media Framework和AudioFlinger,而後通過AudioFlinger 調用指定的庫(libaudio.so) ,最後才調用到Kernel Driver。
下面來看一下最後一種方式“App→Runtime Service→Native Daemon→Lib” ,如圖1-13所示。這種方式通常用於守護進程的連接。
從圖1-13可以看出,這種方式比原生服務的調用更簡單,它直接通過JNI綁定原生服務,再通過sockets調用守護進程進行動態加載。
下面就來看一個簡單的例子, 電話管理(Telephony Manager)的調用就是這樣一個原生的守護進程調用,其流程如圖1-14 所示。
下面就來看一個簡單的例子, 電話管理(Telephony Manager)的調用就是這樣一個原生的守護進程調用,其流程如圖1-14 所示。
這個調用的過程非常簡單,相信圖1-14 已經表述得足夠清楚了。
1.1.4 Android 系統開發(移植)和應用開發
通過前面的學習,我們了解到Android 是一個龐大且完善的系統,我們可以基於Android來進行哪些開發工作?
每一種開發工作又有什麼不同?不同的開發工作需要掌握的技術有什麼差異?學完本小節的內容你就會知道應該如何
利用Android 來開發自己所需要的產品。因為Android 是一個開源的操作系統,所以可以選擇的開發方式主要有以下兩種:
‰ Android 系統開發(移植)
‰ Android 應用開發
1. Android系統開發(移植)
Android 系統開發(移植)屬於底層的開發工作,主要針對Android 系統本身進行完善和將其移植到其他的硬件平台,
因此需要掌握Android 系統構架中的Linux 內核層和系統運行庫層,如圖1-15 所示。 Android系統開發主要涉及 Libraries
和Android Runtime 這兩部分內容, 一般就是在本地編寫C/C++代碼,然後通過JNI 向上層提供調用接口,主要是為應用
開發提供服務等工作。 Android 系統移植則主要涉及硬件抽象層和Linux 內核層,移植的主要工作是將驅動移植到不同的硬件上,
使其能完美地運行Android 系統。這些驅動又主要包括設備驅動和Android專用驅動。
1.1.4 Android 系統開發(移植)和應用開發
通過前面的學習,我們了解到Android 是一個龐大且完善的系統,我們可以基於Android來進行哪些開發工作?
每一種開發工作又有什麼不同?不同的開發工作需要掌握的技術有什麼差異?學完本小節的內容你就會知道應該如何
利用Android 來開發自己所需要的產品。因為Android 是一個開源的操作系統,所以可以選擇的開發方式主要有以下兩種:
‰ Android 系統開發(移植)
‰ Android 應用開發
1. Android系統開發(移植)
Android 系統開發(移植)屬於底層的開發工作,主要針對Android 系統本身進行完善和將其移植到其他的硬件平台,
因此需要掌握Android 系統構架中的Linux 內核層和系統運行庫層,如圖1-15 所示。 Android系統開發主要涉及 Libraries
和Android Runtime 這兩部分內容, 一般就是在本地編寫C/C++代碼,然後通過JNI 向上層提供調用接口,主要是為應用
開發提供服務等工作。 Android 系統移植則主要涉及硬件抽象層和Linux 內核層,移植的主要工作是將驅動移植到不同的硬件上,
使其能完美地運行Android 系統。這些驅動又主要包括設備驅動和Android專用驅動。
無論是系統開發還是系統移植, 都是由底層直接操作Android的源代碼, 因此在開發之前,我們首先就需要準備Android 的源碼。
下一節將向大家詳細介紹如何獲取和編譯Andorid 的源碼,以及Android 源碼的結構。
2. Android應用開發
Android 應用開發主要是根據Android 系統所提供的API 來完成各種應用程序的編寫,所使用的API屬於Android的應用框架層,
如圖1-16所示。如果Android系統沒有提供某些API,那麼只能通過在Android 系統底層編寫C/C++代碼來開發這些API 並向
Android 應用框架層提供接口。但是筆者不建議這樣做,因為這很可能會導致你的應用程序與其他Android 系統不兼容。
下一節將向大家詳細介紹如何獲取和編譯Andorid 的源碼,以及Android 源碼的結構。
2. Android應用開發
Android 應用開發主要是根據Android 系統所提供的API 來完成各種應用程序的編寫,所使用的API屬於Android的應用框架層,
如圖1-16所示。如果Android系統沒有提供某些API,那麼只能通過在Android 系統底層編寫C/C++代碼來開發這些API 並向
Android 應用框架層提供接口。但是筆者不建議這樣做,因為這很可能會導致你的應用程序與其他Android 系統不兼容。
我們自己所開發出來的應用程序與應用層的應用程序運行在同一個層次上,因此再次提醒大家,開發應用時一定要遵循
Android API 框架的規定,以避免開發的應用程序不兼容。另外,應用開發屬於上層開發,不需要接觸底層的C/C++代碼,
所以,開發前我們只需要準備Android SDK 和模擬器即可(當然,你可能也需要使用一款IDE,推薦使用Eclipse) 。
最後,Android SDK 既可以通過編譯源碼獲得,也可以在Android 的官方網站下載編譯好的SDK。
下面將講解如何通過編譯
源碼的方式來取得Android SDK,以及SDK 的結構和開發工具包。
Android API 框架的規定,以避免開發的應用程序不兼容。另外,應用開發屬於上層開發,不需要接觸底層的C/C++代碼,
所以,開發前我們只需要準備Android SDK 和模擬器即可(當然,你可能也需要使用一款IDE,推薦使用Eclipse) 。
最後,Android SDK 既可以通過編譯源碼獲得,也可以在Android 的官方網站下載編譯好的SDK。
下面將講解如何通過編譯
源碼的方式來取得Android SDK,以及SDK 的結構和開發工具包。
其它文章
多謝分享,對我有幫助。
回覆刪除