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