Android ROM研究---如何在ubuntu下下載薑餅(Gingerbread)源代碼並編譯Android ROM

====http://www.linuxidc.com/Linux/2011-07/39339p4.htm





Android源代碼由兩部分組成,其一是Android系統應用部分的代碼,其次是Android所使用的內核代碼,

由於公司是針對Google nexus s來開發rom,所以需要下載三星的內核代碼

Android 系統應用代碼 http://android.git.kernel.org/

Android內核代碼 http://android.git.kernel.org/?p=kernel/samsung.git

準備階段:安裝JDK  
Java 6: for Gingerbread and newer

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo add-apt-repository "deb-src http://archive.canonical.com/Ubuntu lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk 

Java 5: for Froyo and older

$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper main multiverse"
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper-updates main multiverse"
$ sudo apt-get update
$ sudo apt-get install sun-java5-jdk

1、安裝一些必備的軟件。

Git是Linux Torvalds爲了幫助管理Linux內核而開發的一個開放源碼的分佈式版本控制系統軟件,它不同於SVN,CVS這樣集中式的版本控制系統。在集中式版本控制系統中只有一個倉庫(repository),
許多個工作目錄,而git這樣的分佈式控制系統中,每一個工作目錄都包含一個完整倉庫,它們支持離線工作,
本地提交可以稍後提交到服務器上。分佈式系統理論上也比集中 式的單服務器系統更健壯,單服務器系統一旦
服務器出現問題整個系統就不能運行了,分佈式系統通常不會因爲一兩個節點而收到影響。

因爲Android是由kernel,Dalvik,Bionic,prebuild,build等多個Git項目組成,

所以Android項目編寫了一個名爲repo的python的腳本來統一管理這些項目的倉庫,使得Git的使用更加簡單。

$sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos
2、創建源代碼目錄 
首先確保在當前用戶的主目錄下創建一個/bin目錄(如果沒有的話),然後把它加到PATH環境變量中,
這個bin目錄名字隨便,是用來存放你下載的android系統應用源代碼的

#cd
#mkdir bin
#export PATH=$PATH:/root/bin
3、用curl下載repo腳本,並保存在~/bin/repo文件中

#curl http://android.git.kernel.org/repo >~/bin/repo
爲repo加上執行權限

#chmod a+x ~/bin/repo
4、初始化版本庫 
由於google nexus s所使用的是android 2.3.4版本的系統
首先建立一個目錄,用來存放下載下來的東西

#mkdir repo
#cd repo
選擇你所下載的版本號,Nexus S對應的是crespo android-2.3.4_r1 
Device Branch Build configuration 
crespo android-2.3.4_r1 full_crespo-userdebug 
crespo4g gingerbread full_crespo4g-userdebug 
passion android-2.3.4_r1 full_passion-userdebug 
sapphire android-2.2.2_r1 full_sapphire-userdebug 
dream android-2.2.2_r1 full_dream-userdebug 
以後,執行如下命令

#repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread由於之前下載的是android2.3.3版本的,所用的參數是android-2.3.3_r1,但是用android-2.3.4_r1測試後不能下載,
需要的參數是gingerbread
注意:如果要是把所有的版本都下載下來,那時間是需要很久很久的,需要耐心等待,但是如果僅僅是下載某一個版本的話,
很快就可以了。
最後,如果看到repo initialized in /repo的提示,說明本地的版本庫已經初始化成功了(期間需要你填寫姓名和郵件)

5、執行repo sync命令 
在執行該命令之前,需要做一些改動,因爲如果用git的方式下載的話,需要很多時間不說,而且不一定有結果,可能還會出現
Connection timed out錯誤等。所以進入.repo文件夾下打開後找到清單manifest.xml(manifest.xml爲隱藏文件,
得顯示文件後才能看到)

#cd .repo
#ll
#vim mainfest.xml
將fetch=”  git://android.git.kernel.org/”修改爲fetch=”http//android.git.kernel.org”[[br ]] 通過用http的方式穿透,然後執行repo sync

#repo sync
如果出現如下的字樣的話,說明下載完成了,否則,嘿嘿,你懂的。

Java代碼  
Syncing work tree:100%(168/168),done. 

這個下載過程同樣需要很久,少則幾個小時,多則幾天,依賴於網速

linux


=====


6、編譯Android系統應用的源代碼 
經過漫長的等待,在執行repo sync命令後約1天時間以後,終於將源碼下載完成,然後進入bin目錄

#cd ~/bin(注意,是在root用戶下)

這裏的這個bin目錄其實就是你下載後源代碼所在的位置,查看該文件夾下的東西類似如下
|-- Makefile |-- bionic (bionic C庫)
|-- bootable (啓動引導相關代碼)
|-- build (存放系統編譯規則及generic等基礎開發包配置)
|-- cts (Android兼容性測試套件標準)
|-- dalvik (dalvik JAVA虛擬機)
|-- development (應用程序開發相關)
|-- external (android使用的一些開源的模組)
|-- frameworks (核心框架——java及C++語言)
|-- hardware (主要保護硬解適配層HAL代碼)
|-- out (編譯完成後的代碼輸出與此目錄)
|-- packages (應用程序包)
|-- prebuilt (x86和arm架構下預編譯的一些資源)
|-- sdk (sdk及模擬器)
|-- system (文件系統庫、應用及組件——C語言)
`-- vendor (廠商定製代碼)

這時,如果直接執行make命令的話,會出現錯誤,這是因爲在make(編譯)之前,需要安裝一些依賴包才能夠正常編譯,
否則會出現各種各樣的問題

7、編譯Gingerbread系統源代碼  
首先,需要注意的是,下載後的源代碼先不要編譯,最好備份一下,然後再編譯。不能直接make 
(1)進入到你的bin目錄下,清理編譯過的文件,釋放空間

#make installclean
#make clean
(2)用envsetup.sh腳本初始化環境變量

#source build/envsetup.sh或者

#. build/envsetup.sh(3)選擇版本號,執行lunch操作

 

輸入full_crespo_userdebug或者4

(4)開始編譯源代碼 
#make -j4 
其中-j(n)表示用n核cpu編譯,這樣會更快速,可以用top命令查看cpu的個數

完成編譯大約1個小時左右

linux



====



8、以下是各種錯誤對應的解決辦法:

build/core/main.mk:73: You are attempting to build on a 32-bit system.
build/core/main.mk:74: Only 64-bit build environments are supported beyond froyo/2.2.
是因爲froyo/2.2默認只支持64-bit,而我的計算機是32位的,所以需要修改一些文件即可

./external/clearsilver/cgi/Android.mk 
./external/clearsilver/java-jni/Android.mk 
./external/clearsilver/util/Android.mk 
./external/clearsilver/cs/Android.mk
4個文件中的

LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64 
註釋掉,或者將“64”換成“32”

LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32 
然後,將./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch))) 
改爲:
ifneq (i686,$(findstring i686,$(build_arch)))

這樣,32位的計算機也可以正常編譯了

編譯成功後,會在~/bin/目錄下得到~/bin/out/target/product/crespo。編譯好的源代碼會在out目錄下生成兩個img鏡像文件,可以先執行
#updatedb 創建數據庫,用來方便查詢所需的文件

#locate system.img
#locate userdata.img
9、配置環境變量 
增加環境變量

#vim /root/.bashrc
在.bashrc中增加環境變量,如下

export ANDROID_PRODUCT_OUT=/root/bin/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=/root/bin/out/host/linux-x86/bin
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT}
保存退出後,更新一下.bashrc

#source .bashrc

linux




====



10、在模擬器上運行編譯好的鏡像文件 
最後,同步這些變化:(注意,我的~是/root,我是以root用戶登錄的)

# source ~/.bashrc
# cd ~/Android/out/target/product/crespo
# emulator -system system.img -data userdata.img -ramdisk ramdisk.img
最後進入android桌面,就說明成功了。 但是上面的只是系統應用源碼編譯完成後,用google自帶的模擬器來運行測試的,而我需要用google nexus s
的三星的內核編譯,所以還需要其他的動作要進行

11、下載Nexus s 的kernel source

#cd /root/bin
(你的項目創建的源代碼,就是大多人用的~/mydroid這個目錄)

#git clone git://android.git.kernel.org/kernel/samsung.git
下載完成後,會在bin目錄下面出現一個samsung的文件夾,這個就是你剛纔下載的內核源碼所在的位置,現在開始編譯

#export PATH=$PATH:/root/bin/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/
#make ARCH=arm clean
#make ARCH=arm herring _defconfig
#make -j4 ARCH=arm CROSS_COMPILE=arm-eabi-
說明:上面四條語句要正確,尤其是路徑要正確,否則後面執行make的時候會出現各種各樣的錯誤
第一條:設置交叉編譯鏈,這樣內核編譯環境就設置好了
第二條:爲內核結構準備源目錄樹
第三條:內核參數設置
第四條:j4表示4核CPU

差不多一個小時左右,你會發現,在samsung目錄下有
/root/bin/samsung/arch/arm/boot/zImage鏡像文件
/root/bin/samsung/drivers/net/wireless/bcm4329/bcm4329.ko

12、將你的手機取得root權限 
接下來,要將編譯好的鏡像文件放入到真機裏進行測試,首先需要做的工作是先將你的手機root,
只有有了root權限以後才能夠進行下一步操作。詳細的Nexus S的root步驟參考wiki上的root教程,
因爲只有手機root以後,才能夠將自己編譯好的內核在Nexus S上測試

13、在手機上運行編譯好的samsung內核  
現在的工作是將編譯好的內核在Nexus S上測試,下載下面的附件,解壓後將fastboot文件存放到你的SDK/tools目錄下,
將unpack-booting.pl腳本文件和mkbootimg 二進制文件放入到你的roo目錄下的NS-bootwork文件夾下,另外,
將你編譯好的zImage鏡像文件也好拷貝到此文件夾下(如果沒有該文件夾,自己創建)

進入你的SDK/tools目錄下,執行adb shell
$adb shell
此時,你的手機上顯示“授權請求”,默認是10秒以後就過時了,所以需要在10秒之內,點擊允許。點擊允許以後,
$符號將會變成#,表示已經取得了root權限。(注意:手機必須root以後才能夠使用)

將boot.img下載到本地,你可以用adb命令,也可以用終端程序

#adb shell
$su
#cat /dev/mtd/mtd2 > /sdcard/boot.img
退出adb到終端的tools目錄下

#adb pull /sdcard/boot.img /root/NS-bootwork
#cd NS-bootwork
#./unpack-booting.pl boot.img
#cd boot.img-ramdisk/
#find . | cpio -o -H newc | gzip > /root/NS-bootwork/boot.img-ramdisk/ramdisk-repack.cpio.gz
#cd ..       
#./mkbootimg --kernel zImage --ramdisk /root/NS-bootwork/boot.img-ramdisk/ramdisk-repack.cpio.gz
 --base 0x30000000 --pagesize 4096 -o newtestboot.img
這樣,就在該目錄下生成了一個newtestboot.img鏡像文件

進入到SDK/tools文件夾下,關閉你的手機。然後長按電源鍵和音量上鍵進入bootloader界面
Ubuntu的終端上執行

#cd /home/loulijun/android/android-sdk-linux_86/tools
#./fastboot boot newtestboot.img(必須是root權限)

如果boot成功,說明你的內核是對的,點擊“設置”--“關於手機”--“內核版本“
顯示
2.6.35.7-ge382d80
root@ubuntu#1 
說明成功了,但這只是測試,從新啓動後,就會回覆到之前的樣子,可以再次執行上面的操作,可以看到
2.6.35.7-ge382d80
android-build@apa28

內核版本好都是一樣的,說明下載的內核源代碼跟手機用的是一樣的

linux
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章