Android核心的編譯與裁剪

whatnamecaniuse發表於2014-11-04

http://blog.csdn.net/leilu2008/article/details/9467991


概述

如果我們僅僅對Android核心感興趣,我們可以選擇合適的Android核心下載並編譯。

可供選擇的核心原始碼有很多版本:

[plain] view plaincopy
  1. $ git clone https://android.googlesource.com/kernel/common.git  
  2. $ git clone https://android.googlesource.com/kernel/exynos.git  
  3. $ git clone https://android.googlesource.com/kernel/goldfish.git  
  4. $ git clone https://android.googlesource.com/kernel/msm.git  
  5. $ git clone https://android.googlesource.com/kernel/omap.git  
  6. $ git clone https://android.googlesource.com/kernel/samsung.git  
  7. $ git clone https://android.googlesource.com/kernel/tegra.git  
goldfish這個project包含了適合於模擬器平臺的原始碼;

msm這個project包含了適合於ADP1、ADP2、Nexus One、Nexus 4的原始碼,並且可以作為高通MSM晶片組開發定製核心工作的起始點;

omap這個project包含了適合於PandaBoard、Galaxy Nexus的原始碼,並且可以作為德州儀器OMAP晶片組核心開發定製工作的起始點;

samsung這個project包含了適合於Nexus S的原始碼,並且可以作為三星蜂鳥晶片組核心開發定製工作的起始點;

tegra這個project包含了適合於Xoom和Nexus 7的原始碼,並且可以作為英偉達圖睿晶片組核心開發定製工作的起始點;

exynos這個project包含了適合與Nexus 10的原始碼,並且可以作為三星獵戶座晶片組核心開發定製工作的起始點。

編譯

1. 我選擇的是goldfish這個版本,也即把goldfish給clone下來即可。

[plain] view plaincopy
  1. $ mkdir AndroidKernel  
  2. $ git clone https://android.googlesource.com/kernel/goldfish.git  

需要等待一會,視網速而定:

2. 接著進入goldfish,發現裡面沒有檔案,別急,我們還要選擇分支,下載真正的原始碼:

可以通過執行:

[plain] view plaincopy
  1. $ git branch -a  

來檢視所有分支,接著:

[plain] view plaincopy
  1. $ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29  

下載原始碼:


3. 下載編譯所必需的prebuilt工具:

[plain] view plaincopy
  1. $ git clone https://android.googlesource.com/platform/prebuilt  

等待一會:


4. 將prebuilt工具新增到環境變數中以備後續使用:

[plain] view plaincopy
  1. $ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH  

5. 接著配置其他必要的環境變數:

[plain] view plaincopy
  1. $ export ARCH=arm  
  2. $ export SUBARCH=arm  
  3. $ export CROSS_COMPILE=arm-eabi-  

6. 我們執行:

[plain] view plaincopy
  1. $ make goldfish_defconfig   

來在核心原始碼根目錄下生成一個預設的.config檔案:


7. 最後,我們就可以編譯了:

[plain] view plaincopy
  1. $ make  

編譯過程截圖:


映像的輸出為:arch/arm/boot/zImage,這樣就通過預設的配置完成了Android核心的編譯。


裁剪

裁剪要用到一個很有用的命令:

[plain] view plaincopy
  1. $ make menuconfig  

上述命令的執行需要以下庫,必須提前安裝:

[plain] view plaincopy
  1. $ sudo apt-get install ncurses-dev  

make menuconfig這個命令在編譯Linux核心時會用到,有關於它的詳細說明可以參考以下地方,詳細閱讀:

http://blog.csdn.net/xdw1985829/article/details/6833319

http://hi.baidu.com/modygewlmsdnpre/item/b604b1c2ff676b1450505825

http://www.linuxidc.com/Linux/2012-06/63092.htm

簡單說來就是編譯的過程中編譯器通過配置檔案得知如何編譯,得知該把哪個模組編譯進去。這個命令會開啟一個藍色的命令列選單讓你更改編譯時的配置,在裁剪時也會通過這個命令開啟一個選單來更改編譯配置,在退出時如果有變化它會自動提示你儲存。


我們在make menuconfig開啟的選單中修改選單項進行裁剪,這個選單還是很友好的,你一下就能知道改如何根據需要裁剪,裁剪完成後,退出時詢問是否儲存,當然要儲存(實際上是更新了上文中所述的預設的原始碼根目錄下的.config檔案)。


接著我們就可以編譯裁剪之後的核心了(當然,編譯過程中讀取的也是更新後的配置檔案):

[plain] view plaincopy
  1. $ make  

編譯完畢之後,再去看看編譯好的映像,沒什麼問題的話,發現新映像比未裁剪編譯出的映像小了。




----------------------------------


1.    環境配備
首先,準備好所需要的linux作業系統以及磁碟空間,磁碟空間要足夠大。memory >1G,hard disk> 40G
1.1.  安裝JDK1.6:sudo apt-get install sun-java6-jdk
1.2.   安裝開發過程中需要的一些開發包
sudo apt-get install git-core gnupg valgrind flex bison gperf libsdl-dev libesd0-devlibwxgtk2.6-dev build-essential zip libncurses5-dev zlib1g-dev

若自帶的源裡面找不到所需要的安裝包,可以新增軟體源:
新增源的過程:
①   備份當前的源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
②   修改 sudo gedit /etc/apt/sources.list
③   修改之後儲存更新 sudo apt-get update

準備好了獲取android原始碼所需要的環境,下面開始獲取android原始碼



2.獲取android原始碼
2.1.   在使用者目錄下新建一個資料夾來存放我們的android目錄
①  mkdir android
②  cd android
③  mkdir bin
④  cd bin
⑤  安裝repo, 通過curl下載repo:curl http://git-repo.googlecode.com/files/repo-1.17 > repo(如果沒有安裝curl,sudo apt-get install curl)
      sudo chmod a+x repo
⑥  然後向PATH中新增bin路徑:exportPATH=$PATH:~/bin

2.2.   建立存放android原始碼目錄source
①  mkdir source
②  cd source
③  獲取git上的android原始碼版本: ../bin/repo init -uhttps://android.googlesource.com/platform/manifest -b android-4.0.3_r1
④  當出現提示時,請配置您的真實姓名和電子郵件地址回購。使Gerrit程式碼審查工具,將需要註冊的Google戶連線的電子郵件地址。確保這是一個啟用活的地址上,你可以接收郵件。你在這裡所提供的名稱將顯示在您的程式碼提交的屬性中,完成之後出現“repoinitialized in/home/***(自己使用者名稱)/android”,則表示初試化完畢,可以開始下載,在Repo初始化完畢後,會產生一個隱藏的目錄”.repo”,通過檢視此目錄下的manifest檔案可以看到相應的Project。
⑤  在終端執行命令開始下載: ../bin/reposync

3.下載android核心
新建存放android核心的目錄
①mkdir kernel
②cd kernel
③android的kernel有多個部分,可根據需要執行以下命令下載需要的內容。git clone https://android.googlesource.com/kernel/goldfish.git 
下載android核心時間會比下載原始碼時間短,需要注意的是,android核心的下載不能被中斷,而android原始碼支援斷點下載。下載的內容是隱藏的,用du –sk命令來檢測資料夾的大小

4.編譯android原始碼
編譯。在Android/source目錄下執行以下命令:make
第一次編譯要等待比較久的時間,編譯成功
編譯的時間一般不會比下載的時間長。在預設的情況下,編譯完成之後,會在/root/android目錄下面生成一個out資料夾,生成的所有檔案都放在該資料夾下。編譯生成之後會在out/target/product/generic/目錄下生成一些.img映象檔案

5. 編譯android核心
5.1.   確定核心的版本
進入存放android核心原始碼的kernel目錄,我下載了goldfish.git,進入goldfish目錄,在命令列輸入以下命令,顯示所有分支及當前所在的分支:
$git branch -a
輸入以下命令選擇當前的版本(goldfish為android的模擬器描述的CPU):
$git checkout -b android-goldfish-2.6.29origin/android-goldfish-2.6.29
再次輸入命令git branch -a,將會顯示剛剛選擇的最新分支,表示目前工作在這個被選擇的分支上

5.2.   設定環境變數
export PATH=$PATH:~/android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-eabi-

5.3.   編譯核心原始碼
設定完之後,就是編譯android核心原始碼了,進入kernel目錄,輸入以下命令
$make ARCH=arm goldfish_armv7_defconfig
$make
第一條命令為編譯時的預設配置檔案。如果不執行這條命令,編譯時可能會提示“找不到配置檔案”。第一條命令執行完後,會在goldfish目錄下生成一個.config檔案。之後便是一段時間的等待了。。。時間不長,一會即可編譯好,比編譯android原始碼時間要少得多。編譯完成之後,會在“kernel/arch/arm/boot/”目錄下生成名為zImage的檔案。

6. 執行android系統
設定路徑
export PATH=$PATH:~/android/source/out/host/linux-x86/bin/
export ANDROID_PRODUCT_OUT=~/android/source/out/target/product/generic/
載入:emulator–kernel ./kernel/goldfish/arch/arm/boot/zImage



相關文章