深入Android 【二】 —— 架構和學習

Android架構和特徵

千呼萬喚始出來,猶抱琵琶半遮。 -- 《琵琶行》

雖貴爲富二代,但Android要是沒任何可圈點的地方,開不過70邁,在玲琅滿目的手機平臺競爭中,充其量也就做幾個俯臥撐打一桶醬油,然後被落的遠遠的。說到底,出來混,靠的還是技術。

架構

從SDK文檔中,偷來一幅Android平臺的架構圖,如上。在整個架構最底層紅彤彤的部分,是Linux Kernel在移動平臺的一個移植,它隱藏了硬件、網絡等相關的細節,爲上層提供了一個相對純潔的統一接口。除非要做的是Android到不同設備的移植工作,否則對於大部分普通開發者而言,基本上是遠觀而不必褻玩的。Google一直強調,Android的底層實現異常NB,可移植性超強,暫沒有功夫研讀,實屬遺憾。

靠上一層,是一些核心的和擴展的類庫,它們都是原生的C++實現。在這一層,你可以看到很多熟悉的面孔,一如SQLite、WebKit、OpenGL,開源的力量與貢獻由此可見。如果,該層類庫需要被上層函數調用,就必須要通過JNI的導出相應的接口函數,否則就只能在層次內部自個把玩。

也是在這一層次上,還有爲上層Java程序服務的運行時。Dalvik虛擬機,是Android的Java虛擬機,之所以不採用J2ME的虛擬機,一方面是因爲J2ME的設計是爲了低端機器而優化,而Dalvik則是爲了高端一些的機器進行優化,提供更好的性能。另一方面,從商業角度來看,必須繞開J2ME虛擬機,Android才能徹底解放,想怎麼開源就怎麼開源,不再需要考慮License的問題。

再往上,終於有Java出沒了。首先是框架層,這裏包含所有開發所用的SDK類庫,另外還有一些未公開接口的類庫和實現,它們是整個Android平臺核心機制的體現。

而在最上面,就是應用層了,系統的一些應用和第三方開發的所有應用都是位於這個層次上,也許要糾結兩者的差別,就是系統應用會用一些隱藏的類,而第三方的應用,總是基於SDK提供的東西來搞。

一般來說,Android開發,就是在SDK的基礎上,吭哧吭哧用Java寫應用。但自從有了NDK,一切有了寫小變化。NDK的出現意味着,最上面應用層的內容,可以穿越Java部署的框架層,直接和底層暴露出來的,或者自行開發的C++庫直接對話,當然在這些庫中需要包含JNI的接口。

人說,這就不是Android也可以用C++開發應用麼,但其實,這樣的說法不夠確切,純C++應用,是無法被接受的。因爲在Android中,大量的核心機制部署在框架層,它們都是用Java實現的,比如控件庫,Activity的調度之類的。因此,沒了界面,沒了調度,還是隻用C++做類庫比較合適,否則一切都亂了套了。

特徵

基於這樣的架構,Android有很多的設計顯得很有意思。縱覽整個SDK和核心機制的設計,工整漂亮,是Android給人的第一感覺。爲了說明這一點,找一個反面教材是很有必要的,Symbian同學毫無懸念的擔當這個偉岸的角色。

寫Symbian程序,感覺就像是在玩一個猜謎遊戲。哪怕你是一個Symbian老手,當需要用到Symbian中某塊陌生功能的時候,你可能依然束手無策。你往往需要猜並反覆找尋,在這裏我需要使用哪一種奇巧淫技呢,是該臆想某些事件,還是應該用一個神祕的UID尋找某個特定應用,諸如此類。

而做Android應用的時候,就像是做高考模擬試題,題看上去不一樣,解答模式摸清楚,就一通百通,一了百了。監聽某個系統事件,查一下SDK就好;訪問某個應用的數據,看看它有沒有提供Content Provider就可以。所有的一切,都是按套路出牌,只要你瞭解了套路,再陌生的牌也可以看得懂,出的順。人說武林高手,都應該是無招勝有招,而一個好的應用框架,也應該做到舉重若輕,可觸類旁通。

而Android框架最文采飛揚的一點,就是引入了Mash-Up的思想。所謂Mash-Up,就是把寫應用搞成搭積木,要出效果的時候,東家一塊西家一塊現場拼起來就好。這裏面關鍵有兩點,一個是模塊化,另一個就是動態性。所謂模塊化,就是一個應用的功能要明確的被封成一個個邊界清晰的功能點,每一個功能點都像是一個黑盒,由預先定義的規則描述出其交互方式;而動態性,就是這些獨立的模塊能夠在運行的時候,按照需求描述,連接在一起,共同完成某項更大的功能。在這兩點上,Android都做得非常出色。

站在可Mash-Up構造應用這一點去看其他的一些Android中的核心功能設計,就顯得很有章可循了。比如爲什麼要把文件私有化,爲什麼要讓進程被託管,等等(當然也可以站在別的角度看出不同的效果,視角不同,視野自然不同...)。

在UI機制方面,Android也有很不錯的表現。它採取xml格式的資源文件,描述所有界面相關的內容。資源文件不是什麼新東西了,xml格式也是老調重彈,但可貴的是Android做的更爲的豐富和徹底,基本把界面相關的邏輯,全部從代碼中剝離到了資源文件中,和Symbian那四不像的資源文件相比,真是強大了不知多少倍了。

Android學習入門

不積跬步,無以至千里。 -- 《勸學》

說,萬事開頭難。想開始Android的開發,最重要的應該是先把馬步扎穩,套路摸清楚,後面的事情就順當多了。打開懷抱,擁抱Android,也許可以先做下面這些事。

開發環境

辣手摧花成性的GFW,無情的把Android開發者官網關在了牆外。不過沒關係,猛擊這裏,同樣可以殊途同歸(Shit,一直在用代理,剛試了下,發現竟然也被盾了,如果不行,那就只能翻牆了...)。

如果旅途順利,你可以在路徑sdk/index.html下找到安裝說明,成功配置好Android的開發環境(【注】:在以後,如果要給開發者頁面上的鏈接,都會給一個像sdk/index.html這樣的相對路徑,你可以在前面加上官網地址,或者本地SDK的doc地址拼湊成完整的路徑,在一個盾牌橫行的朝代,只能用這樣委屈求全的方法保證能更好的使用...)。

在2.0之前,每一次版本更新,你都要自己去下個全新的SDK,然後按照說明,小心翼翼的一步步修改eclipse的設置,甚是麻煩。在2.0後,這個模式有所改善,你會先下到一個類似於下載器的插件,通過它可以來管理和升級SDK,不僅簡化了整個升級模式,還使得你可以更好的在各個不同的SDK版本間遊走,利國利民。

Eclipse + ADT(Android Development Tool),是正牌的Android開發環境。你可以在Windows,Linux,Mac下做開發,甚爲自由。比之Symbian的開發環境,ADT顯得尤爲強大,它對SDK提供的一堆優秀的命令行工具進行了UI上的封裝,提供了圖形界面(命令行控當然同樣幸福,具體參見:guide/developing/tools/index.html)。通過ADT,你可以用運行和管理模擬器,使用調試器進行調試,過濾和查看Log,瀏覽模擬器上的文件信息,模擬撥號、短信等手機纔有的事件,等等。

文檔

我知道,有很多人在學習一個新平臺開發的時候,都習慣去買一些《xxx 21天精通》之類的書籍。但其實,最好的入門學習資料,就是SDK文檔。因爲只有做平臺的自己,才能最瞭解平臺中的各個玄機,各方面的輕重緩急,從而能夠更好的對症下藥藥到病除。

在Android的SDK中,guide/index.html是由淺入深的教學文檔,reference/packages.html是標準的API文檔。對於教學文檔,我的意見是,一字不拉的通讀一遍甚至多遍,至少做到能對Android摸着頭腦,並且碰到問題的時候,能夠快速想起在哪裏可以找到,回來深刻閱讀。

而API文檔方面,Android做的算是還不錯了。基本上每個類,每個接口,都有標準而詳盡的說明,在一些尤爲重要的類中,還具有大量的學習性的內容,不和Symbian似的,有太多的太監類,只有光禿禿的一個函數,一行文檔說明都沒有。整個文檔結構是按照Java包來組織的,本身Java包命名的結構性和可讀性很強,找起來也頗爲方便。

很多人對SDK文檔有牴觸情緒,我想,有兩方面的原因。一則是SDK文檔普遍缺少文學性,麻木不仁的八股文,難以下嚥。Android在這方面做得算是乏善可陳,雖然算不上文采華麗,但還是挺適合閱讀的。另一則,就會是語言方面的原因了。SDK文檔多爲英語,偶爾像MSDN這樣有中文的,也停留在機器翻譯的水平上,閱讀起來頗爲難受。特地在網上搜了下,找到一些翻譯SDK的中文文檔,比如這裏。雖然是基於1.5 r1版本SDK所著,稍顯過時,但翻譯的還是有小用心的,作爲輔助,也不失爲一份好資料,特代表廣大看官向這些爲人民福利着想的同志致敬。

Tutorials

光說不練假把式,除了讀,在入門階段,寫也是一項不能少的運動。同樣是在SDK中,Android提供了一組Tutorials和一些列的Samples,詳見:resources/index.html。

Tutorials很簡單,Hello World只是在教你如何在eclipse中,在ADT的幫助下,創建一個Android項目。相比之下,Hello Views複雜了些,它集中展示了幾種標準的Android Layout 樣式是如何構建的,很多時候,你都是在這些樣式下擴展所需的UI。

Hello Localization,是教你如何使用資源的,做完這個,就可以瞭解Android的資源有多殺~。最後收官的是一個更爲完整的Notepad Tutorial,它展示了很多Android的核心機制,比如基於Intent的Activity整合,Activity的生命週期等。邁過這個Tutorial,歡迎你,進入Android的大門。

當然,做完Tutorials,對於Android而言,只是管中窺豹略見一斑。在SDK中,還提供了一系列的Samples。可以根據自己的需求,挑選合適的Sample編譯運行和學習。但其中,有一個是不論你做什麼,都需要必看必讀必熟悉的,就是API Demos。在這個Sample中,集中展示了Android重點功能的API使用,把這個Sample用熟悉,需要做什麼的時候過去找一下就可以很快的入手了。

源碼

到這裏,很多看官一定很不屑,前面所謂的學習入門介紹,只不過是圍着SDK打轉。其實,事實也是如此,SDK中包含的內容是真的非常重要,我只是期望通過一些簡短的介紹,激起一些初學者的重視,如是而已。

當然,SDK每一個平臺都有,沒什麼稀罕的。但Android有另一個非常稀罕而值錢的看家法寶,就是源代碼。從Android Source的主站上:http://source.android.com/,你可以獲得整個平臺的源碼以及相關介紹。非常苦口婆心的期望大家都去down一份源碼放在機器上,哪怕你不需要進行修改編譯,放在機器上當百科全書也是遠勝於任何一本Android教學書籍的。本系列文章後續很多內容,都是從源碼中學習到的一些淺薄見識。

對於大部分開發者都有學習價值的源碼,主要在源碼的frameworks和packages目錄下。前者包含的是平臺核心的一些實現,比如你需要自定義一個控件,也許你就可以翻到一個系統控件的實現中去,看看它是怎麼來做的。後者包含一些系統的應用實現,比如你想做個播放器,也許你可以先去參考參考系統自帶的是具體怎麼做的。這樣的實現,即便不算是最華美,至少也是最標準,其價值不容小視。

另外,你也可以把它當個代碼庫來使,不會使用某個類,grep一把,也許就能獲得一份最漂亮的Sample。當然,如果你有時候對某些系統機制表示費解,抑或有一些bug不知道源頭在哪,都可以跟着源碼順藤摸瓜的搞清楚。這樣的好東西,可不是每個平臺都能夠享用的。

其他

論壇,其實對於開發和學習都是很重要的資源。畢竟,所有的資料都是死的,只有人是活得,能夠最大限度的因地制宜解決問題。

只不過,標準的官方論壇,放在Google Group上,已經惆悵的被盾了。中文論壇方面,沒有特別優秀和活躍的,這一方面是由於Android的發展現狀還不算很磅礴,另一方面是由於Android的開發相對於Symbian而言,奇技淫巧少了很多,沒有那麼多好問的。也許你可以去去csdn這樣的傳統論壇,或者eoe這樣專門的論壇。有的時候,還是多少能獲得一些幫助的。

書籍方面,真沒有什麼推薦,豆瓣上搜索一下,你可以看到,目前的書籍,基本上還是集中在SDK使用層面上,很少有解析的很透徹,做的很深入的。而SDK的使用,看SDK的文檔就足夠了,如果實在對e文不感冒,買一兩本評價不太差的中文書籍,放着翻翻也還是挺好。

更進一步,也許可以讀讀一些經驗性的文檔,去Google Code上搜索一些代碼回來看看。比如,SDK文檔中,有個經驗性文檔的集合:resources/articles/index.html,就可以翻看一下。

最後,更多的一切還需要自己在工程和思考中,慢慢總結。相信,好的代碼,會垂青一個勤於動手和思考的人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章