選擇源碼的分支決定了你機器環境的配置,前面提到32位系統只能編譯<2.3.x版本,所以你的機器很重要啊。
1. 安裝JDK 由於SUN JDK不再在ubuntu的主要倉庫中,爲了能夠下載它,你需要把合適的倉庫加進來。
Java 6: for 大於等於2.3版本
$ sudo add-apt-repository"debhttp://archive.canonical.com/
lucid partner" //
修改/etc/apt/sources.list
$ sudo add-apt-repository"debhttp://archive.ubuntu.com/ubuntu
hardy main multiverse"
$ sudo add-apt-repository"debhttp://archive.ubuntu.com/ubuntu
hardy-updates main multiverse"
$ sudo apt-get update //更新所有軟件包
$ sudo apt-get install sun-java6-jdk
//安裝jdk6Java 5: for 小於2.3版本
$ sudo apt-get install sun-java5-jdk
我用jdk6吧。
注意:安裝過程中,會出現“正在設定 sun-java6-jre"時,就按tab,變紅按鈕後確定。接受協議時,也是如此。
在jdk包安裝完成之後,試下java -version,確保正確安裝。
2. 安裝ubuntu必要的包(ubuntu 12.04)
在Ubuntu 12.04上僅嘗試支持編譯,並不能保證在分支和最新代碼上能成功;
$
sudo apt-get install git gnupg flex bison gperf build-essential\
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev\
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386\
libgl1-mesa-dev g++-multilib mingw32 tofrodos\
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
安裝全部庫時libc6-dev:i386錯誤$sudo apt-get install linux-libc-dev:i386
$sudo apt-get install libc6-dev:i386
再執行前面的更新。
$ sudo ln -s/usr/lib/i386-linux-gnu/mesa/libGL.so.1/usr/lib/i386-linux-gnu/libGL.so
3. 配置USB訪問(如果先在模擬器上運行,暫不做)
在GNU/linux系統下,一般用戶不能通過defaul的方式,需要配置其駐允許訪問。推薦的方法是root權限建一個文件
/etc/udev/rules.d/51-android.rules,然後用下面的代碼替換,其中<username>換成被授權訪問手機.
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12",
MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0",
MODE="0600", OWNER="<username>"
以上設置在Ubuntu 8.04/10.04上確認沒問題,在更高版本上不能保證。
3. 設置Ccache
安裝
可以選擇性的告訴編譯器使用Ccache工具,它能夠加速rebuild,如果你經常使用"make clean"的話,將非常有用。
sudo apt-get install ccache
把下面一句加到.bashrc中。
export USE_CCACHE=1
建議cache大小爲50G-100G,在下載源碼之前先執行下面的語句。
ccache -M 50G
第三步,下載Android源碼
1. 安裝repo 在home目錄下建個bin目錄.
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://git-repo.googlecode.com/files/repo-1.19 > ~/bin/repo
$ chmod a+x ~/bin/repo
2. 新建一個工作目錄Android,用於存放代碼
mkdir Android
cd Android
下載全部代碼,
下載特定分支
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 //下載4.0.1
repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.1_r1 //
repo sync
中間需要輸入用戶名和郵件地址,自個隨便輸入一個。
3. 等待,
如果中間出現死機後,再重啓不能進入XWindow,則進入recovery模式後,r
sudo apt-get install xserver-xorg
startx
如果在最後一步調用repo sync,出現“fatal: '../platform/abi/cpp.git' does not appear to be a git repository”
1、在存放android系統源代碼的目錄(也就是執行repo sync命令的目錄)下,有個.repo的隱藏目錄,用ls -a可以查看的到,進入該目錄:cd .repo;
2、打開.repo目錄下的manifest.xml文件(命令vim manifest.xml)並找到fetch屬性,在我的文件中顯示fetch="..",將fetch修改爲fetch="git://git.omapzoom.org/",保存並退出;
3、繼續repo sync就可以下載了。
第四步,編譯
通過envsetup.sh腳本初始化環境
$ source build/envsetup.sh
選擇編譯目標版本,目標有多種類型
$ lunch full-eng
編譯源碼,
$ make -j4
編譯過程,可能出現若干問題:
1.<命令行>:0:0: 錯誤: “_FORTIFY_SOURCE”重定義 [-Werror]
修改build/core/combo/HOST_linux-x86.mk 61行,將
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改成
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
2. In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0:
external/oprofile/libpp/format_output.h:94:22: 錯誤: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
解決辦法:
external/oprofile/libpp/format_output.h
把:
mutable counts_t & counts;
改爲:
counts_t & counts;
3.external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11:錯誤: ‘ptrdiff_t’不是一個類型名
In file included fromexternal/gtest/src/../include/gtest/gtest-param-test.h:157:0,
解決方法:
#include <cstddef>
4:undefined reference to `pthread_mutexattr_destroy'
host C++: libgtest_host <= external/gtest/src/gtest-all.cc
解決方法:
$vi external/llvm/llvm-host-build.mk
LOCAL_LDLIBS := -lpthread -ldl
5.error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
frameworks/compile/slang/slang_rs_export_foreach.cpp:247:23: error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
cc1plus: all warnings being treated as errors
解決方法:
$ vi frameworks/compile/slang/Android.mk
#local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter
第五步,運行
編譯生成的emulator位於~/Android/4.0.1/out/host/linux-x86/bin,在home/.bashrc下加入環境變量:
PATH=$PATH:~/Android/4.0.1/out/host/linux-x86/bin;
export PATH
$ ~/Android$ emulator
是不是看到模擬器起來了。熱淚盈眶哈
(from luo).
模擬器運行需要四個文件,分別是Linux Kernel鏡像zImage和Android鏡像文件system.img、userdata.img和ramdisk.img。執行emulator命令時,如果不帶任何參數,則Linux Kernel鏡像默認使用~/Android/prebuilt/android-arm/kernel目錄下的kernel-qemu文件,而Android鏡像文件則默認使用ANDROID_PRODUCT_OUT目錄下的system.img、userdata.img和ramdisk.img,也就是我們剛剛編譯出來的鏡像問題。
總結