Android核心編譯方法

來源:互聯網
上載者:User

google的android很多人都希望在gphone沒有出來之前,把它移植到相關的硬體平台上去。網上看了不少文章,總的感覺是:在這一步走得最遠的就是openmoko的一個大師層級的駭客Ben “Benno” Leslie,他曾經試圖把目前google發布的android移植到openmoko的平台上去,並且做了10000多行代碼的嘗試。最終雖然由於open moko採用比較老的arm 920t的核心,而android採用較新的arm926-ej-s核心,而且使用了新的核心的一些新特性,導致移植失敗,但是anyway,他已經做了足夠多的前期工作了,爾後的宣布成功移植android到real target板子上的人,大多是在他提供的patch的基礎上繼續走下去做出來的。
下面是一些有用的參考,希望有助於對此感興趣的開發人員:
(1)Ben “Benno” Leslie的關於andorid移植到openmoko的個人部落格地址:
http://benno.id.au/blog/
(2)早期宣布成功移植android到zauraus-sl-c760的詳細方法描述的連結:
http://euedge.com/blog/2007/12/06/google-android-runs-on-sharp-zaurus-sl-c760/
(3)後續的根據上述先行者們的工作,成功移植android到zauraus-c3000的方法:
http://androidzaurus.seesaa.net/article/74237419.html
(4)本文是參考下面的wiki,接合個人的實踐寫出來的,對原文的作者表示一下感謝:
http://wiki.droiddocs.net/Compilation_of_Android_kernel
很羨慕這些人阿!
不過很可惜,偶的開發板是s3c2410的,恰好是arm920t的核心的。。。估計移植上去戲不是很大,需要重寫很多代碼,畢竟偶跟benno相差得太遠太遠了,同樣是開發人員,差距咋就那麼大呢?!
(畢竟google僅僅開放了kernel的原始碼而已,他們需要開放的東西還很多。)
在這裡把關於android核心編譯方法簡單寫一下,或許對希望移植核心的朋友能有些協助:
(看了Benno的移植過程以後,覺得即使你能夠編譯google開放出來的核心,意義也不是特別大,因為這個核心中加入了為了支援qemu的很多東西,而這些代碼似乎對希望移植到真機上的朋友來說,沒有任何意義,反而是一種阻礙)。
1)從CodeSourcery上面載用於交叉編譯的工具鏈:
http://www.codesourcery.com/gnu_toolchains/arm/download.html
我在這裡選擇的是->ARM GNU/Linux,以及IA32-GNU/Linux。有文章說應該選擇ARM EABI,我不知道了,沒有測試過,反正我選擇的這個編譯的核心也是可以跑起來的:P
2)下載google的android linux的核心原始碼:
http://code.google.com/p/android/downloads/list
主要是這個檔案:linux-2.6.23-android-m3-rc20.tar.gz

3)把下載到的核心和交叉編譯工具解壓縮,並最好把工具鏈的路徑放到PATH裡面去

解壓縮核心:
$ mkdir -p android
$ cd android
$ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz
會解壓出來一個叫做kernel的目錄,google的android的linux核心就在裡面了。

解壓縮交叉編譯工具鏈:
$ cd /usr/local/
$ sudo cp ~/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 .
$ sudo tar zxvf arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
此時會解壓出來一個叫做arm2007q3的一個目錄,這裡面就是工具鏈了。

設定一下環境變數:
$ export PATH=$PATH:/usr/local/arm2007q3/bin
好了,到此,基本的核心編譯環境就搞好了。

4)現在是要得到android的核心編譯參數的設定檔的時候了,該檔案需要從已經安裝好的android的模擬器
中得到才行。所以安裝android的sdk也是必須的,這一步不太明白的朋友可以參考我以前發的android
命令列體驗的文章。
首先啟動android模擬器,然後通過adb得到模擬器中提供的核心設定檔:
$emulator &
$adb pull /proc/config.gz .
這時候adb工具會串連模擬器,並從它裡面下載一個叫做config.gz的檔案到你的目前的目錄下。
把它拷貝到你的kernel目錄:
$cd ~/android/kernel
$cp ~/config.gz .
解壓縮該檔案,並重新命名為.config,這一步做了就可以跳過make menuconfig之類的核心參數設定
動作了。
$gunzip config.gz
$mv config .config

5)修改kernel目錄中的Makefile檔案,用emacs或vi開啟該Makefile

修改CROSS_COMPILE變數為:
CROSS_COMPILE=arm-none-linux-gnueabi-
這個就是剛剛的下載和解壓的工具鏈的首碼了,旨在告訴make,在編譯的時候要使用我們的工具鏈。

在Makefile中注釋掉LDFLAGS_BUILD_ID這個變數:
例如將如下定義:
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call ld-option, -Wl$(comma)--build-id,))
修改為:
LDFLAGS_BUILD_ID=
#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
# $(call ld-option, -Wl$(comma)--build-id,))
把它注釋掉的原因是目前android的核心還不支援這個選項。--build-id選項,主要是用於在產生的elf
可執行檔中加入一個內建的id,這樣在core dump,或者debuginfo的時候就可以很快定位這個模組是
哪次build的時候弄出來的。這樣就可以避免,每次都把整個檔案做一遍效驗,然後才能得到該檔案的是由
哪次build產生的。對於核心開發人員來說,這是很不錯的想法,可以節約定位模組版本和其影響的時間。
目前,該功能還出於early stage的狀態,未來的android或許會支援,但至少目前的版本是不支援的。
所以,用#注釋掉即可,或者害怕不保險的話,就加入LDFLAGS_BUILD_ID=空,這樣即使編譯的時候用了,
也只是一個空格而已。
對這個--build-id選項感興趣的朋友,可以訪問下面的網址,它的作者已經解釋得非常明白了:
http://fedoraproject.org/wiki/Releases/FeatureBuildId

6)終於可以開始make了。
$ make
不出意外的話,應該整個過程都會非常順利,最終會在~/android/kernel/arch/arm/boot目錄下面
產生一個zImage,這個就是我們要的核心映像了。

7)激動人心的時刻終於到來了,我們可以測試一下剛剛編譯出來的核心可以不可以用了。
$emulator -kernel ~/android/kernel/arch/arm/boot/zImage
當看到red eye在晃來晃去,最終顯示出來android的介面的時候,一顆懸著的心總算放下了。

android的proc裡面的version如下:
# cat version
Linux version 2.6.23 (wayne@wayne) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Sat Jan 19 18:11:44 HKT 2008從這裡就可以看出,這是自己編譯的kernel,而不是人家sdk裡面內建的kernel-qemu了。

android內建的sdk裡面的kernel映像的version應該是:
# cat version
Linux version 2.6.23-gcc3bc3b4 (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #3 Tue Oct 30 16:28:18 PDT 2007
hoho, 這裡不會把這個開發人員的email暴露出來了吧。。。

android的cpuinfo如下:
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 313.75
Features : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Cache type : write-through
Cache clean : not required
Cache lockdown : not supported
Cache format : Harvard
I size : 4096
I assoc : 4
I line length : 32
I sets : 32
D size : 65536
D assoc : 4
D line length : 32
D sets : 512

Hardware : Goldfish
Revision : 0000
Serial : 0000000000000000
不過挺奇怪的,google sdk內建的核心映像的BogoMIPS是3.18的,作者編譯出來的是3.13的。

為了方便沒有安裝sdk的朋友也可以編譯核心,我把config.gz貼上來:

http://files.cnblogs.com/AlphaDu/config.zip

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.