安卓之啓動-初析(-)

本源碼介紹是基於安卓4.2.2_r1和安卓安卓4.1的,這裏我交叉講解是因爲我的安卓4.2.2_r1代碼下載的不全,所有交叉引用講解。

本文結構約定:

         1大標題用標題1格式,次表次按標題2,標題3以此類推。

         2每章節開篇會有簡單的關於該章的介紹,每章後面會對該章的講解進行一個總結。

         3在開篇介紹後面會列出,該章涉及到的重要的源文件。

         4在講解代碼的時候,因爲代碼會有嵌套關係,代碼層次會根據顏色進行標示,例如

         第一層

                   第二層

                            第三層

                                     第四層

                                               第五層現在之定義到五層,第一層淺灰、淺黃、淺藍

    5含有代碼嵌套的會用一整行六號n(代表嵌套的層,n=1,2,3,4,5)#分割以示這是代碼嵌套,我不會但是我儘量對代碼進行排版。

    6代碼註釋的解釋用暗紅,對於疑點用綠色。對於重要的話語用深藍。代碼用小五號字

對於引用的用橙色,更重要語句或者解析或者代碼用紅色。重要的話會用粗體加粗。甚至有些用下劃線或者斜體表示。某些代碼中如果有重要的語句可能會用比當前大一號的字顯示,還可能加粗顯示。對於特定宏才執行的代碼背景用淺綠標示,這段代碼不是一定會執行。

在分析代碼的時候java、c、c++代碼穿插,完全看引用關係,代碼的重要註釋我會從源文件一起粘貼過來,我會對註釋給一個我理解的翻譯,當然仁者見仁。還有我在分析代碼的時候並不是解釋代碼,我只是對某些代碼加以註釋,還有我認爲代碼從來不出錯,所以我會屏蔽掉一些異常處理,而且我不對代碼做{}處理,也就是說你拿到這些代碼放到編譯器上也不一定能運行。想看真正的文件要去源代碼中查找,我這裏會列出一大部分代碼。

    7有些時候爲了便於查看代碼的方法,我會用編譯器的截圖來展示文件中包含的方法。

    9我會盡量對我寫的文檔進行排版,但不保證它真的看起來很舒服,因爲排版是一件很難的事情,而且我又不擅長排版。

   10 寫這個算一個學習過程也算是一個交流過程,我儘量寫一些對我們有意義有用的東西,我不會像其他大師一樣扯一些高深的雲裏霧裏的東西,尊重開源尊重共享。也希望看過我寫過的學習歷程的人,在我的代碼和解說中找到錯誤,我們一起提高。

序-安卓系統介紹

    我想了很久要不要再這一章節裏添加一副安卓架構的圖片,但是我最終還是決定不用圖片去誘惑我自己和大家(加了圖你們就不認真讀我寫的東西了,很辛苦的)。就讓我們腦袋一片空白的學習比較好。因爲有些時候似乎我們什麼都明白都懂了,但是真的讓我們去描述去做的時候又感覺到腦袋一片空白。

    題外話就扯到這裏,現在我開始按照我自己現在的水平來說一下安卓系統(當然隨着我的積累增強,我或許事後會對該章進行修改,見諒,爲了不受到干擾,大家可以越過這章)。

    我個人按照自己的傾向喜歡把安卓分爲三層,並且按照我自己的喜歡把這三層稱爲:

    1 linux內核層

    2 framework下層,linux上層,的中間層。

    3 framework

    我爲什麼要這麼分層而且這麼稱謂是有原因的,我是想讓大家對一些東西分清界限,有些東西本身屬於linux的語義,沒必要非的和安卓扯在一起,例如基於linux的驅動模塊,基於linux的內存管理,線程調度等。這樣分清界限後,你就知道哪些東西可以在分析的時候從安卓這個嚇人的世界裏走出來,而且你還能知道你應該去哪個世界瞭解那些讓你迷茫但並不屬於或者說和安卓系統本身無關不隨安卓存在而早就存在的東西。

 linux內核層包含了一個操作系統應該具有的線程調度、內存管理、驅動程序等。瞭解過IPC進程間通信的人都知道,進程間通訊有例如無名管道、有名管道、消息隊列、共享數據、信號、Unix TCP/IP 套接字等方式,但是忽然有一天某一個人(當然不是我)寫了一個驅動程序叫做OpenBinder,它是基於類似RPC遠程調用的驅動程序,並且可以用於進程間通訊,如果google(暫時這麼稱謂因爲發現它的應該是早期開發安卓的人)沒有發現OpenBinder的話它也行還安靜的在liunx世界裏默默的休眠,不過它很幸運被google發現變成了今天的Binder,並且用於“安卓系統”大部分進程間通訊的機制。但我還是要重複的強調一次,驅動的開發是屬於操作系統或者說是嵌入式等的範疇的,它和安卓扯不上任何關係,它的出現是隨着操作系統或者不知道什麼玩意一起產生的,早於安卓太多年了。曾經看有些書上說安卓系統把底層日誌也做成了驅動的方式,至於是不是真的,應該不會是假的,不過我到今天還沒有機會看這些東西,暫時留給以後吧。google還做了很多他們還對內核做了很多定製和閹割處理(有c、c++、還有一些腳本,但是都是linux老套路)。

    夾在framework和linux內核層中間的層,分層的目的就是讓職能更加明確。那麼這層主要幹什麼呢,因爲它在linux層之上,所以在這一層上按理來說我們可以做像在linux系統上一樣的事情。例如基於標準的libc、libstdc++編寫一個c、c++程序,而且我們還可以裝一個java虛擬機編寫一個java程序,並且我還可以把這個java程序做的很炫,例如寫一個eclipse。

而且還可以寫一個基於JNI的java程序,讓我的java程序即能跑java還能跑和linux系統相關的c或者c++程序。擦,結果當我還沒有學好c、c++的時候這種想法又被google收購的一個公司發現了。可惡的他們真的這麼幹了,他們做的比我想象的要狠很多。他們讓這個linux只能跑一個程序,他們把它叫安卓,他們讓這個安卓有了至高無上的權利。並且他們同樣裝了一個虛擬機只不過這個虛擬機不是sun的而是apache的它叫Dalvik,並且它的執行效率更高,當然我對此表示懷疑。接着他們又編寫了一些c、c++程序作爲JNI,在後面肆無忌憚的跑(安卓放話了給我跑)。並且似乎還扮演一些中介的角色。但是谷歌發現不能讓開發者肆無忌憚用標準庫編寫程序,so給你們NDK,你們開發者想編寫c、c++要乖乖在我們的掌握之中。

         framework層。大家光有地基那不叫房子,只有把房子在地基上建起來,房子才叫房子,纔有了房子的功能。那麼房子應該存在門,窗子,牆,地板,天花板,衛生間,廚房等。

這些是構成房子的基本元素。對於安卓系統,地基就好比底層內核層,和夾在中間的中間層。構成房子的元素就好比,安卓系統環境構成安卓應用運行在framework層上的依賴的實現,例如ActivitiesServicesBroadcastreceiversContent providers、文件管理器、任務管理器、安裝服務的底層支持和實現,各種隨init一起啓動的作爲安卓應用運行的依賴的服務等。各種上層應用運行的依賴。

         爲了讓房子更完美,我們給房子鋪了木地板,按照了美麗的燈,安裝了暖器,空調,冰箱等,不過這些並不是房子的必須品,而這些東西就好比一個安卓系統的一些預置應用。例如地圖,例如電話本,撥打電話,發送短信(你會問爲什麼它算預置應用,答案是有些pad並不具備打電話的功能,所以它算應用不算服務)等。

         這就是一個安卓系統,我這樣講你能明白了嗎。記住安卓可是在linux上唯舞獨尊的程序哦,擋我者死,擋我我就不幹活。

發佈了41 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章