现在的位置: 首页 > 综合 > 正文

编译Android源码与内核总结

2016年12月26日 ⁄ 综合 ⁄ 共 4103字 ⁄ 字号 评论关闭

这些天花了些时间自己下载了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,并将解压后的内核源码放在该目录下


还需要对Makefile文件的有些地方做些改动,将

 ARCH ?= (SUBARCH)
  CROSS_COMPILE?= 
改为
  ARCH ?= arm  #体系结构为arm
  CROSS_COMPILE     ?= arm-eabi-
同时修改path,添加交叉编译环境,我的如图(红色部分为编译android内核需要的交叉编译环境)

然后在内核源码目录系执行chenzujie@ubuntu-chen:/usr/lib/mydroid2.3.5/kernel/common$ make goldfish_defconfig
chenzujie@ubuntu-chen:/usr/lib/mydroid2.3.5/kernel/common$ make
最后得到Kernel: arch/arm/boot/zImage is ready这个输出证明内核源码也编译出来了。
5、运行模拟器查看
有了前面的步骤后,这一步就方便多了,先添加环境变量(红线部分,大家根据自己的放置路径做相应改动)

命令行输入chenzujie@ubuntu-chen:/usr/lib/mydroid2.3.5$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &

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

cd /proc

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




好了,大功告成了!

抱歉!评论已关闭.