從windows操作系統說起
人們總是喜歡從將陌生的事物和自己所了解的東西關聯起來,以加深對未知事物的了解,這一講我們從windows操作系統說起,逐步引領帶大家走入android的世界。寫任何程序都需要知道程序運行的原理和環境,就比如開發winform程序,你至少需要知道操作系統的原理,CLR運行時,了解一些常用的C/C++庫。誠然,你不需要全部了解得很清楚也能寫出很不錯的應用程序,但是你了解的越清楚,鑽研得越透徹,那么你越能開發出適合於你所在平台的、更優化的應用程序。譬如在windows操作系統上,你的程序是這樣運行的:

那么android之上你的程序是如何運行的呢?一圖勝千言:

為了不讓朋友們一進來就看得昏頭昏腦的,這張圖我簡化了很多,簡單介紹下:
Linux kernel:管理你手機硬件的驅動程序,包含相機驅動、藍牙驅動、wifi驅動等等,提供給上層調用。你沒看錯,android用的就是精巧成熟的Linux內核。
C/C++ libraries:C/C++的庫,包含webkit,openGL(喜歡玩游戲的朋友這里看),最重要的是包含一個sqllite,你沒看錯,喜歡嘗鮮的.Net朋友都玩過的最流行的嵌入式數據庫,在你手機里面躺着呢。你的聯系人啊,短信什么的,都存在這個里面的。 (對妹子聯系人啊短信啊有什么想法不好,嗯,要相互信任。)
Android運行時:這里最重要的是dalvik虛擬機。我們知道java應用程序運行在jvm虛擬機上(相當於CLR運行時),顯然手機的功耗和PC不能比,所以google對jvm做了大量優化,於是便誕生了dalvik虛擬機,原來的Java應用程序的運行方式為:xx.java->xx.class->jvm執行,現在的Java應用程序執行方式為:xx.java->xx.class->xx.dex->dalvik執行。這一點大家心里有數就行,我們雖然是速成android,但也是保質保量的:)
Android framework:android提供的一系列java系統服務,供應用程序調用以實現功能。
從你的手機開機-講解android的啟動過程
直接上圖:

簡單說明如下:
一 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中的剩余三大核心概念。
最近准備系統架構師設計師考試,也比較忙。下一篇博客什么時候出來,看推薦數了 : )
