1、Introductionhtml
今天咱們就來談談如何在Ubuntu平臺上面編譯android源碼,個人是ubuntu10.04版本,在進行編譯流程講解以前我想講一下 make 、make snod 、make kernel的做用,m、mm、mmm它們的做用以及區別。java
- make: 編譯源碼,生成相應的系統鏡像文件。
- make snod: 從新生成一個system.img系統鏡像文件
- make kernel: 編譯內核(可選)通常根據envsetup.sh文件內容而論linux
- 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(編譯指定目錄下的全部模塊)。android
2、 編譯Android source以及SDKshell
2.一、徹底編譯ubuntu
使用make編譯並生成鏡像api
~$: cd ~/android/src
~$: makebash
映像編譯成功後會在目錄 ~/android/src/out/target/product/generic
下產生一些image文件app
ramdisk.img system.img userdata.img android -info.txt模塊化
咱們能夠經過啓動模擬器來驗證咱們是否編譯正確 ,注意,咱們最好在system.img所在的目錄下進行以下動做
~$ emulator -kernel ~/android2.2/prebuilt/android-arm/kernel/kernel-qemu -ramdisk ramdisk.img -debug all -data userdata-qemu.img -system system.img -sysdir . -show-kernel -skin 800x480
若是能正確啓動則說明徹底編譯成功啦。
徹底編譯完後咱們就能夠使用make sdk命令作一次SDK的編譯拉,步驟以下:
~$ cd ~/android/src
~$ make sdk
注意:若是須要build SDK,隨着版本的不一樣,咱們所需的環境也不一樣,編譯android2.2以前的版本須要安裝sun-java5-jdk, 而不是sun-java6-jdk,不然會出現以下錯誤:
build/core/product_config.mk:207: WARNING: adding test OTA key
============================================
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=
============================================
Combining NOTICE files: out/target/product/generic/obj/NOTICE.txt
Finding NOTICE files: out/host/linux-x86/obj/NOTICE_FILES/hash-timestamp
Combining NOTICE files: out/host/linux-x86/obj/NOTICE.txt
Package: out/target/product/generic/generic-img-eng.anjoy.zip
SDK buildinfo: out/target/product/generic/sdk/sdk-build.prop
Docs droiddoc: out/target/common/docs/dx
javadoc: 錯誤 - 在 doclet 類 DroidDoc 中,方法 start 已拋出異常 java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: 未找到 sun.util.resources.OpenListResourceBundle 的類文件
因此,若是jdk版本不一樣的話就去官網下載一個或者在線安裝一個吧 ,這裏我就很少說拉
sdk編譯成功後會在~/android /src/out/host/linux-x86/sdk/ 生成sdk的文件目錄和壓縮包:
android-sdk_eng.anjoy_linux-x86
android-sdk_eng.anjoy_linux-x86.zip
並在~/android /src/out/target/product/generic(generic是默認的產品名)下打包全部的映像文件:
generic-img-eng.anjoy.zip
生成的SDK目錄結構爲:
/home/anjoy/android/src/out/host/linux-x86/sdk/android-sdk_eng.anjoy_linux-x86:
總計 32
drwxrwx--- 6 anjoy anjoy 4096 2011-06-27 17:48 .
drwxr-x--- 3 anjoy anjoy 4096 2011-06-27 17:48 ..
drwxrwx--- 2 anjoy anjoy 4096 2011-06-27 17:48 add-ons
drwxrwx--- 14 anjoy anjoy 4096 2011-06-27 17:48 docs
-rw-rw---- 1 anjoy anjoy 172 2011-06-27 17:50 documentation.html
drwxrwx--- 3 anjoy anjoy 4096 2011-06-27 17:48 platforms
-rw-rw---- 1 anjoy anjoy 225 2011-06-27 17:50 RELEASE_NOTES.txt
drwxrwx--- 3 anjoy anjoy 4096 2011-06-27 17:50 tools
想很方便的使用生成的SDK只須要在.bashrc中增長:
export PATH=$PATH:/home/anjoy/android/src/out/host/linux-x86/sdk/android-sdk_eng.anjoy_linux-x86/tools
2.二、模塊化編譯
注意:在模塊化編譯以前咱們必定要把envsetup.sh 腳本source 一下,或者你直接把envsetup.sh文件所在的路徑配置到你我的的bashrc文件裏面,這樣你就不要每次都做source動做拉。
envsetup.sh 提供了一些的bash函數定義,當運行了envsetup.sh後就能夠使用help 命令來查看:
~$ help
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- 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.
...
..
其中對模塊的編譯有幫助的是tapas、m、mm、mmm這幾個命令。
其中mmm 後面要跟模塊的根目錄,不是全部的目錄下都有子模塊,那些含有Android.mk 文件目錄纔是模塊的根目錄,模塊名能夠從Android.mk的LOCAL_MODULE 或者LOCAL_PACKAGE_NAME 變量中獲得。
單獨編譯某模塊,須要在mmm後面指定模塊路徑,例如編譯application中的Launcher2:
mmm packages/apps/Launcher2/
或者在src目錄下直接運行make module name:
cd ~/android/src
make Launcher2
2.三、增量編譯的步驟
a、假如咱們修改了某個模塊下的代碼,那麼咱們只須要重新編譯這個模塊就能夠拉,而不須要整個工程的編譯。
b、編譯所修改的代碼所在模塊,例如:
cd ~/android/src
mmm packages/apps/Launcher2
c、在~/android/src中運行:
cd ~/android/src
make snod
d、該命令生成一個新的系統映像system.img,將這個系統映像拷貝至sdk下:
cd ~/android/src
cp out/target/product/generic/system.img /
out/host/linux-x86/sdk/android-sdk_eng.anjoy_linux-x86/tools/lib/images/
OK,這樣就完成了Android源碼的編譯以及SDK的生成拉
提醒:若是你是Ubuntu10.04系統 32位機上安裝編譯Android2.3源碼,其步驟和注意事項以下:
1.安裝JDK6
對於Android2.3 系統,不要安裝JDK5 ,應該安裝最新的JDK6 。
若是安裝了JDK6,Android會自動按64位編譯,若是系統是32位的,會有編譯錯誤,後面會說如何修改這個錯誤。
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jdk
sudo update-java-alternatives -s java-6-sun
安裝完後,須要手動設置JAVA_HOME, JRE_HOME , CLASS_PATH爲JDK6的安裝路徑。
2.進行編譯android2.3
~$ cd ~/android2.3
~$ source build/envsetup.sh
~$ make
在make的時候會提示出錯:
************************************************************
You are attempting to build on a 32-bit system.
Only 64-bit build environments are supported beyond froyo/2.2.
************************************************************
由於Android2.3默認是64位的系統上編譯,須要手動修改build/core/main.mk,把這個判斷部分註釋掉:
#ifneq (64,$(findstring 64,$(build_arch)))
#$(warning ************************************************************)
#$(warning You are attempting to build on a 32-bit system.)
#$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
#$(warning ************************************************************)
#$(error stop)
#endif
從新make,若是是安裝了JDK6版本,會又報錯:
Docs droiddoc: out/target/common/docs/api-stubs
Could not load ‘clearsilver-jni’
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/api-stubs-timestamp] Error 45
make: *** Waiting for unfinished jobs….
Could not load ‘clearsilver-jni’
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45
咱們只須要修改這幾個文件,該回到32位編譯環境便可:
# external/clearsilver/cgi/Android.mk
# external/clearsilver/java-jni/Android.mk
# external/clearsilver/util/Android.mk
# external/clearsilver/cs/Android.mk
把上面這些文件內容的編譯選項-m64 改爲-m32 便可
從新make,大概不到一個小時就make完了。
OK,大工告成