分享

编译Android源代码 - Android系统开发 - DerekGuo

 jackywu_2005 2011-03-08




请按照“获取Android源代码”一节中的内容安装所需的相关包,否则在编译源代码的时候会报很多的错。为了方便起见,现将所有需要安装的包罗列如下,其中有些包是可选的,但最好都装上,同时,在安装之前,最好先更新一下:


$ sudo aptitude update

$ sudo aptitude upgrade


Ubuntu Linux 32x86


$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev make gcc g++ libc6dev patch texinfo ncursesdev python2.6 valgrind lib32readline5-dev


$ sudo aptitude install sunjava6jdk


Ubuntu Linux 64x86


$ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev make gcc g++ libc6-dev patch texinfo ncurses-dev python2.6 valgrind gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev


$ sudo ln -s /usr/lib32/libX11.so.6 /usr/lib32/libX11.so

$ sudo aptitude install sunjava6jdk


基本上安装上面罗列的包,编译时就不会有太大的问题,下面列举本人(64位机子,Ubuntu10.04系统)在编译时出现的一些错误,以及在出现错误时,相关的解决包。虽然google已将这些必需包在 android文档中进行说明了,但在此声明这些问题的解决还是参考网址:http://code.google.com/p/android/issues/detail?id=1005


/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] Error 1


解决包:$ sudo aptitude install libc6-dev-i386


/usr/bin/ld: cannot find -lstdc++

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] Error 1


dpkg-query -l &> packages.txt (该工具可用来查询dpkg数据库)

解决包:$ sudo aptitude install g++-multilib


/usr/bin/ld: cannot find -lncurses

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1

make: *** Waiting for unfinished jobs....


解决包:$ sudo aptitude search lib32ncurses5-dev


/usr/bin/ld: cannot find -lz

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/zipalign_intermediates/zipalign] Error 1

make: *** Waiting for unfinished jobs....


解决包:$ sudo aptitude install lib32z-dev


同时,网友kees.jongenburger提出了使用getlibs(该工具可自动解决32位程序在64位系统上的依赖关系)来解决这个问题。具体用法如下:

$ getlibs -l libz.so

libz.so: zlib1g-dev

	The following i386 packages will be installed:
                                                            	zlib1g-dev
                                                            	Continue [Y/n]? y
                                                            	Downloading ...
                                                            	Installing libraries ...
                                                            	具体getlibs工具的介绍请参考网址: 	http:///showthread.php?t=474790 

注:在“获取Android源代码”一节中已介绍使用java 6时会有不兼容的问题,但经过测试发现,如果仅仅makemake 不包括make sdk),用sunjava6jdk 是没有问题的。而make sdk,就会有问题,严格来说是在make doc 时会出问题,它需要的javadoc 版本为1.5

因此,我们安装完sun‐java6‐jdk 后最好再安装sun‐java5‐jdk,或者只安装sun‐java5‐jdk。这里sun‐java6‐jdk sun‐java5‐jdk 都安装,并只修改javadoc.1.gz javadoc。因为只有这两个是make sdk 用到的。这样的话,除了javadoc 工具是用1.5 版本,其它均用1.6 版本,java的安装目录及结构如下:


derek@derek-desktop:/usr/lib/jvm$ ls -l

total 4

lrwxrwxrwx 1 root root 19 2010-08-20 23:19 java-6-sun -> java-6-sun-1.6.0.20

drwxr-xr-x 8 root root 4096 2010-08-21 00:06 java-6-sun-1.6.0.20

sudo aptitude install sun‐java5‐jdk (现在发现找不到java 5的包,可能是源的问题)


修改javadoc link

$ cd /etc/alternatives

$ sudo rm javadoc.1.gz

$ sudo ln ‐s /usr/lib/jvm/java‐1.5.0‐sun/man/man1/javadoc.1.gz javadoc.1.gz

$ sudo rm javadoc

$ sudo ln ‐s /usr/lib/jvm/java‐1.5.0‐sun/bin/javadoc javadoc


但是,本人在编译2.2系统时测试发现使用java 6并没有上述问题。估计应该是解决了。所以上述对javadoc这快的处理就可以不做了。





设置环境变量


$ vim ~/.bashrc

增加如下的环境变量,包括java以及android程序开发、运行的一些环境变量


JAVA_HOME=/usr/lib/jvm/java-6-sun

export JAVA_HOME

JRE_HOME=${JAVA_HOME}/jre

export JRE_HOME

export ANDROID_JAVA_HOME=${JAVA_HOME}

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH

export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin

HOME_BIN=~/android/bin/

export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN}


$ source ~/.bashrc (使环境变量的设置立即生效,即同步变化)


编译android源码

$ cd ~/android/androidplatform/ cd android源码目录)

$ make (或者使用 make -jn 命令,其中,n值的确定参考原则为2m-1m为处理器核数,本人实验机子为双核,故用 make -j3

这个过程很久,大概花两个小时左右,编译完后将得到~/android/androidplatform/out 目录,可参加附件中的目录树文件。


编译SDK

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

1查看~/android/androidplatform/frameworks/base/include/utils/Asset.h

$ cd ~/android/androidplatform/

$ vim frameworks/base/include/utils/Asset.h


查看 UNCOMPRESS_DATA_MAX 值:

enum {

/* data larger than this does not get uncompressed into a buffer */

#ifdef HAVE_ANDROID_OS

UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024

#else

UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024

#endif

};


由于Eclipse 编译工程需要大于1.3M buffer,如果仅为1 * 1024 * 1024

请改为2 * 1024 * 1024,由于本人实验的版本为2.2已使用enum进行了更正,故不用修改。


输入以下命令进行sdk编译:

$ make sdk

注意如果这里出现问题请按照上面所介绍的将javadoc换回1.5版本。

编译后生成的SDK 存放在~/android/android/platform/out/host/linuxx86/sdk/ , 此目录下有androidsdk_eng.xxx_linuxx86.zip androidsdk_eng.xxx_linuxx86 目录。androidsdk_eng.xxx_linuxx86 就是SDK 目录。参加附件中的目录树文件。

模拟器使用
进入~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools目录下,这里有很多Android的工具,其中模拟器对应的应用 程序是emulator。下面是正确使用模拟器的步奏:

输入以下命令启动Android SDK AVD 管理器,可以通过该图形化界面进行很多操作,比如SDK下载,虚拟设备的创建,启动模拟器等等。


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./android

Starting Android SDK and AVD Manager

No command line parameters provided, launching UI.

See 'android --help' for operations from the command line.


列出机子上的所有target版本,可以理解为android sdk 版本。


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./android list target


Available Android targets:

id: 1 or "android-AOSP"

Name: Android AOSP (Preview)

Type: Platform

API level: AOSP

Revision: 2

Skins: WQVGA400, WQVGA432, WVGA800, WVGA854, HVGA (default), QVGA


创建一个名为 My_AVD_2.2的虚拟设备


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./android create avd -n My_AVD_2.2 -t 1

Android AOSP (Preview) is a basic Android platform.

Do you wish to create a custom hardware profile [no]

Created AVD 'My_AVD_2.2' based on Android AOSP (Preview),

with the following hardware config:

hw.lcd.density=160


使用刚创建的虚拟设备启动模拟器


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./emulator -avd My_AVD_2.2


创建虚拟sdcard,用于模拟器中数据和外部数据的交互, 虚拟SD卡的大小不应该小于100M,否则在后期的文件系统打包过程中,有可能会有SD卡存储空间不够的问题。


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./mksdcard -l smallone 256M ~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/sdcard.img


使用刚刚创建的虚拟sdcard创建一虚拟设备


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./android create avd -n MyAOSP -t 1 -c ~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/sdcard.img


列出本机上的所有虚拟设备


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./android list avd

Available Android Virtual Devices:

Name: MyAOSP

Path: /home/derek/.android/avd/MyAOSP.avd

Target: Android AOSP (Preview) (API level AOSP)

Skin: HVGA

Sdcard: /home/derek/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/sdcard.img

---------

Name: My_AVD_2.2

Path: /home/derek/.android/avd/My_AVD_2.2.avd

Target: Android AOSP (Preview) (API level AOSP)

Skin: HVGA

Sdcard: 256M


使用刚编译完成的SDK中的模拟器启动android系统时,默认采用的系统镜像为~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/platforms/android-AOSP/images目录(刚编译完的SDK目录中的android-sdk_eng.derek_linux-x86/platforms/android-AOSP/images)下的kernel-qemu ramdisk.img system.img userdata.img

其中kernel-qemu为内核镜像,其他组合为文件系统。

当然也可以使用自己编译的内核镜像,关于如果编译内核的问题 会在后续文章中说明。


使用名为MyAOSP 的虚拟设备启动模拟器,并规定系统,数据等的映象文件路径,模拟器内核采用prebuild/android-arm/kernel/kernel-qemu。当然也可以使用自己编译的内核镜像,关于如果编译内核的问题 会在后续文章中说明。


derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$ ./emulator -avd MyAOSP -sysdir ~/android/androidplatform/out/target/product/generic/ -data ~/android/androidplatform/out/target/product/generic/userdata.img -ramdisk ~/android/androidplatform/out/target/product/generic/ramdisk.img -kernel ~/android/androidplatform/prebuilt/android-arm/kernel/kernel-qemu

也可以再加上下面的参数进行启动,

-system ~/android/androidplatform/out/target/product/generic/system.img

-image ~/android/androidplatform/out/target/product/generic/system.img

但后者已过时。


可以输入emulator -help 进行进一步的工作。

注意:细心的人可能会发现刚刚编译生成的SDK目录下的tools目录(~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools)中的所有工具在刚刚源码编译完的host目录下的bin目录(~/android/androidplatform/out/host/linux-x86/bin)中都有。

























 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多