Android源码 ——编译Android5.0源码(Win7+VMware12+Ubuntu16)

时间:2022-03-06 18:29:41

上一篇文章中我们整合了构建下载Android源码环境的资料:

Android源码 —— 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16)

本文将介绍如何在VMware+Ubuntu16环境下编译已经下载好的Android源码。

你想知道关于如何编译源码的一切都在这里:

Android官网:Android源码编译环境的编译指南

准备编译环境

JDK、OpenJDK环境

上一篇文章中已经提示过JDK的环境需要,这里不累述,查看笔者的编译环境:

goodong@ubuntu:~$ java -version

java version “1.7.0_95”
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

编译所需的依赖

以下提到的编译需要依赖的程序,请务必确认每个都安装成功

sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4

如果安装过程中出现错误,务必逐个搜索解决方案,可能某些程序的版本有变动:

例如 :lib32z-dev 有可能需要安装:lib32z-dev:i386

配置SWAP交换分区

交换分区SWAP:一段用于在Ubuntu Linux服务上增加可用内存的空间。

Swap space is nothing but a disk storage used to increase the amount of memory available on the Ubuntu Linux server

Android官网:Android源码编译环境的编译指南 建议RAM/SWAP至少要配置15G。也就是说,要么你分配给虚拟机的内存达到15G,要么你要创建一个15G的SWAP空间。

配置SWAP的教程:
Ubuntu Linux Create and Add Swap File Tutorial
在ubuntu中使用file当swap
http://www.linuxidc.com/Linux/2014-08/105223.htm

编译源码

删除任何之前编译输出

$ make clobber

通过envsetup.sh脚本初始化编译环境

$ source build/envsetup.sh

或者简单的使用 . 代替 source

$ . build/envsetup.sh

选择编译目标

$ lunch
You’re building on Linux
Lunch menu… pick a combo:
1. aosp_arm-eng
……
Which would you like? [aosp_arm-eng]

选择1:

$ 1

执行编译

跟着-j后面的数字根据你的Ubuntu系统配置来设定。如果你的配置是:2个CPU,每个CPU有5个核,每个核可以开启2个硬件线程,那么进行最快编译的数字在:20(2*5*2)~ 40 (2*5*4)之间。

笔者使用3个CPU,5核:
编译时命令使用:

$ make -j15

接下来就是漫长的等待和解决可能错误了。

编译成功的标志

编译成功后如下图:
Android源码 ——编译Android5.0源码(Win7+VMware12+Ubuntu16)

进入/源码根目录/out/target/product/generic目录,可以看到编译好的文件:
Android源码 ——编译Android5.0源码(Win7+VMware12+Ubuntu16)

启动模拟器

编译SDK

编译SDK与编译源码相类似:

$ source build/envsetup.sh

$ lunch sdk-eng

$ make sdk

编译成功的提示
Android源码 ——编译Android5.0源码(Win7+VMware12+Ubuntu16)

遍历到 /源码根目录/out/host/linux-x86/sdk/sdk$
Android源码 ——编译Android5.0源码(Win7+VMware12+Ubuntu16)

启动模拟器

如果你编译成功之后没有关闭编译时所用的终端则直接使用emulator就可以启动模拟器,否则需要重新初始化环境:

$ source build/envsetup.sh

$ lunch aosp_arm-eng
aosp_arm-eng 是在编译时选择的build target

$ emulator
启动模拟器参看:

android4.4 源码编译之运行模拟器
编译并运行Android4.0模拟器

Android源码 ——编译Android5.0源码(Win7+VMware12+Ubuntu16)

编译Android Linux内核

下载goldfish代码

在已下载的Android源代码根目录下:

$ mkdir kernel

$ cd kernel

$ git clone http://android.googlesource.com/kernel/goldfish.git

下载完毕之后,kernel目录下会多出一个goldfish目录:

$ cd goldfish

查看所有分支:
$ git branch -a

master
remotes/origin/HEAD -> origin/master
remotes/origin/android-3.10
remotes/origin/android-3.4
remotes/origin/android-goldfish-2.6.29
remotes/origin/android-goldfish-3.10
remotes/origin/android-goldfish-3.4
remotes/origin/linux-goldfish-3.0-wip
remotes/origin/master

启动虚拟机,使用adb工具连接,查看当前的内核版本

$ adb start-server
$ adb remount
$ adb shell cat /proc/version

Android5.0使用的是3.4的内核:

合入3.4版本的代码:

$ git chekout remotes/origin/android-goldfish-3.4

合入完毕后在goldfish目录下创建一个新的文档,并命名为make_zImage.sh

     #!/bin/bash  
export PATH=/Android源码根目录/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin:$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make goldfish_armv7_defconfig
make zImage -j2

然后修改goldfish目录下Makefile文件:

ARCH ?= arm
CROSS_COMPILE ?= arm-eabi-

执行make_zImage.sh脚本:

$ chmod a+x make_zImage.sh

$ ./make_zImage.sh

当控制台输出:

Kernel : arch/arm/boot/zImage is ready

时,内核代码就编译成功了。
使用新编出来的内核启动模拟器:

$ emulator64-arm -kernel 源码根目录/kernel/goldfish/arch/arm/boot/zImage

可参看的编译经验

ubuntu 编译android源码 (android-5.1.0_r3)
ubuntu编译安卓5.0源码小记
编译Android源码致命错误解决方案
Ubuntu 16.04 LTS 成功编译 Android 6.0 源