Ubuntu下Android源码以及内核下载与编译

澳门新葡亰手机版 7

本教程是基于Ubuntu下Android6.0.1源码以及内核的下载和编译,记录一下,以后也就不用自己去找资料,一遍一遍的尝试了。可以翻墙的,英语好的,直接去AndroidSource.

安装Ubuntu系统:

  • 系统环境:Ubuntu14.04LTS
  • Android版本:6.0.1
  • 重要网址
    澳门新葡亰手机版,清华大学镜像
    AndroidSource

由于Android源码编译谷歌官方是推荐Ubuntu系统的,所以第一步就是安装Ubuntu系统,而我要下载的Android5.0的系统,官方要求最低是Ubuntu12.04,这里是官方要求的网址
https://source.android.com/source/requirements**
我想所有人第一次打算下载和编译Android的源码,第一时间想到的肯定是到百度上去搜教程,我也是这样的找了一篇博客,上面说最好使用Ubuntu14.10,因为他在下载和编译的时候使用14.04出现了好多软件依赖问题,然后我就快了的去按照Ubuntu14.10了(我用的虚拟机安装的Ubuntu,硬盘给了100G,内存2G),安装完毕了,然后按照教程去下载必要的软件吧,一下载全部没有,当时就懵了,怎么回事了?这时旁边的同事看见了(他一直在使用Linux系统),看到我用的14.10,告诉我Ubuntu系统每年发布的两个版本之后4月份发布的版本同时还是偶数年版本才是长期支持版,也就是说14.10不是长期支持版,这个版本只维护八个月,所以软件都找不到了,同事说哪个博客肯定是两年以前的了,我一看,果然是,然后又装了一个14.04

下载前的准备

安装OpenJdk

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
sudo update-alternatives --config java
java -version

安装git

sudo apt-get install git-core

安装额外的组建

sudo apt-get install gnupg flex bison gperf build-essential 
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 
  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache 
  libgl1-mesa-dev libxml2-utils xsltproc unzip
组建 功能 介绍网址
gnupg 加密工具 GPG入门教程
flex The Fast Lexical Analyzer 快速的语法分析工具
bison 用于自动生成语法分析器程序 自动生成语法分析器程序
gperf 完美的散列函数生成器 使用 gperf 实现高效的 C/C++ 命令行处理
build-essential 编译内核中make menuconfig进图形编译 build-essential
zip Linux 下zip包的压缩与解压 Linux 下zip包的压缩与解压
curl 网络请求和提取工具 curl网站开发指南
zlib1g-dev 用于发现gzip和PKZIP的工具 Binary package “zlib1g-dev” in ubuntu trusty
gcc-multilib 允许在64位机器中运行32位应用 multilib
g++-multilib 同上(g++编译工具) 多平台支持
libc6-dev-i386 Embedded GNU C Library: 32-bit development libraries for AMD64 libc6-dev-i386
lib32ncurses5-dev 待完善 待完善
x11proto-core-dev 待完善 待完善
libx11-dev 待完善 待完善
lib32z-dev 待完善 待完善
ccache 待完善 待完善
libgl1-mesa-dev 待完善 待完善
libxml2-utils 待完善 待完善
xsltproc 待完善 待完善
unzip 待完善 待完善

上面的经历就是建议大家,在找博客的时候一定要找比较新的,因为软件行业的变化非常快,如果因为版本的问题浪费时间,真的就得不偿失了。

下载

因为网络以及墙的原因,我们使用清华大学镜像,步骤如下:

下载repo工具

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

下载源码

wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP   # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码

ps:总共25G,慢慢下吧!

还有硬盘大小问题,如果下载Android5.0或者5.0以上的源码,硬盘好预留100G以上,其实源码并没有多大,我5.1的源码下载完之后大概25G左右,最占空间的是在下载的过程中会下载一个.repo的隐藏文件夹,这个文件夹的作用是保存的关于git的所有缓存命令,5.1的这个文件夹大小大概40G左右,大小很惊人,4.0.3的源码大概4.5个G,它的.repo文件夹是10G多大小。由于我的硬盘空间有限所以在确定源码下载完毕之后我就把这个.repo隐藏文件夹删掉了,因为我查找的这个文件夹的作用是缓存git命令,执行repo
sync等下载源码命令的时候需要用到这个文件夹中的内容,就是说这个文件夹确保了本地和远程仓库的链接,既然源码已经下载完毕所以我就删掉了。

编译

进入AOSP根目录

初始化编译环境

. build/envsetup.sh

选择编译目标,选择1,所有选项的意思,后面更新

lunch

开始编译,这里使用了4个并发数:

make -j4

使用打包工具mmm,完成命令后会在根目录下生成android.irp,用android
studio打开一个现有项目,打开android.irp即可

mmm development/tools/idegen/

下载Android源码

运行当前版本的模拟器

将emulator源码目录加入PATH中

export PATH=&PATH:~/bin/AOSP/out/host/linux-x86/bin

设置源码编译输出目录

export ANDROID_PRODUCT_OUT=~/bin/AOSP/out/target/product/generic

运行emulator

emulator

1:更新源
打开Ubuntu上自带的软件中心

下载Android内核源代码

进入kernel目录,下载内核

git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git

进入goldfish目录,选择分支

cd goldfish
git branch -a
git checkout remotes/origin/android-goldfish-2.6.29

澳门新葡亰手机版 1

编译Android内核源代码

将交叉编译工具目录添加到PATH环境变量中

export PATH=$PATH:~/bin/AOSP/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin

打开goldfish下Makefile修改配置文件,找到ARCH,CROSS_COMPILE,将其修改如下

ARCH      ?=arm
CROSS_COMPILE  ?=/home/user/bin/AOSP/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/
arm-linux-androidkernel-

note:一定要设为绝对路径。

生成配置文件以及编译

make goldfish_defconfig
make

image.png

运行当前内核版本的模拟器

运行当前模拟器

emulator -kernel ./kernel/goldfish/arch/arm/boot/zImage

查看内核版本

adb shell
cd proc
cat version

将软件源修改成清华的镜像

BUG

JDK内存溢出

FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/dex-dir/classes.dex.rsp
Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.
Warning: This may have produced partial or corrupted output.
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] 错误 1

A:

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server 

澳门新葡亰手机版 2

image.png

2:安装jdk
上面官方网址中有下载Android源码对应版本需要下载的jdk版本,这里下载openjdk-7-jdk

$  sudo apt install openjdk-7-jdk

安装好之后,配置到环境变量中

$ cd /etc
$ gedit profile

之后会打开prifile文件,在文件的结尾加上

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/  
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin  
export JAVA_HOME  
export PATH

然后保存,退出,如果不让保存,就改一下这个文件的权限,或者使用vim来修改。
可以在命令行输入 java -version 来检验一下是否生效

3:安装必要的工具软件

$ sudo apt-get install git git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev 
$ sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
$ sudo apt-get install lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown 
$ sudo apt-get install libxml2-utils xsltproc gcc-multilib lib32readline5-dev

在安装的过程中如果出现有些软件被新的替代了,就使用apt-get install
命令去安装新的软件
4:配置Cache

$ sudo apt-get install ccache  
$ source  ~/.bashrc 

由于Google使用repo工具管理的Android源码,所以要先现在Repo工具
官方的下载教程地址:https://source.android.com/source/downloading
5:建立一个目录用来放repo工具,同时添加到path目录中

$ mkdir ~/bin
$ PATH=~/bin:$PATH

6:下载Repo工具,然后设置Repo可执行权限
因为我们把镜像改成了清华的镜像,所以从镜像中下载repo

$ cd ~/bin
$ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
$ chmod a+x ~/bin/repo

7:这是你在bin目录下就看见了一个叫repo的文件打开它

澳门新葡亰手机版 3

image.png

修改这个url路径成清华的源路径,保存退出。

REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

百度好多老博客不管在使用镜像下载的时候还是使用git来下载repo,我当时也是直接拿过来,总是出错,报「网络无法连接」,明明是有网的,为什么还无法连接呢?我想肯定又是版本更新的问题,登录清华镜像的网站,就明白了人家网站上说了使用我上面的方式来连接。

8:创建存放Android源码的目录、初始化Repo,下载源码

$ mkdir ~/android
$ cd ~/android

初始化repo,这是就要确定你要下载的源码,我下载的是5.1.1的源码

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.1_r4

下载Android源码,这步是最耗时的

$ repo sync 

注意事项:

1、在源代码下载过程中,我们在源代码下载目录看不到任何文件,ctrl+H“显示隐藏”,会看到一个名为.repo的文件夹,这个文件夹是用来保存Android源代码的“临时文件”
2、文件最后下载接近完成时,会从.repo文件夹中导出Android源代码
3、若是必须关闭电脑停止下载,那么可以在源代码下载的终端中按Ctrl + C
不会造成源代码的丢失或损坏
4、自动或者手动停止源代码的下载,可以使用命令: repo sync 继续下载
5、因为在下载过程中因为网络或者什么原因会中断,我们可以写一个自动化脚本来当停止以后自动执行
repo sync

#!/bin/sh
repo sync 
while [ $? -ne 0 ]
do
repo sync 
done

在源码下载目录创建一个文件,比如down.sh,将上面的代码复制保存,然后停止源码下载以后,执行脚本,执行命令:sh
down.sh
6、如果不确定源码是否下载全,可以多执行几遍 repo sync 命令。

编译源码

直接进入源码目录执行 make
命令,可以在后面指定可以同时几个线程工作,如果你的CPU是4线程可以执行
make -j4 这样可以在编译过程中让CPU充分利用

编译过程中的错误:
错误一:

collect2: ld terminated with signal 9 [Killed]
make: *** [out/host/linux-x86/obj/EXECUTABLES/clang_intermediates/clang] 错误 1
make: *** 正在等待未完成的任务....

或者

g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/content_content_common_gyp_intermediates/content/common/content_message_generator.o] 错误 4

原因:在编译过程中,内存占用量很高,如果没有设置swap分区,或者分区太小就会报上述错误,当然如果你能改编译源码的电脑内存足够大就不用设置交换分区了,也不会出现这个错误了。
解决办法:
使用 free -m 命令查看自己的交换分区,可以看到我的交换分区之后2G

澳门新葡亰手机版 4

image.png

然后使用下面的命令增加交换分区

$ mkdir swap
$ cd swap
$ sudo dd if=/dev/zero of=swapfile bs=1024M count=5
$ sudo mkswap swapfile
$ sudo swapon swapfile

可以看到,我设置增加了5G 交换分区,bs的值和count的值相乘
就是你增加的交换分区的值,最后两步是挂在你设置的交换分区

澳门新葡亰手机版 5

image.png

设置完之后查看,交换分区增加了5G

这里我的经验是:错误出现以后我没有看到上面的 error 提示,只看
make:***
那一行提示了,然后就开始Google解决办法,找了好久都没找到解决办法,大家在编译的时候一定要找到有「error」字样的提示,然后去搜索,当出现问题总会无法找到原因时,一定要相信肯定会有人已经遇到过了,肯定是自己方法错了,因为我当时在解决这个错误的时候就差一点放弃,然后我想,编译Android源码的人这么多,不可能我会遇到别人遇不到的问题,肯定之前有人遇到过并分享出来了,只是我搜索的方式不对,最后找到了解决办法。

错误二:

/bin/bash: xmllint: 未找到命令
make: *** [out/target/product/generic/system/etc/apns-conf.xml] 错误 127
make: *** 正在等待未完成的任务....

解决办法:
安装一个工具

sudo apt-get  install libxml2-utils 

最后编译完成终端截图

澳门新葡亰手机版 6

image.png

运行模拟器:
编译完毕之后,就自然而然有这样的问题,我编译的正确吗,怎么验证呢,基本上都是通过命令行启动模拟器来验证,网上好多都是把source(你的源码目录)/out/host/lunux-x86/bin
这个路径配置到 PATH 中直接执行 emulator
指令,就可以启动命令行了,但是当我配置之后,系统提示没有emulator
命令,然后看bin目录下也没有 emulator
执行文件,这是为什么呢?先说解决办法的,要想运行模拟器需要再执行两步命令

$ source build/envsetup.sh

执行完之后截图

澳门新葡亰手机版 7

image.png

这个命令的作用是导入一些执行脚本
然后执行