mac os 平臺下載並編譯android2.3.3源碼

如今在作有關android平臺下的項目,最初對android環境各類不熟悉,搞了幾個月終於有點眉目了,因爲須要用到android自己提供的一些相似gps,tts等服務,單純的看android提供的java層的api感受仍是不甚痛快,最終仍是痛定思痛決定看源碼,也好爲之後系統的移植打點基礎;(ps:我要下載的是android2.3.3版本的代碼)廢話就到這,準備下載源碼了。。。、html

step一、因爲mac默認的磁盤格式是Mac OS 擴展(日誌式),這個對大小寫不敏感,因此須要本身動手再從新建立一個創建大小寫敏感硬盤鏡像,

網上有兩種方法       java

第一種:linux

磁盤工具 –>新建鏡像,隨便取個名字,好比Android,30GB足夠了(官方建議建立的空間最小25G,建立大點的空間有助於之後的更新升級),而後注意選成Mac OS Extended (Case-sensitive, Journaled), –> Create; 路徑必定要保存爲~/Android.dmg。這種方法我試了下感受好慢啊,因此我最終選擇了第二種方法。android

第二種:c++

經過terminal命令行來建立。打開terminal,在命令行中輸入命令:git

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 30g ~/android.dmg    

這將創建一個 .amg或者是一個.dmg.sparseimage後綴的磁盤映像. 將下面的命令添加到~/.bash_profile 文件裏面.這樣的話當你在命令行中執行"mountAndroid的時候,就能夠加載映像文件了.express

mount the android file image function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; } 

若是你的文件後綴是android.dmg.sparseimage那添加的就是vim

mount the android file image function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }

一旦安裝,您將作全部你的工做在「android」體積。你能夠驅逐它(卸載它)就像使用一個外部驅動。這裏很不幸,按照上面在.bash_profile文件種添加上述代碼在我使用source命令時一直報錯,mountAndroid命令找不到,因此我這裏只能手動輸入api

hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android

若是遇到這這種狀況的仍是手動輸入吧。bash

step二、上面是把存放源碼的空間給弄好了,下面是要弄下載和編譯的準備工做了

2.1: Xcode是少不了的,沒有安裝的同窗仍是安裝吧,我也是剛安裝的。沒安裝的就安裝個最新版的,這個直接在appStore就下載了方便。

2.3:安裝MacPorts以前須要確認環境變量PATH中,/opt/local/bin出如今/usr/bin以前,能夠運行一下這行來確認:

echo $PATH 

不然,在.bash_profile文件種添加

 PATH=/opt/local/bin:$PATH

特別說明:下面的一些知道step3的步驟我這邊總出問題就跳過了,事實上也沒影響後面源代碼的下載,跳不跳過就取決與你了

從MacPorts安裝make, git, and GPG packages:

POSIXLY_CORRECT=1 sudo port install gmake libsdl git-core gnupg

若是你是Mac OS X 10.4版本的話,還要安裝個bison

POSIXLY_CORRECT=1 sudo port install bison

下面要把gmake 3.82還原到3.81,不然以後編譯源碼會出錯:(3.82有Bug,用不了):

sudo vim /opt/local/etc/macports/sources.conf

而後在rsync那行的上面一行加上

file:///Users/Shared/dport

以後按這個步驟來就好了:

mkdir /Users/Shared/dports
cd /Users/Shared/dports/
svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
portindex /Users/Shared/dports

安裝3.81版的:

sudo port install gmake @3.81

檢查一下gmake版本,看到版本號是3.81就對了:

gmake --version

因而最後下載Android源碼前的最後一步就是,修改文件標識符限制:
因爲Mac OS 默認將同時打開的文件標識符數量限制得過小,並行編譯處理時可能會超出這個限制。因此在 ~/.bash_profile 里加上這麼一段:
# set the number of open files to be 1024

ulimit -S -n 1024

step四、開始下載android的源碼了,開心啊

4.1,在你的home目錄下建立文件夾 /bin

mkdir ~/bin

4.2,設置環境變量

PATH=~/bin:$PATH

4.3,下載repo工具.而且給這個工具可執行權限

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo

4.4,初始化repo客戶端,由於是mac os系統,因此將以前建立的 android.dmg.sparseimage 映像掛載上,執行下面的命令:

//掛載映像(ps: 這個命令我這邊無法執行只能退而求其次執行這個 hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android)
mountAndroid  
//進入到這個映像目錄裏面
cd /Volumes/android
//建立工做目錄文件夾 
mkdir WORKING_DIRECTORY
//進入到這個目錄下
cd WORKING_DIRECTORY 

4.五、初始化repo工具,準備訪問google源碼倉庫:

repo  init -u  https://android.googlesource.com/platform/manifest -b android-2.3.3_r1 

 有的時候若是使用上面的命令不能鏈接android服務器,咱們可使用下面的命令鏈接:

repo init -u   https://android.googlesource.com/a/platform/manifest -b android-2.3.3_r1

這個時候,要保證您的mac可以上網,而且能正常鏈接到Android服務器,在初始化完repo工具後,會讓你輸入gmail郵箱及用戶名驗證。

4.六、下載源碼經過執行下面的命令,開始下載Android源碼:

repo sync  

若是你的PC機足夠給力,能夠在命令後面加上–jn,n表示多個線程同時下載,能夠提升下載速度。

而後是漫長的等待,固然若是你網速足夠給力下載時間會被大大的壓縮的,我這20M的帶寬下完也就4個小時左右,

小睡一會打打遊戲或者乾點別的很快就過去了。。

有的時候,網絡可能會斷,或者出現什麼別的錯誤咱們可使用下面的腳原本進行下載,當出錯時,會自動下載。

 1 #!/bin/bash
 2 PATH=~/bin:$PATH
 3 repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.3_r1
 4 repo sync
 5 while [ $? != 0 ]; 
 6 do
 7          echo 「  **Error: sync failed, re-sync again」
 8          sleep 5
 9          repo sync
10 done

 

若是你執行這個腳本有問題的的能夠手動執行下面命令,反正都是下載同步都OK啦

$ repo sync

4.七、其它源碼下載源

前面所述的下載步驟是Google放出一官方版本的Android代碼,它裏面一般只有模擬器和部分和Google有合做關係設備的源碼,若是要想編譯一個目標設備的Android4.0.1系統,咱們確定要對其進行定製,不過有一些知名的設備生產廠商或第三方廠商,也會開源針對本身設備的Android系統,如:三星,高通等,比較專業的,網址以下:

www.linaro.org

linaro網站主要是ARM的芯片的最新Android解決方案,如:基於三星獵戶座芯片的origen開發板,基於TI的OMAP系統芯片的PandaBoard板,基於Nova A9500 ARM 雙核Cortex A9的snowball開發板等。

若是從上述網站上下載源碼,要根據上述網站的說明進行相關操做。

4.八、下載Goldfish內核源碼

Google在開發Android系統的同時,使用qemu開發了針對每一個版本的一個模擬器,這大大下降了開發人員的開發成本,便於Android技術的推廣。qemu是一個開源的模擬處理器軟件,而Google使用qemu模擬的是ARM926ej-S的Goldfish處理器,若是開發人員在沒有目標開發板的狀況下,要對硬件進行操做的話,必然要去操做Android底層的驅動,咱們可使用模擬器的內核源碼。

從Android的遠程源碼倉庫下載源碼

git clone http://android.googlesource.com/kernel/goldfish.git 

 固然,若是你要編譯指定目標平臺的kernel的話,也能夠從指定的倉庫裏下載,官方給出了下列處理器的kernel:

1 git clone https://android.googlesource.com/kernel/common.git
2 git clone https://android.googlesource.com/kernel/exynos.git
3 git clone https://android.googlesource.com/kernel/goldfish.git
4 git clone https://android.googlesource.com/kernel/msm.git
5 git clone https://android.googlesource.com/kernel/omap.git
6 git clone https://android.googlesource.com/kernel/samsung.git
7 git clone https://android.googlesource.com/kernel/tegra.git

大概幾十分鐘後,下載完了,以下圖所示:

 

進入到goldfish目錄下:

cd goldfish
ls -al

經過ls –al命令查看當前目錄,能夠看到隱藏的.git

 

經過git branch –a來查看因此分支:

git branch -a

 

經過git checkout來獲得源碼

git checkout remotes/origin/android-goldfish-2.6.29

以下圖所示,當前目錄下出現了Linux內核源碼的目錄結構:

至此源代碼下載完畢。。。

  step 3準備編譯源代碼嘍

關於android系統的編譯,Android的官方網站上也給出了詳細的說明。

http://source.android.com/source/building.html

3.一、初始化編譯環境

切換到Android源碼目錄:

cd WORKING_DIRECTORY

執行下面命令,加載編譯過程當中用到的命令、環境變量:

source build/envsetup.sh

3.2 選擇編譯選項

執行下面的命令,從列表中選擇一個編譯項:

$ lunch
You're building on Darwin
 
Lunch menu... pick a combo:

     1. generic-eng
     2. full_passion-userdebug
     3. full_crespo-userdebug

 

固然在lunch命令時出現的提示可能有所不一樣這個都沒有關係

咱們選擇:1,也就是說,編譯generic-eng的目標,固然咱們也能夠直接指定編譯項,以下:

lunch generic-eng

 

其中,lunch命令是指打印或設置出當前系統中設置的編譯項,generic-eng這個編譯項由兩部分組成,其中前半部分generic表示目標設備爲Android的模擬器,官方解釋爲:後半部分eng表示帶有調試功能的工程機。

3.3 編譯源碼

輸入下面命令開始編譯:

 $ make -jn

 其中,-jn表示,n個線程同時編譯,通常n的值爲CPU核的2倍,可是,也要和你的Ubuntu的內存有關係,每一個線程在編譯時最少須要1G內存,若是你沒有不少內存,仍是直接使用make命令吧,不然,編譯到後面會出錯。

 3.4 編譯排錯
真的很討厭編譯的時候居然還不能順順當當的
問題一、
因爲我裝的Xcode是最新版本4.6.3,它所帶的SDK的版本是10.8,並且也沒有生成/Developer之類的目錄,因此make的時候就出現下面的提示
Please install the 10.5 SDK on this machine at /Developer/SDKs/MacOSX10.5.sdk
下面這個是MacOSX SDK安裝路徑,後面會用到
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

 

解決方法有兩個
這個是
  第一個:修改以下幾個文件:

此時請保準你當前的路徑是在你下載android源代碼的目錄下 

修改 external/qemu/Makefile.android

LEOPARD_SDK :=/Developer/SDKs/MacOSX10.5.sdk

 

改成:
LEOPARD_SDK :=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

 第二個文件:build/core/combo/HOST_darwin-x86.mk

sdk_105_root :=/Developer/SDKs/MacOSX10.5.sdk
改成: 
sdk_105_root :=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

 以上兩個文件解決了下面的問題:

Please install the 10.5 SDK on this machine at /Developer/SDKs/MacOSX10.5.sdk  
external/qemu/Makefile.android:82: *** Aborting the build..  Stop.  

網上有人建議將external/qemu/Android.mk文件所有註釋或者刪除,此方法不可取,由於這樣作你最後是得不到emulator這個可執行文件的,至關於大部分工做沒作.

  第二個解決方法就是手動安裝 MacOSX10.5.sdk 下面是網友提供的下載連接

下載地址: http://download.csdn.net/detail/guoguoljg/4095743(感謝gougouljg的貢獻)
sudo mkdir /Developer
安裝時要選擇安裝在/Developer中。兩種方法挑一個吧,我選的是第一個,哈哈……
問題2
host C: libclearsilver-jni <= external/clearsilver/java-jni/j_neo_util.c
external/clearsilver/java-jni/j_neo_util.c:258:12: error: expected expression
    return nerr_raise(NERR_ASSERT,
           ^
external/clearsilver/java-jni/../util/neo_err.h:88:69: note: expanded from macro 'nerr_raise'
   nerr_raisef(__PRETTY_FUNCTION__,__FILE__,__LINE__,e,f,__VA_ARGS__)
                                                                    ^
external/clearsilver/java-jni/j_neo_util.c:269:12: error: expected expression
    return nerr_raise(NERR_ASSERT,
           ^
external/clearsilver/java-jni/../util/neo_err.h:88:69: note: expanded from macro 'nerr_raise'
   nerr_raisef(__PRETTY_FUNCTION__,__FILE__,__LINE__,e,f,__VA_ARGS__)
解決辦法:
sudo bash
mv /usr/bin/cc /usr/bin/cc_bak
mv /usr/bin/c++ /usr/bin/c++_bak
ln -s /usr/bin/llvm-gcc-4.2 /usr/bin/cc
ln -s /usr/bin/llvm-g++-4.2 /usr/bin/c++
問題3 strnlen錯誤
詳情請看: http://blog.sephiroth.it/
./external/elfutils/config-compat-darwin.h:42: error: static declaration of ‘strnlen’ follows non-static

修改 ./external/elfutils/config-compat-darwin.h.

1 static inline size_t strnlen (const char *__string, size_t __maxlen)
2 {
3 int len = 0;
4 while (__maxlen-- && *__string++)
5 len++;
6 return len;
7 }

替換爲:

#if 0
static inline size_t strnlen (const char *__string, size_t __maxlen)
{
int len = 0;
while (__maxlen-- && *__string++)
len++;
return len;
}
#endif
//其實也就將這個strnlen這個函數註釋掉,自己就是由於重複定義strnlen這個函數致使的問題

 問題4 symbol(s) not found for architecture i386

解決:
---------------------- ----------------------
cp external/qemu/Android.mk external/qemu/Android.mk_backup
vim external/qemu/Android.mk
 //所有加#註釋掉

 問題解決了,就好好的等吧,

3.5 編譯goldfish內核源碼 

編譯Linux源碼必然要先指定gcc交叉編譯器,咱們直接使用Android自帶的arm-eabi-4.4.3編譯器,它在WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin路徑下。 

ls WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

咱們編譯下面一個編譯腳本make_zImage.sh,讓這個腳本去編譯goldfish的內核

1 #!/bin/bash
2 
3 export PATH=/home/farsight/andorid/android4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
4 export ARCH=arm
5 export SUBARCH=arm 
6 export CROSS_COMPILE=arm-eabi-  
7 make goldfish_armv7_defconfig  
8 make

 

給make_zImage.sh添加可執行權限,而後執行該編譯腳本:

chmod a+x make_zImage.sh
./make_zImage.sh

當咱們看到下面的結果時,表示goldfish的內核編譯出來了:

3.6 Android編譯過程分析

若是想要了解,Android的編譯過程,能夠參照下面三篇博文:

Android編譯系統詳解(一):http:/blog.csdn.net/mr_raptor/article/details/7539978

Android編譯系統詳解(二):http://blog.csdn.net/mr_raptor/article/details/7540066

Android編譯系統詳解(三):http:/blog.csdn.net/mr_raptor/article/details/7540730

按照google給出的編譯步驟以下:

  1> source build/envsetup.sh:加載命令

  2> lunch:選擇目標平臺編譯選項

  3> make:執行編譯

咱們按照編譯步驟來分析編譯過程的細節,最終添加本身的平臺產品的編譯選項。

參考文章

 很感謝下面的博主,他們的博文讓我解決了一個又一個問題,在這真誠的說聲謝謝!!

http://blog.csdn.net/mr_raptor/article/details/7946254  (ps:我不會告訴你這位博主很牛XX的)

http://blog.csdn.net/ym19860303/article/details/7735010

http://blog.csdn.net/wawxf2008/article/details/8648662

http://blog.csdn.net/anydroid/article/details/8228415

http://jinganglang777.blog.163.com/blog/static/79085497201273061657988/

http://blog.sephiroth.it/

PS

擦,終於整理完了好累,好辛苦,寫博客確實好累真心感受到了,在這裏對那些發表過博文的博主說聲謝謝了。。。好餓有木有,中午餐還沒吃,趕忙吃飯去了;有問題請留言。。

相關文章
相關標籤/搜索