Ubuntu下Android源码编译,0系统源码下载

作者: 医学科学  发布:2019-10-01

安装Ubuntu

本人使用的windows系统,因此使用Oracle VM Virtual Box虚拟机安装Ubuntu系统,Ubuntu系统本人选择的是Ubuntu14.04。
1、下载Oracle VM Virtual Box https://www.virtualbox.org/wiki/Downloads 根据各自的系统下载对应的版本。
2、下载Ubuntu系统 http://www.ubuntu.com/download/desktop 本人选择的是 Ubuntu 14.04.4 LTS 64bit。
3、如何使用Oracle VM Virtual Box安装Ubuntu,本人就不在做过多的赘述了,不明白者请查询相关资料。

最近计划着研究下 Android 7.0 的系统源码,之前也没做过什么记录,这次正好将学习的内容记录下来,方便以后复习巩固。

安装Ubuntu系统:

配置虚拟机共享文件夹

为了使下载的Android源代码能在Windows中使用SourceInsight打开,所以需要创建Windows共享文件夹,在Ubuntu中让源代码下载在共享文件夹中,或者让Ubuntu共享代码下载的文件夹,在Windows中访问。本文以第一种方式为例阐述。

Paste_Image.png

此设置需要在关闭Ubuntu虚拟机的情况下设置。设置完成之后,打开Ubuntu系统发现没有权限去访问这个共享文件夹,解决方案是把当前用户加到一个叫vboxsf的组中,执行指令

sudo usermod -a -G vboxsf <你的用户名>

挂载的共享文件夹在/media

Paste_Image.png

这里本人使用了SecureCRTSSH远程连接了Ubuntu

sudo apt-get install openssh-server // 安装SSH服务

既然要学习我们的系统源码,那我们第一步要做的就是下载源码并进行编译了。

由于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

安装必要的工具

1、git版本控制工具

sudo apt-get install git

配置git

git config --global user.email "<你的邮箱>"
git config --global user.name "<你的名字>"

2、curl,官方一点的说法就是开源的文件传输工具。类似迅雷,或者wget

sudo apt-get install curl

3、 安装repo,Android使用Git作为代码管理工具,开发了Gerrit进行代码审核以便更好的对代码进行集中式管理,还开发了Repo命令行工具,对Git部分命令封装,将百多个Git库有效的进行组织。
新建一个bin目录

mkdir ~/bin

~/bin目录添加到PATH中,编辑.bashrc在最后添加

PATH=$PATH:~/bin

下载repo

curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo > ~/bin/repo

添加可执行权限

chmod a+x ~/bin/repo

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

使用repo下载Android系统源码

1、cd到共享文件夹
新建一个文件夹存放Android源码

mkdir android && cd android

初始化工作目录,默认为master 分支

repo init -u  git://mirrors.ustc.edu.cn/aosp/platform/manifest

初始化工作目录,并指定分支

repo init -u  git://mirrors.ustc.edu.cn/aosp/platform/manifest -b <branch>

branch可查看网址
https://source.android.com/source/build-numbers.html#source-code-tags-and-builds [需要翻墙]

附上一些较新的系统分支

Build Branch Version
M5C14J android-6.0.1_r31 Marshmallow
LMY49J android-5.1.1_r37 Lollipop
KTU84Q android-4.4.4_r2 KitKat

如果想下拉并切换到Android 4.4.4,可以执行一下指令

repo init -u  git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.4.4_r2

如果在初始化的时候遇到以下问题

Paste_Image.png

这是一个Virtual Box为了安全禁止了链接的错误,解决方案如下,请在关闭虚拟机的情况下进行,
Windows 下cmd进入到Virtual Box的安装目录

Paste_Image.png

键入

VBoxManage setextradata <YOURVMNAME> VBoxInternal2/SharedFoldersEnableSymlinksCreate/<YOURSHAREFOLDERNAME> 1

<YOURVMNAME> = 虚拟机的名字
<YOURSHAREFOLDERNAME> = 设置共享的名字
请注意大小写,例如

Paste_Image.png

Paste_Image.png

Paste_Image.png

设置完成后,查看有没有设置成功

VBoxManage getextradata <YOURVMNAME>  enumerate  

Paste_Image.png

初始化之后,目录下面多了一个.repo隐藏文件夹,查看其初始大小

Paste_Image.png

2、下拉代码

repo sync 

repo sync 下载最新本地工作文件,同步 repository 中的代码。 可以指定需要更新的project , 如果不指定任何参数,会同步整个所有的项目。如果是第一次运行 repo sync, 则这个命令相当于 git clone,会把 repository 中的所有内容都拷贝到本地。如果不是第一次运行 repo sync, 则相当于 更新和自动合并动作,repo sync 会更新 .repo 下面的文件。 如果在merge 的过程中出现冲突, 这需要手动运行 git rebase --continue

防止中途人离开出错,可以使用以下脚本

#!/bin/bash
echo "======start repo sync======"
repo sync
while [ $? == 1 ]; do
  echo "======sync failed, re-sync again======"
  sleep 3
  repo sync -j4
done

repo sync后面可以加个-j<数字>参数来加快仓库克隆,如:

repo sync -j8 // 默认是4

同步时间因人而异,我大概挂了两三个小时

硬件环境要求

还有硬盘大小问题,如果下载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等下载源码命令的时候需要用到这个文件夹中的内容,就是说这个文件夹确保了本地和远程仓库的链接,既然源码已经下载完毕所以我就删掉了。

构建编译环境

对于Gingerbread (2.3.x)之后的系统需要64位的操作系统,老的系统可以在32为的机器上编译
1、安装JDK
每个Android系统对于JDK的要求是不一样的,当前Android Open Source Project (AOSP)master分支上需要Java 8,在Ubuntu上可以安装OpenJDK。
其他分支对于JDK的要求 Java JDK:
Java 7: for Lollipop through Marshmallow
Java 6: for Gingerbread through KitKat
Java 5: for Cupcake through Froyo
这里已编译KitKat为例,下载JDK6,由于官网下载需要填写账号信息,因此这里给出一个百度云的链接 http://pan.baidu.com/s/1nuo3XNj 下载完成后,记得添加到环境变量

2、 下载编译所需工具
Ubuntu系统版本是14.04的,具体的版本需要安装哪些工具可以查询 https://source.android.com/source/initializing.html

sudo apt-get install git-core 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

1. 编译环境

按照官方的说法,编译 Android 2.3.x 及以上版本的系统源码需要 64 位的系统运行环境来支持,而编译 2.3.x 以下的版本则需要 32 位的系统运行环境。

下载Android源码

正式编译

1、设置编译环境变量
初始化环境变量

source build/envsetup.sh

或者

. build/envsetup.sh

2、选择编译目标

lunch aosp_arm-eng

类型说明

user          limited access; suited for production
userdebug     like "user" but with root access and debuggability; preferred for debugging
eng         development configuration with additional debugging tools

3、使用ccache
加快编译的东西,建议大小 50-100G

export USE_CCACHE=1
export CCACHE_DIR=/<path_of_your_choice>/.ccache
prebuilts/misc/linux-x86/ccache/ccache -M 50G

4、编译

make -j<你CPU的核心数乘以2> 如:make -j8

经过漫长的编译时间

5、模拟器运行
直接在控制台运行,在编译的工程中此命令或自动添加到环境变量中

emulator

模拟器运行起来后,即可看到刚编译好的image

官方编译教程 https://source.android.com/source/index.html [需翻墙]

2. 硬盘空间

官方建议最好预留 100G 的磁盘空间来下载源码,150G 的磁盘空间用来编译源码,如果使用了 ccache(一个高速编译缓存工具,可以大幅加快 gcc 的编译速度),那么则需要更大的空间来支持。

所以尽可能地保证自己的磁盘空间够大吧,之前就因为磁盘空间预留不够导致源码编译过程中空间不足,狠狠地把自己坑了一把。

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

3. 内存空间

如果你是在虚拟机上跑 linux,官方建议至少需要 16G 的内存空间,我的机器只有 8G 的内存空间跑虚拟机,目前跑起来也没太大问题,就是编译源码的过程非常漫长,不知道是否跟内存大小有关。


图片 1

软件环境要求

image.png

1. 操作系统

Android 系统的源码的编译支持 Linux 跟 Mac OS 两种操作系统,一般情况下,Android 系统源码都是在 Linux Ubuntu 系统上进行开发与测试的,所以如果你准备使用 Linux 系统来进行源码编译,那一般推荐安装 Ubuntu 版本的 Linux。

下面列出了各 Android 版本与编译系统版本的对应关系

Linux:

Android 版本 GNU/Linux
Android 6.0 (Marshmallow) - Android最新版本 Ubuntu 14.04 (Trusty)
Android 2.3.x (Gingerbread) - Android 5.x (Lollipop) Ubuntu 12.04 (Precise)
Android 1.5 (Cupcake) - Android 2.2.x (Froyo) Ubuntu 10.04 (Lucid)

Mac OS

Android 版本 Mac OS (Intel/x86)
Android 6.0 (Marshmallow) - Android最新版本 Mac OS v10.10 (Yosemite) or later with Xcode 4.5.2 and Command Line Tools
Android 5.x (Lollipop) Mac OS v10.8 (Mountain Lion) with Xcode 4.5.2 and Command Line Tools
Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat) Mac OS v10.6 (Snow Leopard) or Mac OS X v10.7 (Lion) and Xcode 4.2 (Apple's Developer Tools)
Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich) Mac OS v10.5 (Leopard) or Mac OS X v10.6 (Snow Leopard) and the Mac OS X v10.5 SDK

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

2.JDK 版本要求

不同的Android版本编译也需要对应的 JDK 环境,这里列出了各版本之间的对应关系

Android 版本 JDK 版本(Ubuntu) JDK 版本(Mac OS)
Android 目前最新版本 [OpenJDK

8]( jdk 8u45 or newer|
|Android 5.x (Lollipop) - Android 6.0 (Marshmallow)|OpenJDK 7|jdk-7u71-macosx-x64.dmg|
|Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat)|Java JDK 6|Java JDK 6|
|Android 1.5 (Cupcake) - Android 2.2.x (Froyo)|Java JDK 5| |


图片 2

搭建编译环境

根据上面列出的软硬件要求,我们可以根据自己要编译的 Android 版本以及自己的设备来选择合适的系统及JDK,接下来我们就来说说如何搭建编译环境。

这里我们主要针对Android 7.0的需要的编译环境分别对 Linux 和 Mac OS 进行配置:

image.png

设置 Linux 系统编译环境

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

1.安装 JDK

Android 7.0目前需要 openJDK 8的 JDK 环境

$  sudo apt install openjdk-7-jdk
Ubuntu 15.04+

如果你的系统是 Ubuntu 15.04 及以上版本的话,直接运行如下指令即可直接安装:

$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk

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

Ubuntu 14.04

如果你使用的是 Ubuntu 14.04 版本,现在并没有专门针对14.0.4可用的 open jdk8 的包,

但是 Ubuntu 15.04 OpenJDK 8 的包可以在 14.0.4 上成功地运行,所以我们下载 Ubuntu 15.04 OpenJDK 8 的安装包来手动安装:

  1. 从 archive.ubuntu.com上依次下载下面列出的64位的 open JDK 8 的.deb安装包
    openjdk-8-jre-headless_8u45-b14-1_amd64.deb
    openjdk-8-jre_8u45-b14-1_amd64.deb
    openjdk-8-jdk_8u45-b14-1_amd64.deb

  2. 安装 .deb 包
    先运行 apt-get 指令更新软件列表

sudo apt-get update

接着依次对上面下载的三个 deb 文件运行如下指令进行安装:

sudo dpkg -i 下载的文件地址

最后运行 apt-get -f 指令修复安装依赖的包

sudo apt-get -f install
  1. 更新系统默认使用的 JDK 版本
    如果你的系统安装了多个版本的 JDK,可以通过下面的指令执行切换,会弹出可选的 JDK 版本,根据你的需要选择对应的版本就可以了:
sudo update-alternatives --config java
sudo update-alternatives --config javac
$ cd /etc
$ gedit profile

2.安装所需要的工具包

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

Ubuntu 14.04

我们编译过程中会用到下面的依赖包,执行如下指令统一安装:

sudo apt-get install git-core 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
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/  
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin  
export JAVA_HOME  
export PATH

3.设置源码编译输出路径

默认情况下,编译好的系统源码会在源码所在目录的out文件夹下,
如果你希望调整输出目录的路径,可以执行下面的指令指定输出目录:

export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>

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

4.设置 USB 接口访问设备

在linux下,默认情况是不允许普通用户直接通过 USB 接口来访问设备的.

推荐方法是以根用户身份在 /etc/udev/rules.d/51-android.rules 路径创建文件。

我们可以通过如下指令来实现(注意用你的系统username替换指令中的<username>):

wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules

3:安装必要的工具软件

设置 Mac OS 系统编译环境

Mac OS 的文件系统默认情况下保留了大小写实际上却又不区分大小写。
目前的git指令无法支持这样的文件系统,会导致一些莫名其妙的错误,所以在 Mac OS 上编译 Android 系统源码,我们必须先创建一块区分大小写的磁盘镜像。

$ 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

创建一块区分大小写的磁盘镜像

这里我们直接通过命令行来创建:

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg

该指令会在系统根目录下生成一个 android.dmg 或是 android.dmg.sparseimage 文件,一旦挂载,将被作为支持 Android 开发所需格式的驱动镜像分区。

如果之后你需要更大的空间,你可以通过下面的指令进行空间调整:

hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

你还可以在 ~/.bash_profile 文件中,添加帮助函数来挂载跟取消挂载:

# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }

#如果创建dmg文件时生成的是android.dmg.sparseimage文件,则使用
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }

# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }

之后我们就可以通过执行 mountAndroid 指令来执行挂载镜像,通过 umountAndroid 指令来取消挂载。

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

安装 JDK

$ sudo apt-get install ccache  
$ source  ~/.bashrc 
安装工具依赖包

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

1. 安装 xcode 命令行工具
$ xcode-select --install

对于老版本的 Mac OS 系统(10.8或者10.8之前的),我们需要到苹果开发者站点进行下载安装.
如果你还没有注册成为苹果开发者,你需要先注册一个苹果账号来进行下载.

$ mkdir ~/bin
$ PATH=~/bin:$PATH
2. 到 macports.org 上下载对应Mac OS版本的 macports (类似于Linux下的 apt-get,用来帮助你安装其他应用程序)

注意:确保 /opt/local/bin 在路径 /usr/bin 前,如果没有,在 ~/.bash_profile 文件中进行添加

export PATH=/opt/local/bin:$PATH

注意:如果根目录下没有 .bash_profile 文件,那就手动创建一个

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

3. 通过 macports 安装 make , git 以及 GPG
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

如果使用的是 Mac OS X v10.4 版本的系统,还需要安装 bison :

$ POSIXLY_CORRECT=1 sudo port install bison

注意:如果是编译 Android 4.0.x 及以下版本的系统,gmake 3.8.2 版本存在一个 bug,需要还原到 gmake 3.8.1


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

优化编译环境(可选)

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

设置 ccache

我们可以自由选择是否开启 ccache 编译工具。

ccache 是一个高速编译缓存工具,它通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了 CC++ 的构建速度。

从编译的全过程来看,不使用 ccache 的情况下,编译过程中会多次解析相同的头文件,浪费了处理器周期,更重要的是浪费了开发者的时间,因为他们要等待这一过程的完成。在一个团队中,这一影响可能会更为明显,因为团队成员可能会反复编译解析相同的头文件。

所以,一般对于专门用来编译系统的服务器或是大容量的生产环境,这个功能比较有用,它可以加速重新编译的速度。

注意:如果你只是个人开发者,不是专门的编译服务器,不需要进行增量构建的话,那么使用 ccache 可能会因为高速缓存缺失而降低你的构建速度。

图片 3

开启 ccache

要开启 ccache,在源码树的根路径下执行下面的指令:

$ export USE_CCACHE=1
$ export CCACHE_DIR=/<path_of_your_choice>/.ccache
$ prebuilts/misc/linux-x86/ccache/ccache -M 50G

缓存的大小一般设置为50G-100G

接着在 .bashrc (或者 etc/profile )中添加下面的指令

export USE_CCACHE=1

默认情况下,缓存会存在home根目录的 ~/.ccache 中,但是如果你使用的是NFS或者其他的非本地文件系统,那么你同样需要在 .bashrc 指定缓存目录地址

在 Mac OS 的系统中,你需要将 linux-x86 替换成 darwin-x86:

prebuilts/misc/darwin-x86/ccache/ccache -M 50G

当编译的 Android 系统是4.0.x或者更老的版本,ccache 的缓存路径会有所不同

prebuilt/linux-x86/ccache/ccache -M 50G

这个设置会一直存储在 CCACHE_DIR 中。

在Linux上,你可以通过以下指令开启对 ccache 的监听:

$ watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s

image.png

下载源码

编译环境配置好之后,我们就可以开始下载我们的源码了

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

安装 Repo

Repo 是 google 用 python 写的一个脚本工具,Android 使用 git 作为代码管理工具,一个 Android 系统由 N 多个 git 库构成,如果手动进行一个个下载,那简直是一件非常痛苦的事,而 repo 就是用来对这些 git 库进行维护管理跟下载的。

通过 Repo 工具,我们可以轻松地完成 Android 系统源码的下载。

REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
1.在系统 home 根路径下创建bin目录并且添加到 path 路径中:
#创建bin目录
$ mkdir ~/bin

#把bin目录的路径添加到PATH中
$ PATH=~/bin:$PATH

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

2.下载 repo 工具并设置其可执行
#curl 是个开源文件传输工具,在这里是把远程的 repo 文件下载到指定的 ~/bin/repo 路径
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

#修改 repo 对所有人可执行
$ chmod a+x ~/bin/repo

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

初始化 Repo 客户端

$ mkdir ~/android
$ cd ~/android
1.创建一个空目录用来存放我们的 Android 系统源码,名字自己随便定
#创建名为 WORKING_DIRECTORY 的目录
$ mkdir WORKING_DIRECTORY

#进入到创建的目录中
$ cd WORKING_DIRECTORY

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

2.初始化 repo 仓库

从主干 master 下载源码,目前最新版本

$ repo init -u https://android.googlesource.com/platform/manifest

如果需要下载某个特定版本系统的分支,可以在上述命令后加 -b 版本分支号,这里我指定 Android 7.0 的版本分支

$ repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.0_r7

具体的版本分支号可以到这个地址查看(需要翻墙):
Android系统个版本分支号

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.1_r4
3.同步源码到本地

这时执行 sync 指令便可以自动下载源码到本地了

$ repo sync

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

使用国内镜像下载源码

由于国内网络的问题,上述操作的源码下载需要翻墙才能进行,速度会受到很大影响,几十G的系统源码可能需要花上上周的时间才能下完,

因此我们可以选择国内的镜像进行源码下载:

清华大学的镜像站
参照页面上的描述对上面的指令稍作调整便可以了,站点上写得比较详细,这里我们就不作赘述了。

根据网速的不同,一般一天之内能够下载完毕。

对于下载下来的源码,我们并不能直接刷到我们的目标设备上或者是使用模拟器运行,我们必须对源码进行编译生成对应的 image 二进制镜像文件,
当然你也可以直接从官网下载对应系统版本的镜像文件(需翻墙):
Google's Nexus driver page
Binaries Preview for Nexus Devices

这里我们还是自己来编译下源码,熟悉下整个编译过程。


$ repo sync 

源码编译

首先我们通过命令行进入到源码目录中,我这里目录的名称是aosp

cd aosp

注意事项:

清空输出目录

为了确保我们编译生成的文件不受之前 build 构建的文件影响,我们在源码目录中执行下面的指令,该指令会清空 out 输出目录中的所有文件

$ make clobber

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

设置编译环境

首先我们通过源码 build 目录中的 envsetup.sh 脚本文件初始化我们的编译环境,执行

$ source build/envsetup.sh

$ . build/envsetup.sh

这两个指令的效果是一样的,会初始化一些有用的命令工具

Paste_Image.png

我们后面执行的一些指令必须在初始化 envsetup之后才能执行

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

选择编译目标

接着我们通过 lunch 指令来选择我们需要编译的目标
执行lunch指令

$ lunch

会弹出可选目标项:

Paste_Image.png

所有的构建目标由 BUILD-BUILDTYPE 的形式组成:
BUILD 对应 codename

这是官方提供的一份对照表:

Device Code name Build configuration
Pixel XL marlin aosp_marlin-userdebug
Pixel sailfish aosp_sailfish-userdebug
HiKey hikey hikey-userdebug
Nexus 6P angler aosp_angler-userdebug
Nexus 5X bullhead aosp_bullhead-userdebug
Nexus 6 shamu aosp_shamu-userdebug
Nexus Player fugu aosp_fugu-userdebug
Nexus 9 volantis (flounder) aosp_flounder-userdebug
Nexus 5 (GSM/LTE) hammerhead aosp_hammerhead-userdebug
Nexus 7 (Wi-Fi) razor (flo) aosp_flo-userdebug
Nexus 7 (Mobile) razorg (deb) aosp_deb-userdebug
Nexus 10 mantaray (manta) full_manta-userdebug
Nexus 4 occam (mako) full_mako-userdebug
Nexus 7 (Wi-Fi) nakasi (grouper) full_grouper-userdebug
Nexus 7 (Mobile) nakasig (tilapia) full_tilapia-userdebug
Galaxy Nexus (GSM/HSPA+) yakju (maguro) full_maguro-userdebug
Galaxy Nexus (Verizon) mysid (toro) aosp_toro-userdebug
Galaxy Nexus (Experimental) mysidspr (toroplus)
aosp_toroplus-userdebug
Motorola Xoom (U.S. Wi-Fi) wingray full_wingray-userdebug
Nexus S soju (crespo) full_crespo-userdebug
Nexus S 4G sojus (crespo4g) full_crespo4g-userdebug

BUILD_TYPE 对照表:

构建类型 用途
user 有限的访问权限,主要用于发布正式产品,没有 root 跟调试权限
userdebug 跟 user 类型差不多,但是多了 root 跟 debug 调试权限
eng 拥有各种调试工具的开发版设置,拥有 root 跟 debug 权限

如果作为开发使用的话,那我们一般都是选 -eng

这里我自己是准备在模拟器上运行编译的 image 镜像,并且我电脑的 cpu 是 intel x86 的,所以我选择了 6. aosp_x86-eng

我们可以根据自己的需要选择对应的 cpu 类型。

注意:我们知道,Android 官方的模拟器速度很慢,
Intel 特意提供了一个叫 HAXM 的虚拟硬件加速技术,全称为:Intel Hardware Accelerated Execution Manager.

只要你的 CPU 是 intel 的产品并且支持 VT(virtualization Technology)就可以使用 HAXM 技术将你的模拟器的速度提升至真机的水平。

目前 Intel 只提供了 windows 版和 MAC 版,Linux 系统只有通过安装 KVM 来达到这个效果。

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

安装 KVM

首先我们检测下自己的 cpu 是否支持 hardware virtualization(硬件虚拟化)

egrep -c '(vmx|svm)' /proc/cpuinfo

Paste_Image.png

输出的值如果是大于 0 的,则表明你的 cpu 支持

如果你使用的是 vmware 虚拟机安装的 linux,注意要设置下虚拟机的 cpu 来支持硬件虚拟化,先关闭虚拟机,然后右键虚拟机=》设置,选中 cpu,勾选虚拟化 Intel VT 项,这样就能支持 KVM 了。

Paste_Image.png

对于 Ubuntu 10.0.4 以上的版本,我们通过下面的指令安装 KVM 即可

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

如果在安装 KVM 的过程中有什么疑问的话,可以访问下面这个网址查找方法:https://help.ubuntu.com/community/KVM/Installation

这样,在编译完目标 intel cpu 的镜像文件后,我们运行模拟器就会自动进行加速了。

编译源码

编译源码

好了,一切就绪,我们可以开始编译我们的源码了,
我们在源码路径下通过 make -jN 指令来进行源码编译,这里的 N 一般建议设置为 cpu 核心线程数的 1-2 倍。

$ make -j4

一般情况下,我们等待源码编译完成就可以了,不过从 Android 7.0 N 开始,make 指令默认会开启 Jack 编译工具链来进行 Java 代码的编译,这个过程中可能会出现一些问题。

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

什么是 Jack 编译工具链 (The Jack toolchain)?

我们知道,我们平时编译 Android 代码的时候会先将 Java 代码编译成 .class 文件,最终再转换成 .dex 文件,如图:

Paste_Image.png

而 Jack 编译工具链则跳过了编译成 .class 文件这一过程,直接将 Java 代码编译成 .dex文件

Paste_Image.png

它的优势:

  • 完全开放源码
    源码均在 AOSP 中,合作伙伴可贡献源码
  • 加快编译源码
    Jack 提供特殊的配置,减少编译时间:pre-dexing ,增量编译和Jack编译服务器.
  • 支持代码压缩,混淆,重打包和 multidex
  • 不在使用额外单独的包,例如 ProGuard。

如果想进一步了解 Jack,可以访问Compiling with Jack(需翻墙),这里就不作太多解释了。

按照官方的说法 Jack 可以加快编译速度

但实际编译过程中,在我的设备上 Jack 会占用大量内存,并且拖慢编译速度,还会报错,而且官方文档上写的配置方式对 Jack 并不起作用。

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

Jack编译过程中遇到的问题
collect2: ld terminated with signal 9 [Killed]
make: *** [out/host/linux-x86/obj/EXECUTABLES/clang_intermediates/clang] 错误 1
make: *** 正在等待未完成的任务....
编译过程中报 Out of memory error 并中断编译

在执行 make 指令后,当第一次编译 Java 代码的时候,Jack 会被启用,这个时候经常会卡住,并且一段时间后报错 Out of memory error

按照官方的说法, Jack 并行编译的时候占用的资源太大导致内存溢出了

可以通过在 $HOME/.jack 文件中减小 SERVER_NB_COMPILE 的值来减小并行编译数量, SERVER_NB_COMPILE 的值默认为4

但实际情况是 Jack 没有在根路径下生成 .jack 文件,并且手动创建设置 SERVER_NB_COMPILE 后重启 Jack 服务也没有效果。

经测试发现 make 编译过程中当 Jack 第一次被启用时会在 home 根路径下生成 .jack-server 目录

Paste_Image.png

可以通过修改该目录中 config.properties 文件里的.jack.server.max-service值来设置并发线程数。

Paste_Image.png

同时,你也可以设置增加 Jack 的内存容量来解决这个问题,指令如下

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"

然后进入到输出路径的 bin 目录下:

cd /home/cjpx00008/aosp/out/host/linux-x86/bin

执行下面的指令重启 Jack 服务

./jack-admin stop-server

./jack-admin start-server

我改了 service 大小,同时增加了内存,后来编译的过程中没有发生其他问题。

或者

本文由金沙澳门官网发布于医学科学,转载请注明出处:Ubuntu下Android源码编译,0系统源码下载

关键词: