Android源碼下載和編譯

搭建開發環境

Android Jelly Bean的編譯依賴Sun JDK 1.6,所以首先需要安裝JDK 1.6。

  • 下載JDK 1.6

在oracle官網上下載 jdk-6u45-linux-x64.bin
下載地址

  • 安裝JDK 1.6:
$ sudo ./jdk-6u45-linux-x64.bin
$ sudo cp jdk1.6.0_45 /usr/local
  • 配置java及環境變量

** 配置環境變量
在啟動終端并輸入

edit /etc/profile

在末尾添加一下配置,保存并退出

#set jdk environment  
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_21  
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH  
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH  

終端輸入一下命令使配置生效

source /etc/profile

update-alternatives配置java

$ sudo update-alternatives --install /usr/bin/java java /usr/local/jdk1.6.0_45/bin/java 100
$ sudo update-alternatives --install /usr/bin/javac javac /usr/local/jdk1.6.0_45/bin/javac 100
$ sudo update-alternatives --install /usr/bin/javadoc javadoc /usr/local/jdk1.6.0_45/bin/javadoc 100
  • 安裝必須的開發包
$sudo apt-get install git-core 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 gcc-4.4 gcc-4.4-multilib  mingw32  tofrodos \
  python-markdown libxml2-utils xsltproc zlib1g-dev:i386 \
  u-boot-tools openssh-client libswitch-perl g++-4.4 g++-4.4-multilib \
  cksfv uuid-dev:i386 liblzo2-dev:i386

如果想要了解上述安裝包的作用,可以到Ubuntu網站查詢。

  • 配置gcc 4.4和g++ 4.4
$sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 100
$sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 100
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
$sudo update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.4 100
$sudo update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.8 50 

下載Android上層系統源代碼

Android源代碼分成兩部分,其中Kernel部分需要單獨下載。這里先給出上層系統源碼的下載流程。該部分可以參考Android官網

  • 建立repo工作目錄
$ mkdir ~/bin
  • 下載repo腳本
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
  • 建立Android源碼目錄
$ mkdir -p ~/android/jellybean
$ cd ~/android/jellybean
  • 配置用戶名和郵箱(可選)
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

該步驟只有在使用Gerrit工具進行review-code提交代碼時才會用到,可以在初始化repo之后用repo init --config-name進行修改。

  • 初始化repo
~/bin/repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.1_r3

其中,-u為源碼的git服務器地址,-b為源碼的分支。分支列表可以查看Android官網,或者利用git ls-remote指令查看:

$ git ls-remote --tags https://android.googlesource.com/platform/manifest

如果沒有指定分支,將會下載Android主線上最新的源代碼。

  • 下載Android源碼

初始化repo之后,如果需要下載Android源碼,只需要進入源碼根目錄,然后在終端執行一下命令:

~/bin/repo sync

Android全部源碼十分龐大,如果只需要下載部分源碼,可以單獨指定模塊名稱。

查看Android源碼中所有的模塊:

~/bin/repo manifest -o-

執行后顯示的信息。

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote fetch=".." name="aosp"/>
  
  <default remote="aosp" revision="refs/tags/android-4.1.1_r3" sync-j="4"/>
  
  <project name="device/asus/grouper"/>
  <project name="device/common"/>
  <project name="device/generic/armv7-a"/>
  <project name="device/generic/armv7-a-neon"/>
  <project name="device/generic/goldfish"/>
  <project name="device/google/accessory/arduino"/>
  <project name="device/google/accessory/demokit"/>
  <project name="device/moto/common"/>
  <project name="device/moto/stingray"/>
  <project name="device/moto/wingray"/>
  <project name="device/sample"/>
  <project name="device/samsung/crespo"/>
  <project name="device/samsung/crespo4g"/>
  <project name="device/samsung/maguro"/>
  <project name="device/samsung/toro"/>
  <project name="device/samsung/torospr"/>
  <project name="device/samsung/tuna"/>
  <project name="device/ti/panda"/>
  <project name="platform/abi/cpp" path="abi/cpp"/>
  <project name="platform/bionic" path="bionic"/>
  <project name="platform/bootable/bootloader/legacy" path="bootable/bootloader/legacy"/>
  <project name="platform/bootable/diskinstaller" path="bootable/diskinstaller"/>
  <project name="platform/bootable/recovery" path="bootable/recovery"/>
  <project name="platform/build" path="build">
    <copyfile dest="Makefile" src="core/root.mk"/>
  </project>
  <project name="platform/cts" path="cts"/>
  <project name="platform/dalvik" path="dalvik"/>
  <!-- Some lines are omitted -->
</manifest>

其中,name表示項目模塊的名稱以及在源碼服務器上的相對路徑。如果需要下載某個特定的模塊,只需要執行~/bin/repo sync [name]

path表示項目的本地路徑。本地路徑也可以通過查看本地源碼根目錄下.repo/manifests/default.xml文件得到。

下載Android Linux Kernel源碼

  • 進入Android源碼根目錄
$ cd ~/android/jellybean
$ mkdir kernel
$ cd kernel
  • 下載Kernel源碼
    Kernel部分的源碼可以直接通過git工具下載
$ git clone https://android.googlesource.com/kernel/common.git

由于Kernel源碼是與硬件平臺相關的,因此在下載時需要指定平臺類型。也就是說,可以將該調指令中的common替換為sumsung, tegra等。

  • 切換到kernel 3.0分支
    由于Android JellyBean使用的是Linux 3.10內核,因此需要切換到Kernel 3.10分支。
$ cd common
$ git branch -a
$ git checkout remotes/origin/Android-3.10

編譯Android上傳系統源碼

  • 導入預設腳本
~/android/jellybean $ source build/envsetup.sh
  • 指定產品名和編譯變量
~/android/jellybean $ lunch

You're building on Linux
Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_grouper-userdebug
     5. mini_armv7a_neon-userdebug
     6. mini_armv7a-userdebug
     7. full_wingray-userdebug
     8. full_crespo-userdebug
     9. full_maguro-userdebug
     10. full_panda-userdebug

Which would you like? [full-eng] 1

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-86-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=JRO03H
OUT_DIR=out
============================================

lunch是envsetup.sh中提供的函數,負責設置環境變量。full表示完全編譯,eng表示工程版。full-eng對應模擬器設備。

  • 編譯源碼
    ** 編譯全部源碼
~/android/jellybean $ make

** 編譯指定模塊源碼

  1. make模塊名
    這種方法適合第一次編譯,會把依賴模塊一并編譯。對于應用層源碼模塊,需要查看Android.mk中的LOCAL_PACKGAGE_NAME變量;對于框架層和系統運行庫模塊,需要查看Android.mk中的LOCAL_MODULE變量。
  2. mmm命令
    該命令是envsetup.sh中注冊的函數,用于在源碼根目錄編譯指定模塊,參數為模塊的相對路徑。只能在第一次編譯后使用。
  3. mm命令
    該命令是envsetup.sh中注冊的函數,用于在模塊目錄下編譯模塊。只能在第一次編譯后使用。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容