人們老是喜歡從將陌生的事物和本身所瞭解的東西關聯起來,以加深對未知事物的瞭解,這一講咱們從windows操做系統提及,逐步引領帶你們走入android的世界。寫任何程序都須要知道程序運行的原理和環境,就好比開發winform程序,你至少須要知道操做系統的原理,CLR運行時,瞭解一些經常使用的C/C++庫。誠然,你不須要所有了解得很清楚也能寫出很不錯的應用程序,可是你瞭解的越清楚,鑽研得越透徹,那麼你越能開發出適合於你所在平臺的、更優化的應用程序。譬如在windows操做系統上,你的程序是這樣運行的:java
那麼android之上你的程序是如何運行的呢?一圖勝千言:linux
爲了避免讓朋友們一進來就看得昏頭昏腦的,這張圖我簡化了不少,簡單介紹下:android
Linux kernel:管理你手機硬件的驅動程序,包含相機驅動、藍牙驅動、wifi驅動等等,提供給上層調用。你沒看錯,android用的就是精巧成熟的Linux內核。程序員
C/C++ libraries:C/C++的庫,包含webkit,openGL(喜歡玩遊戲的朋友這裏看),最重要的是包含一個sqllite,你沒看錯,喜歡嚐鮮的.Net朋友都玩過的最流行的嵌入式數據庫,在你手機裏面躺着呢。你的聯繫人啊,短信什麼的,都存在這個裏面的。 (對妹子聯繫人啊短信啊有什麼想法很差,嗯,要相互信任。)web
Android運行時:這裏最重要的是dalvik虛擬機。咱們知道java應用程序運行在jvm虛擬機上(至關於CLR運行時),顯然手機的功耗和PC不能比,因此google對jvm作了大量優化,因而便誕生了dalvik虛擬機,原來的Java應用程序的運行方式爲:xx.java->xx.class->jvm執行,如今的Java應用程序執行方式爲:xx.java->xx.class->xx.dex->dalvik執行。這一點你們內心有數就行,咱們雖然是速成android,但也是保質保量的:)sql
Android framework:android提供的一系列java系統服務,供應用程序調用以實現功能。數據庫
直接上圖:windows
簡單說明以下:架構
一 android啓動時會首先加載linux kerner,而後啓動Init進程,這點和linux系統一致。框架
二 Init進程對各類設備初始化,分別介紹以下:
1 Zygote:每當java應用程序運行時,zygote便會派生出一個子進程來執行java應用程序,該子進程即是用來執行java應用程序的虛擬機。
2 System Server :android系統的一個核心進程,由Zygote進程派生,它創建了android的大部分java服務,譬如地理位置信息服務等。
3 Media Server:運行基於C/C++的本地系統服務,好比相機等。
4 Content manager:這就是一個適配器模式的實現,不論是本地C/C++服務仍是系統java服務,都得來這裏報道,最後統一給java應用程序提供API調用。
5 Daemons:鏈接管理服務。包含USB鏈接管理,無線通訊鏈接管理,最重要的是ADB(android debugger birdge)鏈接管理,可讓你手機裏運行的異常信息,顯示在你的eclipse裏面。這點咱們後面會用到。
這張圖引出了Android最重要的四大核心概念之一:服務。即Android的大部分功能都是以服務的形式存在的,不論是你是進程間通信的IPC,仍是遠程過程調用RPC,在android中都是調用一系列的服務,這是否是有點像SOA的架構體系呢。軟件設計的最終目地,都是爲了易於維護,易於拓展,方便複用等等。而解耦是其中很關鍵的一步。看來不論是.Net仍是android,軟件的思想是通用的。您說呢?
這裏再簡單的介紹下JNI和NDK,從上面的講解中咱們知道,android的本地庫雖然是以服務的形式註冊在Context Manager中,可是若是現有的註冊的服務沒法知足功能、恰恰您又知道它的本地庫有這麼個功能,該怎麼辦呢?咱們在.Net BCL中API,其實也有部分調用的是操做系統底層C/C++寫的庫,這種狀況下,咱們能夠理解爲這些C/C++寫的庫在.Net中「註冊」了,打引號的緣由相信大家懂的,那沒註冊的C/C++功能咱們就不能用麼?固然能,咱們有P/Invoke,那麼java呢,固然也能,有JNI(java native interface),固然,人家除了能夠在Java中調用C/C++庫的功能,還能夠在C/C++中調用java類的功能,真是亮瞎了個人雙眼,有人問怎麼調用?Java的執行不是要虛擬機麼?嗯,人家提供虛擬機的接口給你,是你能夠在C/C++的內存區中,裝載虛擬機,並調用指定Java類的方法... ...
考慮到JNI的編寫很麻煩,爲了方便JNI的程序編寫,提升開發效率,google提供了NDK套件,方便java和C/C++程序的互相調用,這樣Java和C/C++程序就能夠互通有無了。如今高端的android程序員,基本上都會和這些東西打交道。
不得不說,人家google確實是有境界的,這些裏面工做的人,才能真正叫程序員吧。
這一講咱們簡單的瞭解android framework的框架,雖然我們是速成型,可是勿在浮沙築高臺的思想一直是個人座右銘,寧肯不熟悉語法,不熟悉API,不熟悉程序編寫,可是底層原理愣是要搞清楚的,這就是成長爲高端程序員的必經之路。
下一講咱們將完成Android環境搭建和Hello world,同時逐步引入Android中的剩餘三大核心概念。
最近準備系統架構師設計師考試,也比較忙。下一篇博客何時出來,看推薦數了 : )