如今在作有關android平臺下的項目,最初對android環境各類不熟悉,搞了幾個月終於有點眉目了,因爲須要用到android自己提供的一些相似gps,tts等服務,單純的看android提供的java層的api感受仍是不甚痛快,最終仍是痛定思痛決定看源碼,也好爲之後系統的移植打點基礎;(ps:我要下載的是android2.3.3版本的代碼)廢話就到這,準備下載源碼了。。。、html
網上有兩種方法 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
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
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
前面所述的下載步驟是Google放出一官方版本的Android代碼,它裏面一般只有模擬器和部分和Google有合做關係設備的源碼,若是要想編譯一個目標設備的Android4.0.1系統,咱們確定要對其進行定製,不過有一些知名的設備生產廠商或第三方廠商,也會開源針對本身設備的Android系統,如:三星,高通等,比較專業的,網址以下:
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 編譯排錯/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 下面是網友提供的下載連接
sudo mkdir /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錯誤
./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的內核編譯出來了:
若是想要了解,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/
擦,終於整理完了好累,好辛苦,寫博客確實好累真心感受到了,在這裏對那些發表過博文的博主說聲謝謝了。。。好餓有木有,中午餐還沒吃,趕忙吃飯去了;有問題請留言。。