Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417014
  • 博文数量: 107
  • 博客积分: 713
  • 博客等级: 上士
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-05 00:14
个人简介

呵呵

文章分类

全部博文(107)

文章存档

2015年(2)

2014年(17)

2013年(29)

2012年(52)

2011年(7)

分类: LINUX

2011-12-03 13:08:00

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+~/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

上面代表编译的一个targetfull是针对emulator编译全部包括app、输入法等,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

:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default] 

: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.10gcc版本过高造成的,可参考这篇文章修改:http://hi.baidu.com/designhouse/blog/item/fec5cdbf8d6a231618d81fc1.html

{

ubuntu 11.10的gcc版本是4.6.1,版本太高,编译android时出错,要把gcc版本改为4.4.3。

通过gcc -v命令可以发现gcc库在/usr/lib/gcc/i686-linux-gnu目录下,该目录下有当前系统支持的各种版本gcc库 。在安装gcc 4.4前该目录下是没有4.4目录的,安装gcc 4.4后该目录下就会多出4.4这个目录,且该4.4目录下有各种相应库文件。

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


 

同理

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:

/usr/bin$ sudo mv g++ g++.bak

/usr/bin$sudo ln -s g++-4.4 g++



再查看gcc和g++版本号:
gcc -v
g++ -v
均显示gcc version 4.4.6 ,说明gcc 4.4安装成功。

 

测试:

编译android,从2011-10-29 23:58开始,到2011-10-30 01:42编译完成,没有错误。这验证了gcc 4.4安装正确,也验证了android文件与高版本的gcc不兼容。

这次android完整编译一次耗时1小时44分钟,配置是i5+2G DDR3 ,  Ubuntu 11.10光盘安装。比以前那部T4400+2G DDR2快了41分钟。



}

至此编译完毕。

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。

阅读(1124) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册