32位Ubuntu 11.10下android2.3.7源碼下載與編譯小結

來源:互聯網
上載者:User

之前在另一個部落格上寫的,搬到這兒來。

1、我是在vmware下安裝ubuntu 11.10的,這個網上資料很多,不多說了。我給ubuntu分了25g硬碟和1g記憶體。

2、請參照http://source.android.com/source。

初始化編譯環境

檢查一下包是否安裝:

Python 2.4-2.7

Git 1.5.4 或更高版本

沒有話可以sudo apt-get install..安裝一下

JDK 6 因為是編譯android2.3以上,如果編譯2.2以下需要JDK5

安裝JDK6:

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

如果下載速度不行,可以先把ubuntu的更新源改成網易的源,可參考:http://bolg.malu.me/html/2010/279.html。

其他需要安裝的包:

我安裝了如下包:官網上那是64位需要安裝的包,我是32位的有些不一樣。

$ sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev x11proto-core-dev libx11-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils

3、下面開始下載源碼

首先安裝repo(是一個便於git管理的工具)

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

初始化repo client

$ mkdir android2.3.7
$ cd android2.3.7

初始化repo,我是使用的下面的地址,使用官網地址時出現了網路錯誤

$ repo init -u http://android.googlesource.com/platform/manifest.git -b android-2.3.7_r1

按照提示輸入使用者名稱和郵箱。

接著

$ repo sync

開始同步源碼,根據你的網速,我的持續了50分鐘左右。

還有一步驗證git tags可參照官網。下完後就可以在剛才建立的android2.3.7檔案夾下看見已下載的源碼。

4、開始編譯

初始化:

$ source build/envsetup.sh
$ lunch full-eng

上面代表編譯的一個target,full是針對emulator編譯全部包括app、IME等,eng是指標對開發人員編譯,有最高許可權。具體可參見官網。

接著就可以編譯了,在源碼目錄下直接make就行,需要一段時間。

編譯過程中有幾個問題需要指出一下:

問題1:

由於我們是32位系統,所以有些檔案需要修改一下:將

./external/clearsilver/cgi/Android.mk

./external/clearsilver/java-jni/Android.mk

./external/clearsilver/util/Android.mk

./external/clearsilver/cs/Android.mk

四個檔案中的

LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64

注釋掉,或者將“64”換成“32”

LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32

然後,將./build/core/main.mk 中的

ifneq (64,$(findstring 64,$(build_arch)))

改為:

ifneq (i686,$(findstring i686,$(build_arch)))

問題2:

frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void 
android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive] make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] error 1

如下解決:

$ gedit frameworks/base/libs/utils/Android.mk

將下面一行

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

改成

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive

問題3:

<command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]

<built-in>:0:0: note: this is the location of the previous definition cc1plus: all warnings being treated as errors

make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

這是由於11.10的gcc版本過高造成的,可參考這篇文章修改:http://hi.baidu.com/designhouse/blog/item/fec5cdbf8d6a231618d81fc1.html。

至此編譯完畢。

make編譯的並不是所有內容,不包含核心和SDK。

映像產生在out/target/product/generic下:android源碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中, ramdisk.img是一個分區映像檔案,在kernel啟動時,ramdisk被用來調用init,以及把真正的root file system mount起來。system.img包括了主要系統,系統app等,會被掛載到/下,可對應查看./system該目錄,可以發現在其下app/下有一些系統內建的應用程式。userdata.img包括了一些使用者資料,被掛載到/data下,對應可查看./data/目錄,emulator載入這3個映像檔案。

5、編譯SDK

編譯SDK可以得到與源碼同步的SDK,還會產生一些tools,在源碼根目錄下:

$ sudo make PRODUCT-sdk-sdk

編譯產生的SDK在out/host/linux-x86/SDK下。之後如果在ubuntu下使用eclipse進行開發,可以使用你編譯的SDK。

下面就在模擬器中運行鏡像,建議切到root使用者下,首先配置幾個環境變數,將自己編譯的SDK設為優先順序最高,在源碼根目錄下執行:

$ update-alternatives --install /usr/bin/AndroidSDK AndroidSDK ./out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86 255

這樣會在/etc/alternatives下產生一個指向該SDK目錄的軟串連AndroidSDK,這個目錄主要存放一些系統預設開啟的程式的資訊和配置。那麼/usr/bin/AndroidSDK就指向這個軟串連。接著執行:

gedit ~/.bashrc

在檔案末尾添加:

export ANDROID_SDK_HOME=/usr/bin/AndroidSDK
export PATH=$ANDROID_SDK_HOME/tools:$PATH
export ANDROID_PRODUCT_OUT=~/android2.3.7/out/target/product/generic

接著就可以執行:

$ emulator

啟動並執行就是你編譯的映像。執行emulator 命令時,如果不帶任何參數,則Linux Kernel鏡像預設使用~/Android/prebuilt/android-arm/kernel目錄下的kernel-qemu檔案,而

Android鏡像檔案則預設使用ANDROID_PRODUCT_OUT目錄下的system.img、userdata.img和ramdisk.img。模擬器運行需要這四個檔案,如果你編譯了核心則可以使用自己的Kernel鏡像,可用於android移植等。

6、單獨編譯模組

如果你不想編譯整個系統,就想編譯某一個應用程式,可以使用mmm命令,使用之前,在源碼目錄下先要執行:

$ build/envsetup.sh

這樣會產生一些命令,有m即make、mm編譯目前的目錄下所有模組、mmm編譯指定目錄下所有模組。你可以把packages/apps/Music應用的application name改成MyMusic(AndroidManifest.xml中),然後執行:

$ mmm packages/apps/Music

在out/target/product/generic/system/app中就可以看見Music.apk,然後執行:

$ make snod

重建system.img。

7、問題:ubuntu下搭建eclipse編譯android源碼環境,將會另寫一篇文章。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.