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系統的啟動過程,有些地方並沒有講的很詳細,將來隨著學習會繼續深入,下一篇還沒決定看什麼,哈哈。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。