Android源碼下載與編譯

設置linux的編譯環境
選擇源碼的分支決定了你機器環境的配置,前面提到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
//安裝jdk6
 

Java 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
下載特定分支

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

Setp 3.從其他鏡像獲取源代碼
   如果要下載最新的源代碼,則執行:
  $ repo init -u git://git.omapzoom.org/platform/manifest
    如果要獲取每個tag,譬如2.3.5,則可以執行:
    $ repo init -u git://git.omapzoom.org/platform/manifest -b android-2.3.5_r1
  如果你不知道具體的tag叫什麼名字,那麼可以在瀏覽器訪問http://git.omapzoom.org,並點擊上面的/platform/manifest鏈接,那麼可以看到所有的tag名稱.
    執行repo init過程中,可能需要填寫一些個人信息,直接填寫即可。
    配置好repo後,執行repo sync即可下載你所需要的源代碼了。

    如果在最後一步調用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,
解決方法:

$vim external/gtest/include/gtest/internal/gtest-param-util.h
#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,也就是我們剛剛編譯出來的鏡像問題。

    當然,我們也可以以指定的鏡像文件來運行模擬器,即運行emulator時,即:
    USER-NAME@MACHINE-NAME:~/Android$ emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img
    到這裏,我們就可以在模擬器上運行我們自己編譯的Android鏡像文件了,是不是很酷呢?但是注意,這裏說的Android鏡像文件,只是包括system.img、userdata.img和ramdisk.img這三個文件,而Linux Kernel鏡像用的是Android爲我們預編譯好的kernel-qemu鏡像。那麼,有沒有辦法使用我們自己編譯的Linux Kernel鏡像呢?答案上肯定的,這樣我們就可以完全DIY自己的Android系統了!我將在下一篇文章描述如果編譯自己的Linux.

總結


發佈了22 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章