Android ROM研究—如何在ubuntu下下載薑餅(Gingerbread)原始碼並編譯android ROM

來源:互聯網
上載者:User

http://www.iteye.com/topic/1112650

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

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

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個小時左右

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 += -m64LOCAL_LDFLAGS += -m64 

 

注釋掉,或者將“64”換成“32”

LOCAL_CFLAGS += -m32LOCAL_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/genericANDROID_PRODUCT_OUT_BIN=/root/bin/out/host/linux-x86/binexport PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT}

 

儲存退出後,更新一下.bashrc

#source .bashrc

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

核心版本好都是一樣的,說明下載的核心原始碼跟手機用的是一樣的

參考資料: 
(1) http://source.android.com/index.html 
(2) http://forums.androidcentral.com/t-mobile-nexus-s-rooting-roms-hacks/48675-how-compile-nexus-s-kernel-source.html 
(3) http://forum.xda-developers.com/showthread.php?t=704561

相關文章

聯繫我們

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