Android源码编译总结
来源:互联网 发布:网页音乐提取软件 编辑:程序博客网 时间:2024/05/22 01:17
近期,希望了解一下Android平台,就下载了其源码并尝试对其进行了编译,现将过程总结如下。
一、环境配置
操作系统:现阶段,官方对Android的源码开发和编译的支持主要针对Linux和MacOS平台,尚未包括Windows平台。不包括Linux内核的Android系统源码大约2.6G,为Android改写的Linux内核大约1G,加上各种工具和编译后的映像,大概需要12G左右的空间。硬盘空间的需求和编译过程对CPU和内存的需求表明,用虚拟机显然不是一个好的选择。本文中所用的是Ubuntu11.10系统。
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的压缩包直接解压,至于原因,在后面的编译错误分析中再详细说明。
Git.Thestupid content tracker,傻瓜内容跟踪器。Git是用于Linux内核开发的版本控制工具。
Python.
官方声明的必须的编译环境就包括这些,但在其他参考资料中往往会提到其他一些工具,例如:
Valgrind一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
Flex(fast lexical analyser generator)一款词法分析器生成器,是Lex的另一个替代品。它经常和自由软件Bison语法分析器生成器一起使用。
GNU bison属于GNU项目的一个语法分析器生成器。Bison把一个关于“向前查看从左到右 最右”(LALR)上下文无关文法的描述转化成可以分析该文法的C或C++程序。它也可以为二义文法生成“通用的 从左到右 最右” (GLR)语法分析器。Bison基本上与Yacc兼容,并且在Yacc之上进行了改进。
gperf一种“完美的” 散列函数,可以为用户提供的一组特定字符串生成散列表、散列函数和查找函数的C/C++代码。
Curl利用URL语法在命令行方式下工作的文件传输工具。
二、源码下载
需要下载的源码分为两部分:Android源码和Android内核(AndroidLinux Kernel)。这是因为通过Welcometo Android | Android OpenSource下载的Android源码中,只包含编译好的内核映像,如果要查看和修改内核的话,需要另外下载。
1、下载Android源码
建立存放Android源码的目录,如~/Android,并在Android目录下建立bin和source两个子目录。下载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 -u
https://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
相关版本(
goldfish
是
Android
模拟器模拟的
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.img
、
userdata.img
、
ramdisk.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
四、错误总结
1、error:"_FORTIFY_SOURCE" redefined [-Werror]
这一错误出现在Ubuntu11.10中,在之前版本的Ubuntu中一般不会遇到这个问题。这是因为Ubuntu11.10自带的是最新版本的gcc,其对宏定义的声明有所改动。解决方法:在build/core/combo/HOST_linux-x86.mk 文件 61行把HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0改为HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=02、error
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对其配置。
- Android源码编译总结
- 编译Android源码总结
- ANDROID源码编译开发总结
- Android源码编译整理总结
- ANDROID源码编译开发总结 .
- android源码编译错误总结
- Android源码编译整理总结
- 编译 Android 源码问题总结
- android 源码 sdk 编译总结
- Android源码编译整理总结
- Android源码编译整理总结
- Android源码编译整理总结
- Android源码编译整理总结
- Android源码编译整理总结
- Android源码编译整理总结
- Android源码编译整理总结
- Android源码编译整理总结
- Android源码编译步骤总结
- 无非选择而已
- 二叉树遍历--递归实现
- 得到tnsnames.ora文件的位置 zz
- page request session application范围区别
- ABAP Gantt
- Android源码编译总结
- Linux 时钟管理
- 学习心得
- javadoc总结
- 网络基础知识普及—MB/s、Mb/s、Mbps 区别
- 张亚勤:移动互联规模将十倍于桌面互联网
- DNN6.0.1 module支持AJAX的操作方法
- IE浏览器使用自动配置脚本的设置方法
- 我是如何学习计算机编程的