Android源码编译总结

来源:互联网 发布:网页音乐提取软件 编辑:程序博客网 时间:2024/05/22 01:17

近期,希望了解一下Android平台,就下载了其源码并尝试对其进行了编译,现将过程总结如下。


一、环境配置

  1. 操作系统:现阶段,官方对Android的源码开发和编译的支持主要针对LinuxMacOS平台,尚未包括Windows平台。不包括Linux内核的Android系统源码大约2.6G,为Android改写的Linux内核大约1G,加上各种工具和编译后的映像,大概需要12G左右的空间。硬盘空间的需求和编译过程对CPU和内存的需求表明,用虚拟机显然不是一个好的选择。本文中所用的是Ubuntu11.10系统。

  2. JDK.一开始以为配个JDK挺容易的,后来编译的过程发现如果JDK配不好,各种奇怪的错误都出来了。首先,“JDK6 if you wish to build Gingerbread or newer; JDK 5 for Froyo orolder.这是官网上的原话,JDK6 for Gingerbread or newer, NOT newer JDK for Gingerbread ornewer.这就是说,编译姜饼或更新版本Andorid,就用JDK6。但更新版本的JDK却不能编译更新版本的Android。所以当尝试使用JDK7去编译的时候会提示JDK版本错误。另外,在Ubuntu中安装JDK的话,最好还是用apt-get,不建议下tar.gz的压缩包直接解压,至于原因,在后面的编译错误分析中再详细说明。

  3. Git.Thestupid content tracker,傻瓜内容跟踪器。Git是用于Linux内核开发的版本控制工具。

  4. Python.

官方声明的必须的编译环境就包括这些,但在其他参考资料中往往会提到其他一些工具,例如:

Valgrind一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。

Flex(fast lexical analyser generator)一款词法分析器生成器,是Lex的另一个替代品。它经常和自由软件Bison语法分析器生成器一起使用。

GNU bison属于GNU项目的一个语法分析器生成器。Bison把一个关于“向前查看从左到右 最右”(LALR)上下文无关文法的描述转化成可以分析该文法的CC++程序。它也可以为二义文法生成“通用的 从左到右 最右” (GLR)语法分析器。Bison基本上与Yacc兼容,并且在Yacc之上进行了改进。

gperf一种“完美的” 散列函数,可以为用户提供的一组特定字符串生成散列表、散列函数和查找函数的C/C++代码。

Curl利用URL语法在命令行方式下工作的文件传输工具。


二、源码下载

需要下载的源码分为两部分:Android源码和Android内核(AndroidLinux Kernel)。这是因为通过Welcometo Android | Android OpenSource下载的Android源码中,只包含编译好的内核映像,如果要查看和修改内核的话,需要另外下载。

1、下载Android源码

建立存放Android源码的目录,如~/Android,并在Android目录下建立binsource两个子目录。下载Android需要用到官方提供的Repo,在刚建立的bin目录下,执行:

curlhttps://dl-ssl.google.com/dl/googlesource/git-repo/repo > repo

(也可以不在bin目录下执行,但上面命令的最后要规定repo文件的路径。)

如果在使用curl工具的过程中,出现问题,也可以用浏览器直接打开dl-ssl.google.com/dl/googlesource/git-repo/repo这时浏览器会自动启动下载完成后再把下载repo文件拷贝到~/Android/bin目录下即可。

刚下载完的repo没有执行权限,使用命令修改其属性:

chmoda+x repo

初始化Repo

repoinit -uhttps://android.googlesource.com/platform/manifest

初始化完成后提示输入用户名和邮箱,但并非强制,可跳过。

最后,只需要一条命令就可以用Repo完成Android源码的下载:

reposync

命令虽然简单,但由于源码量庞大,下载时间会很长。在实验室这个网速极端不理想的情况下,需要连续下载约30个小时。


2、下载Android内核

由于Kernel.org九月份被黑客攻击,Android内核的源代码目前托管到了github

Android目录下建立kernel子目录,并在其目录下执行

gitclone git://github.com/android/kernel_common.git

完成后,用gitbranch -a命令查看所有版本,如

android-3.0

*android-gldfish-2.6.29

remotes/origin/android-2.6.35

remotes/origin/android-2.6.36

remotes/origin/android-2.6.37

remotes/origin/android-2.6.38

remotes/origin/android-2.6.39

remotes/origin/android-3.0

remotes/origin/archive/android-2.6.25

remotes/origin/archive/android-2.6.27

remotes/origin/archive/android-2.6.29

remotes/origin/archive/android-2.6.32

remotes/origin/archive/android-gldfish-2.6.29

remotes/origin/archive/android-goldfish-2.6.27

remotes/origin/linux-bcm43xx-2.6.39

remotes/origin/linux-wl12xx-2.6.39

因为要在模拟器上运行,所以需要下载goldfish相关版本(goldfishAndroid模拟器模拟的CPU)。执行

gitcheckout -b android-gldfish-2.6.29origin/archive/android-gldfish-2.6.29



三、编译源码

1、编译Android源码

首先对编译环境进行初始化,在source目录下,执行

source build/envsetup.sh

选择编译目标

lunch full-eng

参数意义如下:

Build name

Device

Notes

generic

emulator

lowest-commondenominator

full

emulator

fully configuredwith all languages, apps, input methods

full_crespo

crespo

full buildrunning on Nexus S ("crespo")


之后就可以make了。GNU make支持并行编译,使用-jN可选择并行任务数。

编译完成后,会在~/Android/source/out/target/product/genetic目录下生成system.imguserdata.imgramdisk.img等文件。

虽然官网上声明“Theemulator is added to your path automatically by the build process. Torun theemulator”,但在我的机器上,似乎并没有起作用。没关系,只需要手动设置一下。在~/.bashrc文件中加入对ANDROID_PRODUCT_OUT变量的声明:exportANDROID_PRODUCT_OUT=/home/liyang/Android/source/out/target/product/generic

这时,再执行emlulator,如果不带任何参数,模拟器就会加载ANDROID_PRODUCT_OUT指向的本机编译的Android系统。(当然,在这之前需要下载和配置AndroidSDK.


2、编译Android内核

1)设置环境变量

编译Android内核,需要使用到交叉编译器,把包含交叉编译器的路径加入到PATH环境变量中。同时定义变量ARCH,让其值等于arm。在用户目录下的.bashrc文件中加入如下行:

export PATH=$PATH:~/Android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin

export ARCH=arm

2)设置交叉编译参数

kernel目录下的makefile文件中,设置CROSS_COMPILE的值为arm-eabi-。然后把LDFLAGES_BUILD_ID定义为空。

(3)编译

kernel目录下,执行

make goldfish_defconfig

make


四、错误总结

1error:"_FORTIFY_SOURCE" redefined [-Werror]

这一错误出现在Ubuntu11.10中,在之前版本的Ubuntu中一般不会遇到这个问题。这是因为Ubuntu11.10自带的是最新版本的gcc,其对宏定义的声明有所改动。解决方法:在build/core/combo/HOST_linux-x86.mk 文件 61HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0改为HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=02error 

target Java: ExternalLocAllPermsTestApp(out/target/common/obj/APPS/ExternalLocAllPermsTestApp_intermediates/classes)

PassFailButtons.java:191:onCreateDialog(int,android.os.Bundle) in android.app.Activity cannotimplement onCreateDialog(int,android.os.Bundle) incom.android.cts.verifier.PassFailButtons.PassFailActivity; attemptingto assign weaker access privileges; was public

private static <T extendsandroid.app.Activity & PassFailActivity>

target Java: ExternalLocPermFLTestApp(out/target/common/obj/APPS/ExternalLocPermFLTestApp_intermediates/classes)

make: ***[out/target/common/obj/APPS/CtsVerifier_intermediates/classes-full-debug.jar]Error 41

这一错误是jdk配置问题,ubuntu默认用系统带的OpenJDK,需要用update-alternatives配置,也可以直接卸载OpenJDK


3

bad class file:javax/microedition/khronos/egl/EGLConfig.class(javax/microedition/khronos/egl:EGLConfig.class)

unable to access file: corrupted zipfile

Please remove or make sure it appearsin the correct subdirectory of the classpath.

importjavax.microedition.khronos.egl.EGLConfig;

^

make: ***[out/target/common/obj/APPS/Camera_intermediates/classes-full-debug.jar]Error 41

make: *** Waiting for unfinishedjobs....


这一错误是Ubuntu使用了fastjar而不是jar。卸载jar即可,而且推荐用apt-get安装jdk,因为解压tar.gz后不会在系统注册jar,也不能用update-alternatives对其配置。




原创粉丝点击