编译Android源代码与内核总结

这些天花了些时间自己下载了android源代码来编译,当中走了一些弯路导致耗了些时间,如今又一次梳理总结下,让有同样想法的人自己编译的时候能少走些弯路,官方指导文档在http://source.android.com/source/initializing.html

1、安装linux环境

我是windows系统,安装了Vmware虚拟机。在虚拟机上装了ubuntu-12.04,我的这个版本号是32位的,这个还蛮重要的。安装32位或者64位的将决定你能编译的android版本号,官方文档里For Gingerbread
(2.3.x) and newer versions, including the master branch, a 64-bit environment is required. Older versions can be compiled on 32-bit systems.

假设你编译的是2.3以上的版本号,就要安装64位的ubuntu系统。否则装32位版本号就可以。我这里编译的是2.3.5版本号,因此选择32位版本号的Ubuntu 12.04.5 LTS。内存3g。硬盘40g(官网建议是30G以上)。

2、安装jdk

非常多网上的资料都讲到http://www.oracle.com官网下载,然后我也去傻傻地下载了,下载了最新版本号1.8以上了,结果后来执行的时候发现andorid使用的是jdk1.6的,因此得安装jdk1.6。

编译的提演示样例如以下:

Your version is: java version "1.6.0_24". The correct version is: Java SE 1.6

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html

下载jdk-6u33-linux-i586.bin,然后把它移动到linux文件夹下,我移动到/usr/lib下。

2.1分配权限 chmod +x jdk-6u33-linux-i586.bin

2.2解压 ./jdk-6u33-linux-i586.bin

一路确认下来。最后解压出jdk1.6.0_33目录

2.3配置

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jdk1.6.0_33/bin/java"
1

sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/libjdk1.6.0_33/bin/javac" 1

sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jdk1.6.0_33/bin/javaws" 1

sudo update-alternatives --install "/usr/bin/jar" "jar" "/usr/lib/jdk1.6.0_33/bin/jar" 1

sudo update-alternatives --config java

假设你的机器本来就装有其它版本号的java,这个时候会让你选择要生效的java版本号,记住选择当前这个1.6的版本号

2.4 改动环境变量:

sudo gedit /etc/environment

export JAVA_HOME=/usr/lib/jdk1.6.0_33

export JRE_HOME=${JAVA_HOME}/jre

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

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${JAVA_HOME}/bin:${JRE_HOME}/bin"

sudo gedit /etc/profile

export JAVA_HOME=/usr/lib/jdk1.6.0_33

export JRE_HOME=${JAVA_HOME}/jre

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

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

2.5.source /etc/profile

source /etc/environment

2.6.check java version

java -version

得到

java version "1.6.0_33"

Java(TM) SE Runtime Environment (build 1.6.0_33-b04)

Java HotSpot(TM) Client VM (build 20.8-b03, mixed mode, sharing)

3、下载android 源代码

网上非常多教程都是联网下载,但因为众所周知的原因,这种方法可能被墙或者非常慢,我在网上搜了个网址源代码下载 。我下载了2.3.5的源代码Android2.3.5_Kernel.7z。解压后得到.tar,继续解压后得到mydroid目录,这个就是源代码代码,将源代码相同移动到/usr/lib下

进入源代码文件夹,输入make。就会有非常多输出。

当中我遇到的一个问题:

frameworks/base/libs/utils/RefBase.cpp: 在成员函数‘void android::RefBase::weakref_type::trackMe(bool, bool)’中:

frameworks/base/libs/utils/RefBase.cpp:483:67: 错误: 将‘const android::RefBase::weakref_impl’作为‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’实參时丢弃了类型限定 [-fpermissive]

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 错误 1

这个问题是由于本机装的gcc版本号太高,须要换到合适的能够编译android的版本号

sudo apt-get install gcc-4.4

sudo apt-get install g++-4.4

sudo rm -rf /usr/bin/gcc /usr/bin/g++

sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc

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

第一次编译会比較久,我是放一晚上让它跑,第二天早上起来看到输出

Target system fs image:    out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img

 Install system fs image: out/target/product/generic/system.img

 Target ram disk: out/target/product/generic/ramdisk.img

 Target userdata fs image: out/target/product/generic/userdata.img

  Installed file list: out/target/product/generic/installed-files.txt 

代表成功make编译了源代码。

4、编译linux内核

然后我们还须要编译android的linux内核,尽管是linux源代码,但不能随便从网上下个linux源代码,由于Android在Linux内核的基础上加入了自己所特有的驱动程序,因此要编译android的linux内核必须使用android专门的linux内核。网上非常多方法都是提供git clonehttp://android.googlesource.com/kernel/goldfish.git的方法去下载。但由于有墙因此不好用。我搜了半天了搜到了一个http://pan.baidu.com/s/1qW0TkkO这里就能够下载了。大概300多M,比源代码小多了。

下载完后解压在android源代码文件夹下新建一个文件夹kernel。并将解压后的内核源代码放在该文件夹下

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnp1amll/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

还须要对Makefile文件的有些地方做些修改,将

ARCH ?= (SUBARCH)

CROSS_COMPILE?=

改为

ARCH ?

= arm  #体系结构为arm

CROSS_COMPILE     ?= arm-eabi-

同一时候改动path,加入交叉编译环境。我的如图(红色部分为编译android内核须要的交叉编译环境)

然后在内核源代码文件夹系运行[email protected]:/usr/lib/mydroid2.3.5/kernel/common$ make goldfish_defconfig

[email protected]:/usr/lib/mydroid2.3.5/kernel/common$ make

最后得到Kernel: arch/arm/boot/zImage is ready这个输出证明内核源代码也编译出来了。

5、执行模拟器查看

有了前面的步骤后,这一步就方便多了,先加入环境变量(红线部分,大家依据自己的放置路径做对应修改)

命令行输入[email protected]:/usr/lib/mydroid2.3.5$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &

随后模拟器将启动,此时输入adb shell进入android系统,继续输入

cd /proc

cat version,将看到自己编译出来的版本号,比方我的例如以下

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnp1amll/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

好了,大功告成了。

时间: 2024-10-07 18:21:14

编译Android源代码与内核总结的相关文章

Android源代码和内核源代码的下载,编译和运行

笔者根据罗升阳老师的<Android 系统源代码情景分析>一书,尝试下载,编译和运行Android源代码和内核源代码.但可能是软件源"被墙"或版本更新的原因,期间遇到诸多问题.笔者求助于强大的度娘和谷歌,终于编译成功,现将修改的步骤记录如下: 一.下载相关的工具包和依赖包 1.git工具的下载,不多说 2.Java SDK的下载(参考网址:http://blog.csdn.net/zjclugger/article/details/11762085) 此处建议下载jdk1.

[转]编译Android源代码常见错误解决办法

1. 编译时出现/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when searching for -lz PLATFORM_VERSION_CODENAME=AOSPPLATFORM_VERSION=AOSPTARGET_PRODUCT=genericTARGET_BUILD_VARIANT=engTARGET_SIMULATOR=TARGET_BUILD_TYPE

【转】如何单独编译Android源代码中的模块

原文网址:http://blog.csdn.net//article/details/6566662/ 第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了.以后如果我们修改了Android源代码中的某个模块或者在Android源代码工程新增一个自己的模块,是不是还是执行make命令呢?答案是否定的,Google为我们准备了另外的命令来支持编译单独的模块,以及重新打包syst

【Android 系统开发】 编译 Android 系统 u-boot 内核 源码 并烧写到 OK-6410A 开发板上

博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 Android 光盘 下载地址 : http://pan.baidu.com/share/link?shareid=3662728609&uk=2754759285 ; -- 光盘所含内容 : Android 引导 u-boot 源码, Android 内核 源码, Android 系统源码, 交叉编

如何单独编译Android源代码中的模块

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6566662 第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了.以后如果我们修改了Android源代码中的某个模块或者在Android源代码工程新增一个自己的模块,是不是还是执行make命令呢?答案是否定的,Google为

单独编译Android源代码中的某个模块

众所周知,编译一个固件要花很久时间.有时只改系统的某个模块的某个功能,如修改系统Setting源码的一些地方,这时就没有必要再整个系统编译一遍,这时就需要用到模块编译(前提是系统已经编译过一遍). 下面以编译A20平台源码中的一个apk为例. 例如要修改系统设置中HDMI分辨率输出,让其只有几个输出选项. 1,进入android\device\softwinner\common\packages  这个目录,找到TvdSettings这个文件夹,这个就是A20定制的系统设置源码. 2,找到Dis

编译android源代码(aosp)

步骤1:按照官方的文档,下载源码,配置环境,并执行相应的命令.最好按照官方的硬件和系统配置build. build的版本是6.0,源码目录是/home/koder/android-source-20151229 Requirements: 下载的源码很大,估计有30,40G左右.加上build,最好腾出100+的空间来. 按官方说的MAC OS或者Ubuntu LTS (14.04)X64,自己是Ubuntu LTS (14.04) 64位. 硬件问题:内存不足,看文末问题1. 有一个注意文档说

Android、Linux内核源代码的下载和编译

1. 配置Android源代码下载环境 a. 创建一个用于存放下载脚本文件的目录 mkdir -/bin PATH=~/bin:$PATH b. 下载repo脚本文件 curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo chmod a+x ~/bin/repo c. 创建用于存放Android源代码的目录 mkdir android_source cd android_source d. 初始化 re

Android源代码的下载和编译

Android源码包括应用程序源码.SDK工具集以及NDK工具集等等,如何下载?请看: 配置Android源代码下载环境: 创建一个用于存放下载脚本文件(repo)的目录 # mkdir ~/bin # PATH=~/bin:$PATH 下载rope脚本文件 # curl https://dl-ssl.google.com/dl/googlesource/git-repo > ~/bin/repo # chmod a+x ~/bin/repo 创建用于存放Android源代码的目录 # mkdi