本文是在Ubuntu10.10系統上進行實踐的。
1 因為我們需要Android的模擬器,所以需要安裝Android的SDK,並建立AVD,
可以一次命名為AVD15,AVD22,AVD23,...
AVD15對應1.5,AVD22對應2.2,AVD23對應2.3,...
擷取.config檔案:
在啟動模擬器AVD15:
$emulator -avd AVD15
$pull /proc/config.gz . //將/proc/config.gz這個檔案複製到本地的目錄,對應Linux上運行該命令的當前工作的目錄,下同
然後,將其解壓並儲存為.config,留待後面使用
2 arm編譯器
去網站下載arm工具鏈
注意選擇較早的版本,很有可能是google那班人在編譯的時候 選擇的是當時的最新的版本,但是後來就一直用那個版本
http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite
要之前的版本:點擊 All versions 即可看到所有的發行版本,2008q3-41這個版本是經過很多人測試可以用的。
解壓後,設定環境變數,將/usr/local/arm-2008q3/bin 添加到$PATH中
其中 /usr/local/為儲存解壓後的arm-tools-chain的根目錄
3 下載Android的Linux核心
記住是Android的Linux核心(git clone git://android.git.kernel.org/
kernel/common.git),而不是通用的Linuxe核心源碼(git clone git://android.git.kernel.org/kernel/linux-2.6.git
)
$ git clone git://android.git.kernel.org/kernel/common.git kernel-common
//其中 kernel-common為存放從程式碼程式庫下來的代碼的目錄,下同
這一步是個漫長的等待...
$ cd ~/kernel-common
$ git branch
$ android-2.6.36
//這個隨著版本的變化而變化
4 下載完Android的Linux核心源碼,你會發現在/arch/arm/configs/下沒有goldfish_defconfig這個檔案,恩我們需要check_out gold_fish版本(模擬器的硬體設定就是Gold_Fish的)
$ cd ~/kernel_common
$ git branch -a
$ *android-2.6.36
remotes/origin/HEAD -> origin/android-2.6.36
remotes/origin/android-2.6.35
remotes/origin/android-2.6.36
remotes/origin/archive/android-2.6.25
remotes/origin/archive/android-2.6.27
remotes/origin/archive/android-2.6.29
remotes/origin/archive/android-2.6.32
remotes/origin/archive/android-gldfish-2.6.29
remotes/origin/archive/android-goldfish-2.6.27
//以上顯示是目前看到的,將來的某個時候可以就有點不同了,甚至老版本的Branch 名字也會被修改
//故要特別注意
$ git checkout remotes/origin/archive/android-gldfish-2.6.29
//這個過程就快多了,等待下載完資料
//git 這個東西確實不怎麼好用,還是想念Windows上TortoiseSVN
當下載完,你就能在kernel-common/arch/arm/configs/下看到goldfish_defconfig這個檔案
5 編譯
1)將1中的.config檔案拷貝到 ~/kernel_common目錄下
2)修改 ~/kernel_common目錄下的Makefile檔案(修改兩處) -- 修改之掐最好備份下這個檔案,因為如果你修改了這個檔案 用git擷取新版本的時候
會提示Makefile檔案被修改
ARCH ?= arm //制定CPU的架構為ARM
CROSS_COMPILE ?= arm-none-linux-gnueabi- //arm編譯工具首碼
3)
$ make goldfish_defconfig
$ make -j2 //現在的機器都是雙核的,這樣代碼編譯就快多了
編譯最後兩行資訊:
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
6 用我們剛剛編譯成功核心啟動模擬器(這樣不會對原有的模擬器產生任何的影響)
$ emulator -avd AVD15 -kernel ~/kernel_common/arch/arm/boot/zImage
如果模擬器能起來,那說明成功了。
開啟另外一個終端,這樣就能解決上面的終端被佔用的情況下,也能使用終端
$ adb shell
#cd /proc
# cat version
Linux version 2.6.29-00262-gb0d93fb-dirty (dream@dream-VGN-FW351J) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-41) ) #1 Fri Dec 24 12:31:28 CST 2010
# cat cupinfo
cupinfo: No such file or directory
# cat cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 272.79
Features : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : Goldfish
Revision : 0000
Serial : 0000000000000000
注: dream@dream-VGN-FW351J,其中的 dream為當前登入Ubuntu的使用者名稱,而dream-VGN-FW351J是機器名
Sourcery G++ Lite 2008q3-41 這個就是arm tools chain的版本了
參考文獻:
1. android核心編譯方法
2.下載編譯android kernel
3. android核心編譯方法
4. git-clone指定branch
5. http://android.git.kernel.org/
非常感謝以上文章的作者(經過幾次轉載有時都不知道原著是誰了),沒有他們的無私奉獻,本人估計還在黑暗中摸索著。。。