天天看點

Android源碼下載下傳、編譯、運作

一、 擷取 Android 源代碼

Git 是 Linux Torvalds ( Linux 之父)為了幫助管理 Linux 核心開發而開發的一個開放源碼的分布式版本控制軟體,它不同于 Subversion 、 CVS 這樣的集中式版本控制系統。在集中式版本控制系統中隻有一個倉庫( Repository ),許多個工作目錄( Working Copy ),而在 Git 這樣的分布式版本控制系統中(其他主要的分布式版本控制系統還有 BitKeeper 、 Mercurial 、 GNU Arch 、 Bazaar 、 Darcs 、 SVK 、 Monotone 等),每一個工作目錄都包含一個完整倉庫,它們支援離線工作,本地送出可以稍後送出到伺服器上。

因為 Android 是由 Kernel 、 Dalvik 、 Bionic 、 Prebuilt 、 build 等多個項目組成,如果我們分别使用 Git 來逐個擷取顯得很麻煩,是以 Android 項目編寫了一個名為 Repo 的 Python 的腳本來統一管理這些項目的倉庫,使得項目的擷取更加簡單。

在 Ubuntu 9.04 上安裝 Git 隻需要設定正确的更新源,然後使用 apt-get 就可以了, apt-get 是一條 Linux 指令,主要用于自動從網際網路的軟體倉庫中搜尋、安裝、更新、解除安裝軟體或作業系統。

apt-get 指令一般需要 root 權限執行,是以一般跟着 sudo 指令。

sudo apt-get install git-core curl

這條指令會從網際網路的軟體倉庫中安裝 git-core 和 curl 。

其中 curl 是一個利用 URL 文法在指令行方式下工作的檔案傳輸工具,它支援很多協定,包括 FTP 、 FTPS 、 HTTP 、 HTTPS 、 TELENT 等,我們需要安裝它從網絡上擷取 Repo 腳本檔案。

sudo vim /home/username/bin/repo

curl http://android.git.kernel.org/repo >/home/username/bin/repo

這句指令會下載下傳 repo 腳本檔案到目前主目錄的 /bin 目錄下,并儲存在檔案 repo 中。

最後我們需要給 repo 檔案可執行權限

chmod a+x  /home/username/bin/repo

接下來我們就可以利用 repo 腳本和 Git 、 curl 軟體擷取 Android 的源代碼了:)

首先建一個目錄,比如 /home/username/android 。

然後使用下面指令擷取源碼:

repo init –u git://android.git.kernel.org/platform/manifest.git

這個過程會持續很長的時間(筆者下載下傳了一天),下載下傳完畢後會看到 repo initialized in /android 這樣的提示,說明本地的版本庫已經初始化完畢,并且包含了目前最新的 sourcecode 。

如果我們想拿某個分支版本的代碼,而不是主線代碼,需要使用 -b 參數指定 branch 的名字,比如:

repo init –u git://android.git.kernel.org/platform/manifest.git –b cupcake

如果我們隻是想擷取某一個 project 的代碼,比如 kernel/common ,就不需要 repo 腳本了,直接使用 Git 工具即可,如果仔細研究 repo 腳本會發現, repo 腳本其實就是組織 Git 工具去擷取各個 Project 并把它們組織到同一個項目 Android 内。

git clone git://android.git.kernel.org/kernel/common.git

我們上面使用 repo 腳本擷取了各個項目,那麼接下來就需要把整個 Android 代碼樹同步到本地,如下:

repo sync project1 project2 …

 * [new tag]         android-2.1_r2.1p -> android-2.1_r2.1p

 * [new tag]         android-2.1_r2.1p2 -> android-2.1_r2.1p2

 * [new tag]         android-2.1_r2.1s -> android-2.1_r2.1s

 * [new tag]         android-sdk-1.5-pre -> android-sdk-1.5-pre

 * [new tag]         android-sdk-1.5_r1 -> android-sdk-1.5_r1

 * [new tag]         android-sdk-1.5_r3 -> android-sdk-1.5_r3

 * [new tag]         android-sdk-1.6-docs_r1 -> android-sdk-1.6-docs_r1

 * [new tag]         android-sdk-1.6_r1 -> android-sdk-1.6_r1

 * [new tag]         android-sdk-1.6_r2 -> android-sdk-1.6_r2

 * [new tag]         android-sdk-2.0.1-docs_r1 -> android-sdk-2.0.1-docs_r1

 * [new tag]         android-sdk-2.0.1_r1 -> android-sdk-2.0.1_r1

 * [new tag]         android-sdk-2.0_r1 -> android-sdk-2.0_r1

 * [new tag]         android-sdk-2.1_r1 -> android-sdk-2.1_r1

 * [new tag]         android-sdk-tools_r2 -> android-sdk-tools_r2

 * [new tag]         android-sdk-tools_r3 -> android-sdk-tools_r3

 * [new tag]         android-sdk-tools_r4 -> android-sdk-tools_r4

 * [new tag]         android-sdk-tools_r5 -> android-sdk-tools_r5

From git://android.git.kernel.org/platform/external/tcpdump

 * [new tag]         upstream/3.9.8 -> upstream/3.9.8

Fetching projects:  48% (77/159) 

Initializing project platform/external/tesseract ...

remote: Counting objects: 1886, done.

remote: Compressing objects: 100% (1018/1018), done.

筆者使用 repo sync 指令直接同步全部項目到本地。

二、 源碼編譯

全部同步完畢後,進入到 Android 目錄下,使用 make 指令編譯,你會發現出現如下錯誤提示:

host C: libneo_cgi <= external/clearsilver/cgi/cgi.c

external/clearsilver/cgi/cgi.c:22:18: error: zlib.h: No such file or directory

這個錯誤是因為我們缺少 zlib1 g-dev ,需要使用 apt-get 指令從軟體倉庫中安裝,如下:

sudo apt-get install zlib1 g-dev

同理,我們還需要依次安裝如下軟體

sudo apt-get install flex

sudo apt-get install bison

sudo apt-get install gperf

sudo apt-get install libsdl-dev

sudo apt-get install libesd0 -dev

sudo apt-get install libncurses5-dev

sudo apt-get install libx11 -dev

以上軟體全部安裝完畢後,運作 make 指令再次編譯 Android 源碼。

這個時候你會發現出現很多 java 檔案無法編譯的錯誤,打開 Android 的源碼我們可以看到在 android/dalvik/libcore/dom/src/test/java/org/w3c/domts 下有很多 java 源檔案,這意味着編譯 Android 之前需要先安裝 JDK 。

首先從 sun 官方網站下載下傳 jdk-6u16-linux-i586.bin 檔案并安裝它。

在 Ubuntu 8.04 中, /etc/profile 檔案是全局的環境變量配置檔案,它适用于所有的 shell 。在我們登陸 Linux 系統時,首先啟動 /etc/profile 檔案,然後再啟動使用者目錄下的 ~/.bash_profile 、 ~/.bash_login 或 ~/.profile 檔案中的其中一個,執行的順序和上面的排序一樣。如果 ~/.bash_profile 檔案存在的話,一般還會執行 ~/.bashrc 檔案。

       是以我們隻需要把 JDK 的目錄放到 /etc/profile 裡即可,如下:

JAVA_HOME=/usr/local/src/jdk1.6.0_16

PATH=$PATH:$JAVA_HOME/bin:/usr/local/src/android-sdk-linux_x86-1.1_r1/tools:~/bin

然後重新啟動一下機器,輸入 java –version 指令,提示如下資訊代表配置成功:

java version "1.6.0_16"

Java(TM) SE Runtime Environment (build 1.6.0_16-b01)

Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode, sharing)

       在編譯完整個項目後,終端會出現如下提示:

       Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img

Install system fs image: out/target/product/generic/system.img

Target ram disk: out/target/product/generic/ramdisk.img

Target userdata fs image: out/target/product/generic/userdata.img

Installed file list: out/target/product/generic/installed-files.txt

[email protected]:/bin/android #

三、 源碼運作

在編譯完整個項目後,如果我們需要觀看編譯後的運作效果,那麼就需要在系統中安裝模拟器 android-sdk-linux_x86-1.1_r1 ,這個 SDK 的下載下傳位址為:

linux: http://dl.google.com/android/android-sdk-linux_x86-1.1_r1.zip

mac: http://dl.google.com/android/android-sdk-mac_x86-1.1_r1.zip

windows: http://dl.google.com/android/android-sdk-windows-1.1_r1.zip

解壓後需要把 /usr/local/src/android-sdk-linux_x86-1.1_r1/tools 目錄加入到系統環境變量 /etc/profile 中。

然後找到編譯後 android 的目錄檔案 out ,我們發現在 android/out/host/linux-x86/bin 下多了很多應用程式,這些應用程式就是 android 得以運作的基礎,是以我們需要把這個目錄也添加到系統 PATH 下,在 $HOME/.profile 檔案中加入如下内容:

PATH=”$PATH:$HOME/android/out/host/linux-x86/bin”

接下來我們需要把 android 的鏡像檔案加載到 emulator 中,使得 emulator 可以看到 android 運作的實際效果,在 $HOME/.profile 檔案中加入如下内容:

ANDROID_PRODUCT_OUT=$HOME/android/out/target/product/generic

export ANDROID_PRODUCT_OUT

然後重新啟動機器。

下面就可以進入到模拟器目錄中并啟動模拟器

cd $HOME/android/out/target/product/generic

emulator -image system.img -data userdata.img -ramdisk ramdisk.img

總結一下安裝過程中的關鍵點:

1:JDK版本必須安裝

2:利用下面的指令確定所需軟體都被正确安裝

sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential python valgrind curl git

3:記憶體及虛拟記憶體保證在2GB以上,可以采用指令行free -m檢視記憶體是否足夠,如果記憶體不夠終端停滞