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

摘要: Android架構和特徵 千呼萬喚始出來,猶抱琵琶半遮。 -- 《琵琶行》 雖貴爲富二代,但Android要是沒任何可圈點的地方,開不過70邁,在玲琅滿目的手機平臺競爭中,充其量也就作幾個俯臥撐打一桶醬油,而後被落的遠遠的。html

Android架構和特徵

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

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

 

架構

 

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

靠上一層,是一些核心的和擴展的類庫,它們都是原生的C++實現。在這一層,你能夠看到不少熟悉的面孔,一如SQLite、WebKit、OpenGL,開源的力量與貢獻因而可知。若是,該層類庫須要被上層函數調用,就必需要經過JNI的導出相應的接口函數,不然就只能在層次內部自個把玩。網絡

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

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

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

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

人說,這就不是Android也能夠用C++開發應用麼,但其實,這樣的說法不夠確切,純C++應用,是沒法被接受的。由於在Android中,大量的核心機制部署在框架層,它們都是用Java實現的,好比控件庫,Activity的調度之類的。所以,沒了界面,沒了調度,仍是隻用C++作類庫比較合適,不然一切都亂了套了。ide

 

特徵

基於這樣的架構,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開發者官網關在了牆外。不過不要緊,猛擊這裏,一樣能夠異曲同工

若是旅途順利,你能夠在路徑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教學書籍的。本系列文章後續不少內容,都是從源碼中學習到的一些淺薄見識。

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

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

 

其餘

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

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

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

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

 

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

相關文章
相關標籤/搜索