Android 5.0核心和原始碼學習(2)——源碼下載和系統啟動過程分析,android5.0

來源:互聯網
上載者:User

Android 5.0核心和原始碼學習(2)——源碼下載和系統啟動過程分析,android5.0

一、Android源碼下載

上一次簡單介紹了Android系統的階層,這次開始動真格了——下載源碼和分析源碼!


那麼,Android的源碼從哪下?當然是Google官網,下載方法官網也講得很詳細,但是奈何中國的牆比較厚,所以上面的辦法是沒用的,當然,有些是有用的,地址:http://source.android.com/source/downloading.html


Google官網沒辦法下,幸好還有一些國內網站,廢話不多說,直接開始步驟:


工具和環境:VM虛擬機器+Ubantu14系統

第一步:Ubantu裡面需要有git工具:sudoapt-get install git

第二步:下載並配置repo資訊:

a)      mkdir ~/bin

          PATH=~/bin:$PATH

          git clonegit://aosp.tuna.tsinghua.edu.cn/android/git-repo.git

b)  a步驟中得到的git-repo中的repo檔案拷貝到bin目錄

         cpgit-repo/repo ~/bin/

c) 修改repo檔案,修改REPO_URL(用圖形介面改也可以)

          sudo gedit~/bin/repo

     在該檔案中修改URL(這是清華大學的)

          REPO_URL ='git://aosp.tuna.tsinghua.edu.cn/android/git-repo'

第三步:初始化repo並開始下載

          mkdir anroid

          cd android

          git config --global user.email"youremail@jileniao.net"

          git config --global user.name"Your Name"

          repo init -ugit://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-5.0.2_r1

          repo sync

 

下載結果證明(5.0的源碼,很大32G左右):

 

二、Android原始碼包簡介

就用的順序,一個一個粗略介紹下去(可能有錯誤和不詳盡的地方,將來隨著學習繼續跟進)

(1)      abi: applicationbinaryinterface,應用程式二進位介面

(2)      art: AndroidRuntime,就是5.0新的AOT形式虛擬機器

(3)      bionic:Bionic是Android的C/C++library庫(為何不用glibc?體積小,著作權)

(4)      bootable:啟動引導相關代碼

(5)      build:系統編譯規則及generic等基礎開發配置包

(6)      cts: Android相容性測試套件標準

(7)      dalvik:顧名思義,虛擬機器

(8)      developers:作用不詳

(9)      development:開發人員需要的常式和工具

(10)  device:裝置相關代碼,作用不詳,裡面有Google三星摩托羅拉htc的目錄

(11)  docs:介紹android開源相關的文檔,怎麼做貢獻之類的。

(12)  external:使用的一些開源組件,比如AES,網頁伺服器,壓縮公用程式等等

(13)  frameworks:第二層,核心架構(包括核心javaapi) ,是Android應用程式的架構

(14)  hardware:主要是硬體適配層HAL代碼

(15)  libcore:第三層,核心庫

(16)libnativehelper:作用不詳,只有一句話,支援Android的類庫的功能

(17)  ndk:顧名思義,ndk(nativedevelopment kit)開發用

(18)  packages:應用程式套件組合,放了很多APP,比如鬧鐘、瀏覽器、IME什麼的

(19)  pdk: 平台開發包(PlatformDevelopment Kit),這個是為OEM準備的

(20)  prebuilts: x86和arm架構下先行編譯的一些資源

(21)  sdk:這個不用講,軟體開發套件,包含各版本API和模擬器

(22)  system:系統包,底層檔案系統庫、應用及組件——C語言,重點要看的!

(23)  tools:工具,裡面有fat32lib和gradle

Android 5.0的工程結構和之前的版本是有區別的,請不要糾結少了什麼多了什麼的問題。總之包結構簡單瀏覽之後,可以開始重點研究某一部分了,接下來要將的Android系統啟動過程主要位於System包下。

                  

三、Android原始碼之System包簡介

Android源碼System包如下,同時附帶了包簡介,其中研究重點就在於Core包。

 


  四、Android的系統啟動過程詳解

 1、簡述

    Android系統可以看成是Linux的一個分支,工作在Linux核心之上,因此它的啟動過程從Linux的BootLoader開始到Linux核心完全啟動後才開始啟動屬於Android的部分,Android這一部分的啟動過程的主要代碼位於android/system/core/init包下。Android啟動過程中做了很多事,但是有一些關鍵的節點,這就是下面所說的步驟。


2、Android啟動第一步:init進程

Linux核心啟動之後就會啟動Android的老祖宗——init進程(PID為0),那麼這個進程幹了些什麼事呢?總的來說就是根據init.rc指令碼中的內容:掛載了一些目錄、配置了一些環境變數、啟動了很多服務。

(1)那麼init.rc裡面有什嗎?

init.rc位於android/system/core/rootdir下面,裡面定義了一些事件和服務(action、command、service、options),它的文法規則在android/system/core/init/readme.txt檔案裡有說明

(2)init.rc文法簡介(更具體的還是自己看readme.txt,很詳細):

     a)action的文法形式如下:

          on <trigger>

              <command>

              <command>

     b)Service的文法形式:

           service<name> <pathname> [ <argument> ]*

                 <option>

                <option>

   ...

3、Android啟動第二步: init進程啟動關鍵進程:ServiceManager進程

Init進程會啟動很多關鍵進程,ServiceManager就是其中一個,從名字上就可以發現,它是一個服務管理員,管理Service的註冊和監聽對Service的請求,沒錯,這裡的Service就是Android的四大組件之一,是不是豁然開朗?

它的定義位於/home/wang/android/frameworks/native/cmds/servicemanager包中,它可以理解為Binder機制中的“DNS伺服器”,負責Binder服務註冊時的名稱到底層Binder驅動提供的值的解析。下面是init.rc指令碼裡面啟動它的方式:

service servicemanager /system/bin/servicemanager

    class core –分類是核心服務

    user system

    group system

    critical  --4分鐘內有4次退出,則重啟裝置,這樣看來它是不是很關鍵?

    onrestartrestart healthd   --它重啟的時候也重啟別的服務

    onrestartrestart zygote

    onrestartrestart media

    onrestartrestart surfaceflinger

    onrestartrestart drm


4、Android啟動第三步:init進程啟動關鍵進程:Zygote進程

Zygote其實是受精卵的意思,正如其名,它的作用就是用來產生新的進程。他的啟動地方和之前的版本不一樣了,Android5.0的啟動它的命令在android/system/core/rootdir/init.zygoteXXX.rc中,這裡的XXX是32、64是根據平台不同而變化的。下面是init.zygote64.rc具體代碼:

service zygote /system/bin/app_process64 -Xzygote/system/bin --zygote --start-system-server

    class main

    socket zygotestream 660 root system

    onrestart write/sys/android_power/request_state wake

    onrestart write/sys/power/state on

    onrestartrestart media

    onrestartrestart netd

第一句是很關鍵的,拆開來看是這樣:

服務名:zygote

要啟動的路徑(或者叫程式):/system/bin/app_process64–Xzygote

啟動的參數:/system/bin--zygote --start-system-server

 

好,問題來了,為啥啟動的路徑的結尾不是像servicemanager那樣是自己呢?

 

這種路徑表示,它並不是一個單獨的進程,而是處於進程app_process64-Xzygote中,它的原始碼位於android/frameworks/base/cmds/app_process/app_main.cpp中。

 

好吧,繞來繞去,蛋疼了不?這樣吧,直接說這個app_process64-Xzygote幹了什麼吧。我認為有三個關鍵操作:a)啟動Android的runtime  b)建立了一個socket介面,用來接收ActivityManagerService的Socket請求來建立新的進程  c)啟動了SystemServer

 

5、Android第四步:SystemServer進程

上一步說zygote的關鍵一步是啟動了SystemServer進程,那麼這個進程有什麼特殊的呢?SystemServer進程負責啟動系統的關鍵服務,如包管理服務PackageManagerService和應用程式組件管理服務ActivityManagerService等等等等,這個暫時就不細講了,將來補上。

 

6、Android第五步:Home介面啟動

上面的步驟完成後就進入了最後一步,啟動Home介面。好,Android系統的啟動過程就講完了。

 

五、小結

這一篇主要介紹了Android的原始碼的工程包結構和Android系統的啟動過程,有些地方並沒有講的很詳細,將來隨著學習會繼續深入,下一篇還沒決定看什麼,哈哈。

 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.