Android SDK 源代码编译教程

来源:互联网 发布:边防武警转业知乎 编辑:程序博客网 时间:2024/06/06 07:01

一、流程[edit]

1.环境配置(ps:我的系统是win7下用wubi装的ubuntu,双系统,安装的分区大小约300G,但是/home只分了不到5G,sdk总共要10多G(2013.11.21),所以将sdk下载到了/host目录下,而非/home下)


Ubuntu 12.04 64-bit

 sudo apt-get install git-core sudo apt-get install curl sudo apt-get install zlib1g-dev sudo apt-get install bison sudo apt-get install flex sudo apt-get install libncurses-dev (libncurses5-dev) sudo apt-get install g++ sudo apt-get install libx11-dev sudo apt-get install gperf

安装java

参考:http://forum.ubuntu.org.cn/viewtopic.php?t=183803

(编译要求使用1.6,可以使用sudo update-alternatives --config java 和 sudo update-alternatives --config javac 这两个命令来调整当前要使用的java版本。)

关于Java版本:Java6能够编译代码,但不能生成文档,最好准备两套Java环境(未验证)

 sudo apt-get install libc6-dev-i386 sudo apt-get install lib32ncurses5-dev sudo apt-get install libx11-dev sudo apt-get install g++-multilib sudo apt-get install lib32z1-dev


2. 下载Android SDK


 curl http://android.git.kernel.org/repo > ~/bin/repo   (路径根据自己的情况设定)
 chmod a+x ~/bin/repo

如果是想把Android当前主线上最新版本的所有的sourcecode拿下来,我们需要repo的帮助。

先建立一个目录,比如~/android,进去以后用repo init命令即可。

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


获取代码:

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


(tips:1.使用参数“ -b 版本号 ”来获取相应分支;2.上面的网站挂掉了的话,可以试试这个:repo init -u git://codeaurora.org/platform/manifest.git -b)


 repo sync

(tips:  1.repo sync失败:

a.删除旧的.repo/  (未验证)

b.参照 http://source.android.com/source/downloading.html  中详细步骤即可解决问题。(未验证)

c. 在.repo目录下的找到fetch属性,改成 fetch="git://Android.git.linaro.org/" 

参考:http://bbs.csdn.net/topics/380254094

2.repo的用法:

参考:http://blog.csdn.net/free2o/article/details/3981588 )


3. 编译

3.0 环境配置

根据自己机器的实际情况安装编译所需软件:

在终端中执行:

 sudo apt-get install git-core gnupg flex bison gperf build-essential \ sudo apt-get install zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ sudo apt-get install x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ sudo apt-get install libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ sudo apt-get install libxml2-utils xsltproc

基本只要安装以上软件即可,官方网站上说的其它一些软件或者设置可以不用理会。


可能遇到的问题:

换用gcc与g++的较低版本

Ubuntu11.10自带的gcc与g++版本为4.6,用该版本编译android时会遇到一些错误,如:

   host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner)   host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp   <命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror]   <built-in>:0:0: 附注: 这是先前定义的位置   cc1plus:所有的警告都被当作是错误

解决方法:

ubuntu 32bit系统下安装gcc 4.4的最好方法是仅用以下两条命令,不需要其它命令,否则编译时可能会出错。

 $sudo apt-get install gcc-4.4 $sudo apt-get install g++-4.4

装完后进入到/usr/bin目录下

 $ls -l gcc*

会显示以下结果

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

发现gcc链接到gcc-4.6, 需要将它改为链接到gcc-4.4,方法如下:

 $sudo mv gcc gcc.bak $sudo ln -s gcc-4.4 gcc

同理,对g++也做同样的修改:

 $ls -l g++*

显示结果:

  lrwxrwxrwx 1 root root 7 2011-08-14 15:17 g++ -> g++-4.6  -rwxr-xr-x 1 root root 228640 2011-10-06 05:45 g++-4.4  -rwxr-xr-x 1 root root 306200 2011-09-17 05:39 g++-4.6

需要将g++链接改为g++-4.4:

 $sudo mv g++ g++.bak $sudo ln -s g++-4.4 g++

再查看gcc和g++版本号:

 gcc -v g++ -v

均显示gcc version 4.4.6 ,说明gcc 4.4安装成功。

参考: http://www.cnblogs.com/taskiller/archive/2012/04/02/2429892.html


3.1编译初始化:

在终端中执行:

source build/envsetup.sh 

或:

.build/envsetup.sh

3.2选择编译目标:

在终端中执行下面的命令:

lunch

之后选择你要编译的设备,选择后,会初始化编译的项目的相关文件。


All build targets take the form BUILD-BUILDTYPE, where the BUILD is a codename referring to the particular feature combination. Here's a partial list:

Build name Device Notes

aosp_arm ARM emulator AOSP, fully configured with all languages, apps, input methods

aosp_maguro maguro AOSP, running on Galaxy Nexus GSM/HSPA+ ("maguro")

aosp_panda panda AOSP, running on PandaBoard ("panda")


and the BUILDTYPE is one of the following:

Buildtype Use

user limited access; suited for production

userdebug like "user" but with root access and debuggability; preferred for debugging

eng development configuration with additional debugging tools

(参考:http://source.android.com/source/building-running.html http://blog.csdn.net/mr_raptor/article/details/7954474)


3.3编译代码:

在终端中执行:

 make -j4

-j4:表示用四个线程来编译

编译根据不同机器的配置不同所需时间也有很大差异。

出现以下信息表示编译完成:

target Java: ContactsTests (out/target/common/obj/APPS/ContactsTests_intermediates/classes)target Dex: ContactsDone!Install: out/target/product/generic/system/app/Browser.odexInstall: out/target/product/generic/system/app/Browser.apkNote: Some input files use or override a deprecated API.Note: Recompile with -Xlint:deprecation for details.Copying: out/target/common/obj/APPS/Contacts_intermediates/noproguard.classes.dextarget Package: Contacts (out/target/product/generic/obj/APPS/Contacts_intermediates/package.apk)'out/target/common/obj/APPS/Contacts_intermediates/classes.dex' as 'classes.dex'...Processing target/product/generic/obj/APPS/Contacts_intermediates/package.apkDone!Install: out/target/product/generic/system/app/Contacts.odexInstall: out/target/product/generic/system/app/Contacts.apkbuild/tools/generate-notice-files.py  out/target/product/generic/obj/NOTICE.txt  out/target/product/generic/obj/NOTICE.html "Notices for files contained in the filesystem images in this directory:" out/target/product/generic/obj/NOTICE_FILES/srcCombining NOTICE files into HTMLCombining NOTICE files into textInstalled file list: out/target/product/generic/installed-files.txtTarget system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.imgRunning:  mkyaffs2image -f out/target/product/generic/system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.imgInstall system fs image: out/target/product/generic/system.imgDroidDoc took 5331 sec. to write docs to out/target/common/docs/doc-comment-check

编译好android之后

emulator 在 ~/android/out/host/linux-x86/bin 

ramdisk.img,system.img和userdata.img 在 ~/android/out/target/product /generic

 $ cd ~/android/out/host/linux-x86/bin

增加环境变量

 $ emacs ~/.bashrc

在.bashrc中新增环境变量,如下

  1. java 程序开发/运行的一些环境变量
 export ANDROID_PRODUCT_OUT=~/android/out/target/product/generic ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};

最后,同步这些变化:

 $ source ~/.bashrc $ cd ~/android/out/target/product/generic $ emulator -system system.img -data userdata.img -ramdisk ramdisk.img

最后进入android桌面,就说明成功了。


3.4编译SDK


每次执行make命令,都会先清空out目录,所以先备份一下之前make处来的out目录下的文件,再make sdk


我是在android目录下执行以下语句:

 source build/envsetup.sh lunch sdk-eng make sdk -j4

(编译大约4个小时左右,取决于电脑内存,生成的out目录大小是20G左右(repo同步分支的时候,我选择的是 /host/Android/bin/repo init -ugit://codeaurora.org/platform/manifest.git -b android-4.3_r2.1),这个数据仅供参考。)

出现以下信息表示编译完成:

Sdk编译完毕.png


直接执行make是不包括make sdk的。make sdk用来生成SDK,这样,我们就可以用与源码同步的SDK来开发android了。

(编译android sdk时需用make PRODUCT-sdk-sdk, 不能直接make sdk。未验证)

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。

由于本人不使用eclipse,所以没有进行这步;

c)执行make sdk。

 $ make sdk

编译很慢。编译后生成的SDK存放在out/host/linux-x86/sdk/,此目录下有android-sdk_eng.xxx_linux- x86.zip和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)安装、配置ADT

f)创建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

运行结果如下图:


Myavd2.png


Myavd.png


3.5编译模块(未验证)


android中的一个应用程序可以单独编译,编译后要重新生成system.img

在源码目录下执行

$ . 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.

可以加—help查看用法

我们可以使用mmm来编译指定目录的模块,如编译联系人:

$ mmm packages/apps/Contacts/

编完之后生成两个文件:

out/target/product/generic/data/app/ContactsTests.apk out/target/product/generic/system/app/


3.6编译linux内核映像(未验证)

a)准备交叉编译工具链

android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。

b)设定环境变量

$ emacs ~/.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指向刚才下载的prebuilt中的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


(参考: http://www.cnblogs.com/wanqieddy/archive/2011/07/15/2107375.html  http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html

Android编译过程分析:对Android的编译过程感兴趣的,可以继续阅读下面三篇博文:

Android编译系统详解(一):http:/blog.csdn.net/mr_raptor/article/details/7539978

Android编译系统详解(二):http://blog.csdn.net/mr_raptor/article/details/7540066

Android编译系统详解(三):http:/blog.csdn.net/mr_raptor/article/details/7540730 )

二、编译过程出现的问题及解决方法:[edit]

1.Android:android.git.kernel.org 无法访问时下载源代码的解决方法:

    curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo" >~/bin/repo         chmod a+x ~/bin/repo         PATH=~/bin:$PATH         cd your_download_folder         repo  init  -u  git://codeaurora.org/platform/manifest.git -b gingerbread         repo sync  


(参考:http://jack22.iteye.com/blog/1205817)


2.ubuntu下安装repo下载源码,找不到repo命令的原因。


原因:repo路径没有加入环境变量,直接使用是无法识别的。

解决方法:a.添加repo路径到环境变量 b.使用绝对路径下的repo

(参考:http://bbs.csdn.net/topics/360089568)


3.make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libstagefright_intermediates/OMXCodec.o]

I managed to solve those problems above using changing 3 files:

./vendor/qcom/opensource/omx/mm-core/omxcore/inc/OMX_QCOMExtns.h

./out/target/product/generic/obj/include/mm-core/omxcore/OMX_QCOMExtns.h

./hardware/qcom/media/mm-core/omxcore/inc/OMX_QCOMExtns.h

In those files, I put this line to the typedef struct QOMX_VIDEO_PARAM_DIVXTYPE:  OMX_PTR pDrmHandle;

(参考:http://hi.baidu.com/chen365458335/item/d1daa099e76b928258146191)

4.make sdk 的时候报错:Module 'bluetooth-health' in PRODUCT_PACKAGES has nothing to install

解决方法:

$ cd ~/my-android-git$ . build/envsetup.sh$ lunch sdk-eng$ make sdk


(参考:http://d.hatena.ne.jp/none53/20120829/1346223563)


5.make sdk的时候报错:make [out/target/common/docs/hidden-timestamp],并且系统提示javadoc出错崩溃。

解决方法:

重新设置了系统中所有的java环境变量。包括:~/.bashrc  ~/.profile  /etc/profile   /etc/environment   /etc/bash.bashrc  这5个文件,添加内容如下:


 JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin JRE_HOME=/usr/lib/jvm/jdk1.6.0_45/jre PATH=$PATH:$HOME/bin:$JRE_HOME/bin export JAVA_HOME export JRE_HOME export PATH
0 0
原创粉丝点击