编译Android系统源码

 

步骤

           1:下载源码

           2:搭建编译环境

           3:编译( 一定要等源码下载完整再编译)

 

硬件软件要求


官方文档https://source.android.google.cn/setup/build/requirements

硬件要求
如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
如果要检出代码,至少需要 250GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译,则需要更多空间。
如果在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。


我装的是虚拟机Ubuntu16.0.4,根据官方的要求准备了520G,下载的是8.1的源码,编译完以后发现还有250G。多分配点空间更好以免空间不足扩容麻烦。


一、 下载源码

Android 源码是非常庞大的,而且每个模块都是用git来进行管理 ,整个Android源码是由很多个git项目构成,Google对Android代码的更新也是更新到相应模块的git项目上。

那对于需要编译Android的开发者来说,要分别clone 每个git项目而且还要放到固定的位置确实是件惨绝人寰的事,所以Google就开发了一个基于Python编写的帮助开发者管理多个项目的工具,这个工具就叫repo,repo就是封装了git命令的python脚本。

由于国内网络的原因,我们使用国内的清华大学镜像下载源码和repo工具(镜像地址:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/)网上很多博客使用的不是最新的镜像地址会导致代码拉取失败

1:下载 repo 工具

mkdir ~/bin       # 在home下创建bin文件夹
PATH=~/bin:$PATH    # 把bin文件夹加入环境变量的
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  #下载repo脚本
chmod a+x ~/bin/repo      #添加权限

说明:curl 根据Linux提示安装即可。或者手动输入: sudo apt install curl

2:下载git ,配置用户名邮箱

sudo apt install git

git config --global user.email "xxx.xxx"

git config --global user.name "xxx"

3:下载源码

下载源码有两种方法:

1)Android 官方下载源代码

官方文档:https://source.android.google.cn/setup/downloading

2)使用初始化包(建议)

我第一次是使用官方的方法,一直失败,可能是网络原因文件丢失。后来都是用这个方法。

下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar  # 下载初始化包 66G
tar xf aosp-latest.tar  # 66G的文件解压会比较慢 耐心等待,解压会生成aosp文件夹
cd aosp  # 解压aosp-latest.tar得到的目录
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r1  # 末尾的-b android-8.1.0_r1 用于指定具体的源码的版本,如果未指定,则用于获取master上最新的代码
repo sync  # 正常同步一遍即可得到完整目录

说明:

如果执行该命令的过程中,提示无法连接到 gerrit.googlesource.com,那么我们只需要编辑 ~/bin/repo文件,找到REPO_URL这一行,然后将其内容修改为: https://mirrors.tuna.tsinghua.edu.cn/git/git-repo (参考清华源 https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/

编译Android系统源码

编译Android系统源码

(AOSP项目当前所有的分支列表:https://source.android.google.cn/setup/start/build-numbers.html#source-code-tags-and-builds)

 

 

二、搭建编译环境


官方文档https://source.android.google.cn/setup/build/initializing.html

安装openJDK8
sudo apt  install openjdk-8-jdk

安装软件包
官方文档没有介绍Ubuntu 16.04所需的软件包。使用Ubuntu 16.04的小伙伴,需要安装下面的软件

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
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 libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache


三、准备编译


1:设置环境

使用 envsetup.sh 脚本初始化环境。

进入源码所在目录 根据我的步骤是在aosp目录,输入如下命令

. build/envsetup.sh  # 前面的点要加上 不然提示权限被拒绝

2:选择目标

通过lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上.这里我们设置的编译目标是aosp_arm64-eng,因此执行指令:

lunch aosp_arm64-eng

编译目标格式说明
编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng.

什么是BUILD

BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和编译目标,更多参考官方文档
|受型号|设备代码|编译目标|
|---|----|---|
|Nexus 6P|angler|aosp_angler-userdebug|
|Nexus 5X|bullhead|aosp_bullhead-userdebug|
|Nexus 6|shamu|aosp_shamu-userdebug|
|Nexus 5|hammerhead|aosp_hammerhead-userdebug|

提示:如果你没有Nexus设备,那么通常选择arm或者x86即可

什么是BUILDTYPE

BUILD TYPE则指的是编译类型,通常有三种:
-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不鞥年dedug等)
-userdebug:在user版本的基础上开放了root权限和debug权限.
-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具

了解编译目标的组成之后,我们就可以根据自己目前的情况选择了.那不知道编译目标怎么办?
我们只需要执行不带参数的lunch指令,稍后,控制台会列出所有的编译目标,输入对应的数字即可如下:

 

编译Android系统源码

 

3:开始编译

通过make指令进行代码编译,该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置8个线程同时编译:

make -j8

需要注意的是,参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,即当前cpu的核心的2倍.比如,我现在的笔记本是双核四线程的,因此根据公式,最快速的编译可以make -j8.
(通过cat /proc/cpuinfo查看相关cpu信息)

如果一切顺利的化,在几个小时之后,便可以编译完成.看到### make completed successfully (03:44:37(hh:mm:ss)) ###表示你编译成功了.

 

参考:

https://www.jianshu.com/p/367f0886e62b