Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發環境 >> Ubuntu12.04下Android4.0.4源碼的下載及其編譯過程

Ubuntu12.04下Android4.0.4源碼的下載及其編譯過程

編輯:Android開發環境

       一、下載源碼

       1、下載工具repo:https://android.googlesource.com/tools/repo/

       在本地目錄建個bin的文件夾,進入bin文件夾;通過git下載:

Java代碼
  1. git clone https://android.googlesource.com/tools/repo  

       下載完成後,進入repo文件夾,切換到穩定分支:

Java代碼
  1. git checkout -b stable origin/stable  

       將repo命令所在的目錄,即/home/yourname/bin/repo添加到環境變量中:

Java代碼
  1. export PATH=$PATH:~/bin/repo  

       在本地目錄下新建目錄:android4.0.4,並進入該文件夾:

Java代碼
  1. cd ~;mkdir android4.0.4;cd android4.0.4;  

       在文件夾下執行下面命令來下載Android源碼:

Java代碼
  1. repo init -u https://android.googlesource.com/platform/manifest  

       你也可以直接切換到你想要下的版本的分支,而不是“master”分支:

Java代碼
  1. repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.4_r2  

       關於到底是哪個分支,根據自己的情況而定,詳情可參照:https://android.googlesource.com/platform/manifest/

       如你想下載最新的Android4.1代碼,即可將分支名稱更換成:android-4.1.1_r4

       你也可以參照官網的下載方式來下載:http://source.android.com/source/downloading.html

       實驗證明,我總是在下載那個repo工具的時候,無法連接到相應的地址。

       下載是個漫長的過程,下載完成後的大小大概有14G,所以要提前准備好這麼大的空間。下載完成後的目錄大概有這些:如圖 

Ubuntu12.04下Android4.0.4源碼的下載及其編譯過程

       二、編譯源碼

       如果你的電腦的環境經常做開發,那麼很多環境應該已經搭建好了,如果沒有,可以參照官網:http://source.android.com/source/initializing.html

       這裡要提醒的是:用apt-get或者ubuntu軟件中直接安裝的jdk,jre的時候,編譯Android是總是編譯不過,出現JDK版本不一致的情況;

       解決辦法如下:

       到oracle官網中下載jdk:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

       建議下載這個:jdk-6u35-linux-i586.bin

       下載完成後,運行得到一個jdk1.6.0_35文件夾,然後,將相應的JAVA環境加到系統環境中,簡單的可以這樣:

Java代碼
  1. vi ~/.bashrc  

      在.bashrc文件最後添加:

Java代碼
  1. JAVA_HOME=/home/clw712/tools/jdk1.6.0_35   
  2. CLASSPATH=$JAVA_HOME/lib/   
  3. ANDROID_PRODUCT_OUT=/home/clw712/bin/android/out/target/product/generic   
  4. ANDROID=/home/clw712/bin/android   
  5. ANDROID_SWT=/home/clw712/bin/android/out/host/linux-x86/framework   
  6. PATH=$ANDROID/out/host/linux-x86/bin:$ANDROID/prebuilt/android-arm/kernel/:$JAVA_HOME/bin:$ANDROID_PRODUCT_OUT:$PATH   
  7.   
  8. export PATH JAVA_HOME CLASSPATH ANDROID_PRODUCT_OUT ANDROID_SWT  

當然上述路徑還有後面編譯好了,用到的路徑,是用來運行emulator的。

然後就可以參照官網上的步驟編譯:http://source.android.com/source/building.html

如果你的ubuntu是最新的或者比較新的版本,那麼在編譯過程中,會出現:

Java代碼
  1. <command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]   
  2. <built-in>:0:0: note: this is the location of the previous definition   
  3. cc1plus: all warnings being treated as errors  

這樣的錯誤,這個錯誤引起的原因在於gcc的版本太高了,gcc -v 可以看見是4.6.1的;

解決方法為:安裝gcc4.4的

Java代碼
  1. sudo apt-get install gcc-4.4  
  2. sudo apt-get install g++-4.4  

安裝完成後需要將原gcc替換成gcc4.4的:

進入/usr/bin,用ls -l gcc* 可以看到:

Java代碼
  1. lrwxrwxrwx 1 root root      7 2011-10-29 09:11 gcc -> gcc-4.6  
  2. -rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4  
  3. -rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6  

通過一下命令實現替換:

Java代碼
  1. sudo mv gcc gcc.bak   
  2. sudo ln -s gcc-4.4 gcc  

對於g++同理:

Java代碼
  1. lrwxrwxrwx 1 root root      7 2011-08-14 15:17 g++ -> g++-4.6  
  2. -rwxr-xr-x 1 root root 228640 2011-10-06 05:45 g++-4.4  
  3. -rwxr-xr-x 1 root root 306200 2011-09-17 05:39 g++-4.6  
  4.   
  5. /usr/bin$ sudo mv g++ g++.bak   
  6. /usr/bin$ sudo ln -s g++-4.4 g++  

現在可以通過gcc -v查看版本信息了,為gcc-4.4就正確了,可以編譯了

       三、補充編譯及運行模擬器

編譯完成後,可以在源碼目錄的out/target/product/generic/目錄下看到編譯好的ramdisk.img、system.img和userdata.img了。

正常情況下,可以配置好路徑環境變量後通過:

Java代碼
  1. cd out/target/product/generic   
  2. emulator -system system.img -data userdata.img -ramdisk ramdisk.img  

我的Android4.0.4版本啟動的畫面如圖:

Ubuntu12.04下Android4.0.4源碼的下載及其編譯過程

這個命令來啟動模擬器;


但是,我在開始時就遇到了一個錯誤:could find/prebuilt/android-arm/kernel/kernel-qemu該文件,我在網上查了很多資料都沒說到這個錯誤,回來在一篇博文中得到啟示,重新再編譯了一下SDK,重啟一下就好了。

創建模擬器,還可以這樣:

Java代碼
  1. $ ./android create avd -t 2 -n g1  

其中 -t 指定TargetID (Android  SDK的ID為2,Android 1.0 SDK的ID為1),-n指定創建的Android虛擬設備名字。

運行模擬器:

$ ./emulator -avd g1                     或者

$ ./emulator -avd g1 -scale 0.8

其中 -avd指定Android設備名,-scale指定縮放比例。

按 Ctrl + F12 可以使模擬器屏幕旋轉90度,即橫屏、豎屏切換

刪除模擬器:

Java代碼
  1. $ ./android delete avd -n g1  

編譯linux內核:

直接編譯Android源碼時,並沒有編譯 linux kernel。如果只運行模擬器,不用編譯 linux kernel。

從emulator獲取內核編譯參數的配置文件:

啟動模擬器

 $ adb pull /proc/config.gz .

解壓縮config.gz  $ gzip -d config.gz

將config文件替換kernel文件夾下的.config文件。

根據需要,修訂config與Makefile配置文件

a)准備交叉編譯工具鏈

  android代碼樹中有一個prebuild項目,包含了我們編譯內核所需的交叉編譯工具。

b)設定環境變量

  $ vi ~/.bashrc

   增加如下兩行:

  export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/ARM-eabi-4.4.0/bin

  export ARCH=arm

  保存後,同步變化:

  $ source ~/.bashrc

c)獲得合適的內核源代碼

  $ cd ~/android

  獲得內核源代碼倉庫

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

  $ cd kernel

  $ git branch

  顯示

  * android-2.6.27

  說明你現在在android-2.6.27這個分支上,也是kernel/common.git的默認主分支。

  顯示所有head分支:

  $ git branch -a

  顯示

  * android-2.6.27

  remotes/origin/HEAD -> origin/android-2.6.27

  remotes/origin/android-2.6.25

  remotes/origin/android-2.6.27

  remotes/origin/android-2.6.29

  remotes/origin/android-goldfish-2.6.27

  remotes/origin/android-goldfish-2.6.29

  我們選取最新的android-goldfish-2.6.29,其中goldfish是android的模擬器模擬的CPU。

  $ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29

  $ git branch

  顯示

  android-2.6.27

  * android-goldfish-2.6.29

  我們已經工作在android-goldfish-2.6.29分支上了。

d)設定交叉編譯參數

  打開kernel目錄下的Makefile文件,把CROSS_COMPILE指向剛才下載的prebuild中的arm-eabi編譯器

  CROSS_COMPILE ?= arm-eabi-

  把LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,$(call ld-option, -Wl$(comma)?build-id,))

  這一行注釋掉,並且添加一個空的LDFLAGS_BUILD_ID定義,如下:

  LDFLAGS_BUILD_ID =

e)編譯內核映像

  $ cd ~/android/kernel

  $ make goldfish_defconfig

  $ make

f)測試生成的內核映像

  $ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage

編譯模塊

Android中的一個應用程序可以單獨編譯,編譯後需要重新生成system.img。

在Android目錄下運行

$ . build/envsetup.sh  或者

$ source build/envsetup.sh ,然後就會多出幾個可用的命令:

- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.
- printconfig: 當前build的配置情況.

可以使用 --help查看用法。

如:在修改了某一個模塊以後,可以使用 $ mmm <目錄>  來重新編譯所有在<目錄>中的所有模塊,使用 $ mm  編譯當前目錄中的所有模塊。

編完之後,即修改了Android系統以後,可以使用 $ make snod 重新生成system.img。

編譯SDK:

直接執行make是不包括make sdk的。make sdk用來生成SDK,這樣,我們就可以用與源碼同步的SDK來開發android了。

a)修改/frameworks/base/include/utils/Asset.h

  ‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改為 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’

  原因是eclipse編譯工程需要大於1.3M的buffer;

b)編譯ADT。

c)執行make sdk。

$ make sdk

  編譯很慢。編譯後生成的SDK存放在out/host/linux-x86/sdk/,此目錄下有android-sdk_eng.xxx_linux- x86.zip和android-sdk_eng.xxx_linux-x86目錄。android-sdk_eng.xxx_linux-x86就是 SDK目錄

  實際上,當用mmm命令編譯模塊時,一樣會把SDK的輸出文件清除,因此,最好把android-sdk_eng.xxx_linux-x86移出來

  此後的應用開發,就在該SDK上進行,所以~/.bashrc的修改注釋掉,增加如下一行:

  export PATH=${PATH}:~/android/out/host/linux-x86/sdk/android-sdk_eng.xxx_linux-x86/tools

  注意要把xxx換成真實的路徑;

d)關於環境變量、android工具的選擇

  目前的android工具有:

  A、我們從網上下載的SDK,如果你下載過的話( tools下有許多android工具,lib/images下有img映像)

  B、我們用make sdk編譯出來的SDK( tools下也有許多android工具,lib/images下有img映像)

  C、我們用make編譯出來的out目錄( tools下也有許多android工具,lib/images下有img映像)

  那麼我們應該用那些工具和img呢?

  首先,我們一般不會用A選項的工具和img,因為一般來說它比較舊,也源碼不同步。其次,也不會用C選項的工具和img,因為這些工具和img沒有經過SDK的歸類處理,會有工具和配置找不到的情況;事實上,make sdk產生的很多工具和img,在make編譯出來out目錄的時候,已經編譯產生了,make sdk只是做了copy而已。

e)創建Android Virtual Device

  編譯出來的SDK是沒有AVD(Android Virtual Device)的,我們可以通過android工具查看:

  $ android list

  創建AVD:

  $ android create avd -t 1 -n myavd

  可以android -help來查看上面命令選項的用法。創建中有一些選項,默認就行了

  再執行android list,可以看到AVD存放的位置

  以後每次運行emulator都要加-avd myavd或@myavd選項:

  $ emulator -avd myavd

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved