Android 源码编译步骤(Ubuntu 14.04+MacOS)
注:本文的Android源码树使用的是清华大学开源镜像,因为网速原因,并未使用Android官方源。
一、编译环境搭建
1、Ubuntu系统环境搭建
Google官方目前最低支持到Ubuntu 12,本次教程采用的是Ubuntu14.04 LTS
更换源为阿里源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo gedit /etc/apt/sources.list
替换为以下内容
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
保存,执行如下命令更新源,并安装git
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -y install git
执行如下命令设置git 的邮箱及用户名
git config --global user.email "youemail@xxx.xx"
git config --global user.name "xxxx"
开始安装必要的依赖包:
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
具体参考Android编译环境搭建指南
安装repo(repo为Android源码树的管理工具)
mkdir ~/bin
修改环境变量
vim ~/.bashrc
在最后添加如下,将刚才的目录加入到环境变量export PATH=~/bin:$PATH
,更新环境变量
source ~/.bashrc
下载repo工具
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
授予权限
chmod a+x ~/bin/repo
创建源码目录
mkdir android_source
cd android_source
参照前面的方法将export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
加入到环境变量
使用 repo 初始化
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
-b
之后的参数代表的Android的版本,具体参考AOSP版本
顺利的话1分钟左右,初始化完成。
开始同步源码树(大概需要7到8个小时,作者同步的是android-7.0.1_r23,最终同步的数据大概有110GB左右)
repo sync -j 4
-j
后面跟的是线程数,表示开几个线程来同步,教程中使用的是清华TUNA的镜像,他们官方建议是4,可参考清华大学开源软件镜像站AOSP
同步成功后可看到如下目录(作者的目录是已经编译过后的,因此可能会多出一两个子目录)
源码同步完成后即可进行编译
##2、MacOS系统环境搭建
在默认安装过程中,Mac OS 会在一个保留大小写但不区分大小写的文件系统中运行。Git 并不支持此类文件系统,而且此类文件系统会导致某些 Git 命令(例如 git status
)的行为出现异常。因此,我们建议您始终在区分大小写的文件系统中对 AOSP 源文件进行操作。使用下文中介绍的磁盘映像可以非常轻松地做到这一点。
有了适当的文件系统,在新型 Mac OS 环境中编译 master
分支就会变得非常简单。要编译较低版本的分支,则需要一些额外的工具和 SDK。
创建区分大小写的磁盘映像
您可以使用磁盘映像在现有的 Mac OS 环境中创建区分大小写的文件系统。要创建磁盘映像,请启动磁盘工具,然后选择“新建映像”。完成编译至少需要 25GB 空间;更大的空间能够更好地满足未来的需求。使用稀疏映像有助于节省空间,而且以后可以随着需求的增加进行扩展。请务必选择“Case sensitive, Journaled”存储卷格式。
您也可以通过 shell 使用以下命令创建磁盘映像:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
这将创建一个 .dmg
(也可能是 .dmg.sparseimage
)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。
如果您以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:
hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
对于存储在主目录下的名为 android.dmg
的磁盘映像,您可以向 ~/.bash_profile
中添加辅助函数:
-
要在执行
mountAndroid
时装载磁盘映像,请运行以下命令:mount the android file image function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
注意:如果系统创建的是
.dmg.sparseimage
文件,请将~/android.dmg
替换成~/android.dmg.sparseimage
。 -
要在执行
umountAndroid
时卸载磁盘映像,请运行以下命令:unmount the android file image function umountAndroid() { hdiutil detach /Volumes/android; }
装载 android
存储卷后,您将在其中开展所有工作。您可以像对待外接式存储盘一样将其弹出(卸载)。
安装 JDK
要查看在开发各种 Android 版本时要使用的 Java 版本,请参阅相关要求。
安装所需的程序包
-
使用以下命令安装 Xcode 命令行工具:
xcode-select --install
对于较低版本的 Mac OS(10.8 或更低版本),您需要通过 Apple 开发者网站安装 Xcode。如果您尚未注册成为 Apple 开发者,则需要创建一个 Apple ID 才能下载。
-
通过 macports.org 安装 MacPorts。
注意:请确保在路径中
/opt/local/bin
显示在/usr/bin
之前。否则,请将以下内容添加到~/.bash_profile
文件中:export PATH=/opt/local/bin:$PATH
注意:如果主目录中没有
.bash_profile
文件,请创建一个。 -
通过 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
将 make 3.82 还原到较低版本
在 Android 4.0.x (Ice Cream Sandwich) 及更低版本中,gmake 3.82 中存在一个会导致 Android 无法编译的错误。您可以按照以下步骤使用 MacPorts 来安装 3.81 版:
-
修改
/opt/local/etc/macports/sources.conf
,在 rsync 行上方添加下面这行内容:file:///Users/Shared/dports
然后创建该目录:
mkdir /Users/Shared/dports
-
在新的
dports
目录下,运行以下命令:svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
-
为新的本地存储库创建一个端口索引:
portindex /Users/Shared/dports
-
使用以下命令安装旧版 gmake:
sudo port install gmake @3.81
设置文件描述符数量上限
在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。
要提高此上限,请将下列行添加到 ~/.bash_profile
中:
set the number of open files to be 1024
ulimit -S -n 1024
优化编译环境(可选)
设置 ccache
您可以视需要指示编译过程使用 ccache 编译工具,ccache 是适用于 C 和 C++ 的编译器缓存,有助于提高编译速度。这对于编译服务器和其他高容量生产环境来说尤其有用。ccache 可用作用于加快重新编译速度的编译器缓存。如果您经常使用 make clean
,或者经常在不同的编译产品之间切换,则非常适合使用 ccache。
注意:如果您是在执行增量编译(例如个人开发者而非编译服务器),ccache 可能会让您为缓存未命中埋单,从而减慢您的编译速度。
要使用 ccache,请在源代码树的根目录下执行以下命令:
export USE_CCACHE=1
建议的缓存大小为 50G 到 100G。
请将以下内容添加到 .bashrc
(或等同文件)中:
export USE_CCACHE=1
默认情况下,缓存将存储在 ~/.ccache
下。如果主目录位于 NFS 或一些其他的非本地文件系统中,您还需要在 .bashrc
文件中指定目录。
在 Mac OS 中,您应将 linux-x86
替换成 darwin-x86
:
prebuilts/misc/darwin-x86/ccache/ccache -M 50G
在编译 Ice Cream Sandwich (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
安装Repo工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
创建源码目录
mkdir android_source
cd android_source
参照前面的方法将export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
加入到环境变量
使用 repo 初始化
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
-b
之后的参数代表的Android的版本,具体参考AOSP版本
顺利的话1分钟左右,初始化完成。
开始同步源码树(大概需要7到8个小时,作者同步的是android-7.0.1_r23,最终同步的数据大概有110GB左右)
repo sync -j 4
-j
后面跟的是线程数,表示开几个线程来同步,教程中使用的是清华TUNA的镜像,他们官方建议是4,可参考清华大学开源软件镜像站AOSP
同步成功后可看到如下目录(作者的目录是已经编译过后的,因此可能会多出一两个子目录)
源码同步完成后即可进行下一步
二、编译源码
注:Ubuntu 14.04 没有官方源的JDK1.8,需单独安装,具体请百度。
进入到源码目录
执行
source build/envsetup.sh
输出如下
继续执行以下命令,启动编译环境
lunch
输出如下
选择2,arm64就不解释了,eng代表开发版,具有root权限。
输出如下
现在便可以正式开始编译了,初次编译需要进行全量编译,大概需要6-7个小时(编译环境:Ubuntu14.04 LTS 8GB 内存 120GB储存,双核处理器),执行如下命令:
make -j8
-j
参数表示线程数,我的机器是双核4线程,因此设置的是8,实际操作根据机器配置填写
编译成功后显示如下,后面的编译时间(此图并非全量编译的结果,只做示例,实际全量编译时间较长)
编译完成后执行
emulator
运行模拟器,模拟器默认使用的是编译好的镜像,路径为/root/android_source/aosp/out/target/product/
前面选的是arm64
因此,镜像文件在该目录下的generic_arm64
文件夹内。
以上,仅供参考,如有错误,请赐教
参考文档:
https://blog.csdn.net/hunter___/article/details/80972878
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
https://source.android.google.cn/source/build-numbers.html#source-code-tags-and-builds
Ubuntu 14 Repo 工具安装及源码自动部署脚本(仅限root用户运行)