本文是對《Android深度探索-HAL與驅動開發》中關于此章節的總結,記錄自己學習的點點滴滴。
Android源代碼包含了很多東西,如内嵌在Android系統中的應用程式
(拍照、電腦、月曆、撥号器等)源碼、Android SDK帶的各種工具
源碼、Android NDK源碼、HAL源碼等等,是以Android源碼包非常大。
---源碼下載下傳
建立一個用于存放下載下傳腳本檔案repo的目錄(該腳本檔案可以存放
到任意目錄中,一般使用~/bin)
1)
#mkdir ~/bin
#PATH=~/BIN:PATH
2)下載下傳repo腳本
#curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
#chmod a+x ~/bin/repo
repo檔案實際上是用Python腳本對git的封裝,主要是為了簡化下載下傳
Android源代碼的操作。
3)建立存放Android源碼目錄
#mkdir android
#cd android
4)執行初始化
#repo init -u https://android.googlesource.com/platform/mainfest
上面的代碼要求repo下載下傳最新的源碼,也就是master分支。如果想下
載其他分支,可以使用如下指令。
#repo init -u https://android.googlesource.com/platform/mainfest -b xxxxx(其他)
5)開始執行下載下傳
#repo sync
根據網速和機器配置的不同這個過程會持續不同的時間起碼幾個小時吧
PS:Android源碼repo下載下傳方式不是必須的,隻要有可用的源碼包,何必下載下傳呢?
解壓之後直接用也是不錯的方式。
---Android源代碼目錄結構分析
目錄名 源碼目錄含義
abi | 應用程式二進制接口 application binary interface
bionic | C/C++運作時庫,在NDK程式中很大一部分調用的就是此處程式
bootable | 用于Android裝載和啟動程式,其中包含著名的bootloader和recovery。
bootloader在Linux核心啟動之前啟動,用來初始化硬體、建立映射等等
recovery可以講一個壓縮包中檔案覆寫到手機記憶體中系統目錄的程式
(刷機程式)
build | 用于編譯Android源碼以及建立system.img、ramdisk.img等檔案的工具。
cts | 用于相容性測試的工具
dalvik | Dalivk虛拟機的源代碼
development 高層的開發和調試工具
device | 與裝置相關的代碼。其中包含了motto、三星的裝置相關代碼
docs | Android源代碼項目的文檔和工具
external | 擴充工具的源代碼
frameworks Android架構層代碼。也就是Android SDK的源代碼
hardware | 硬體接口層和庫。HAL的源代碼就在此處
libcore | Java核心庫
ndk | NDK的相關代碼
packages | 與Android系統一同釋出的應用程式源代碼
prebuilts | Android在各種平台下編譯之前要使用的工具
sdk | 在開發環境中使用的工具,如DDMS、draw9patch、sdkmanager等
system Android的基本系統
---編譯Android源碼
在Linux終端下執行
#source build/envsetup.sh envsetup.sh腳本主要來初始化一些編譯指令如mm.
mmm等。
envsetup.sh中定義了一些shell函數,當使用source指令之後,就可以在Linux終端
下執行這些指令函數。mm和mmm都可以編譯Android源代碼中指定的工程,他們
的差別是mm指令必須進入指定工程的目錄進行編譯,而mmm可以在Android可以
在源碼樹下任何一級目錄編譯任意指定的工程,隻要指定路徑即可。
例如:
1)#cd ~/android/android2.3.4_src
#source build/envsetup.sh
#cd packages/apps/calculator
#mm
2)#cd ~/android/android2.3.4_src
#source build/envsetup.sh
#mmm packages/apps/calculator
使用lunch指令編譯制定目标
full-eng | 針對所有移動裝置,Android模拟器有效,打開所有調試選項
當不能确定或者忘記具體目标的時候可以在指令行上隻輸入lunch進行運作
會提示處多種目标選項,從其中選擇合适的目标進行編譯即可。
3)#make 如果擁有多核、多線程、超線程的PC那麼可以附帶-jn參數,這樣可以加快
編譯速度。例如#make -j4 編譯的過程也是一個漫長的等待。~~
---out目錄結構分析
out目錄是存放編譯Android源代碼生成的目标檔案的預設目錄。
|--host/ 編譯過程中需要的一些庫和工具
out--|
|--target/ ~/common主要包含Android系統Java庫。~/generic包含目标檔案system.img等
---将apk内置釋出
将apk嵌入system.img中,這樣apk就和原生系統的app一樣内置,非root無法解除安裝。
1)将apk嵌入/out/target/product/generic/的system/app檔案中,然後重新打包生成system.img
2)因為系統自帶的app不管有apk檔案而且還有對應的odex檔案,我們也可以将app源碼
放到Android源碼包中重新編譯app,這樣就會在system/app目錄底下生成app的apk和odex
然後重新打包system.img。
重新打包system.img,可以使用out/host/linux-x86/bin目錄下的mkyaffs2image指令行工具,或者
執行make snod打包
---下載下傳和編譯Linux核心源代碼
從剛才的Android源碼樹也可以看到确實沒有和Linux相關的檔案夾,OK,原來核心是單獨添
加進去的,而且這個Linux核心是經過Google修改後的,不是linux.kernel.org的原生核心
從Google下載下傳Linux核心、解壓後,配置核心,然後進行編譯。
---總結:
Android移植主要是Linux核心的移植。而Linux核心移植主要是Linux驅動的移植,是以本文概述
了Android源碼的編譯和Android内Linux核心的編譯。