linux环境下编译安卓源码,是每个Android开发者深入学习Android系统以及源码所要必须掌握的。接下来我会将详细介绍Android源码的编译过程。
编译环境搭建
安装Ubuntu系统
我使用的是Ubuntu15.10操作系统64位,12.1.1的VMare虚拟机,在虚拟机上创建新的虚拟机配置如下(主要的配置图):
选择操作系统选择对应的操作系统类别,根据自己安装的系统类别进行配置;
虚拟机信息配置虚拟机名称自定义;
位置表示创建虚拟机的存储位置(选择硬盘空间足够大的,因为接下来需要分配虚拟内存);
内存大小很重要,android5.X下载完整源码需要将近50G的大小,而且还不包括编译需要的内存大小(也将近50多G);
添加安装镜像文件配置安装的镜像文件,然后启动该虚拟机,简单配置一些信息,就会完成系统安装;
注意:根据Android Source中对于操作系统的要求:
Android 通常是在 GNU/Linux 或 Mac OS 操作系统中进行编译。您也可以使用虚拟机在不支持的系统(例如 Windows)中编译 Android。
-
GNU/Linux
Android 6.0 (Marshmallow) - AOSP master: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 (Intel/x86)
Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具
Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具
Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的开发者工具)
Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK
Android Source参考
可以访问Android Source,参考对应的配置要求和配置过程;
以下内容是Android Source中,对于编译环境的一些要求:
-
Java 开发套件 (JDK)
请注意,由于没有适用于 Ubuntu 14.04 的受支持 OpenJDK 8 程序包,因此您必须手动安装 Ubuntu 15.04 程序包。要查看具体说明,请参阅适用于 Ubuntu LTS 14.04 的 JDK。
AOSP 中 Android 的 master 分支:Ubuntu - OpenJDK 8;Mac OS - jdk 8u45 或更高版本
Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5 -
主要程序包
python.org 中提供的 Python 2.6 - 2.7
gnu.org 中提供的 GNU Make 3.81 - 3.82;对于 Android 3.2.x (Honeycomb) 及更低版本,则需要将 make 3.82 还原到较低版本,以避免出现编译错误
git-scm.com 中提供的 Git 1.7 或更高版本 -
设备二进制文件
下载预览、出厂映像、驱动程序、无线 (OTA) 更新和下列其他 Blob。如需更多详细信息,请参阅下载专有二进制文件。
预览二进制文件 (Blob) - 用于 AOSP master
分支开发
出厂映像 - 针对运行带标记的 AOSP 版本分支的受支持设备
硬件支持二进制文件 - 针对运行带标记的 AOSP 版本分支的设备
OTA 映像 - 用于通过无线方式手动更新 Nexus 设备
安装配置JDK
- 安装JDK
根据上面的java套件的要求,我们将安装OpenJdk7.首先更新系统程序,然后再执行安装OpenJdk7的安装命令
更新程序包
sudo apt-get update
安装OpenJdk7:
sudo apt-get install openjdk-7-jdk
- 配置JDK环境(这篇文章不需要配置,暂时不做配置)
安装编译的依赖包
sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip
sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
上面的执行命令中原本是有mingw32软件包的,但是实际安装过程却“无法定位mingw32”,接下来单独安装mingw32;
sudo gedit /etc/apt/sources.list
//在sources.list末尾添加,保存
deb http://us.archive.ubuntu.com/ubuntu trusty main universe
sudo apt-get update
sudo apt-get install mingw32
按照上面的操作就可以成功安装mingw32;
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
配置USB使用权限
在 GNU/Linux 系统中,尤其是在 Ubuntu 系统中,默认情况下普通用户无法直接使用 USB 设备。您需要对系统进行配置以允许使用此类设备。
建议您以 root 用户的身份在 /etc/udev/rules.d/51-android.rules
下创建一个文件。
为此,请运行以下命令来下载本网站附带的 51-android.txt 文件,对其进行修改以包含您的用户名,然后将其放到正确位置:
wget -S -O - http://source.android.com/source/51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
以上命令由于需要翻墙可能无法执行成功,但是可以在网上下载51-android.txt文件,然后配置到自己的服务器上然后替换命令上的url就可以正确执行;
这些新规则会在下次插入设备时生效。因此,您可能需要先拔下设备,然后再将其插到计算机上。
执行以下命令完成配置,使新改动的规则生效:
sudo udevadm control --reload-rules
安装repo
repo是GIT的管理工具,有效的实现单个项目下可以包含多个git子项目并且实现项目之间的依赖调用关系配置,而且repo封装了多个git的命令,进而实现创建分支,查看分支,删除分支等等;由于Android项目包含多个子项目工程,使用repo可以有效的实现AOSP的管理;所以下载Android源码需要安装repo,接下来我们来看看repo的安装过程。
首先,创建需要存放repo的文件夹,然后执行以下命令来cloen对应的项目:
git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
切换到新创建的目录下,我们会看到新增加的文件夹git-repo.git,接下来将文件夹git-repo.git下的repo文件复制到~/bin/repo到该文件:
cp git-repo.git/repo ~/bin/repo
给~/bin/repo这个文件授权为可执行文件
chmod a+x ~/bin/repo
修改~/bin/repo文件中的REPO_URL值
sudo vi ~/bin/repo
REPO_URL="https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/"
配置.bashrc
vi ~/.brashrc
添加内容:
export PATH=~/bin:$PATH
安装ccache
ccache是c/c++在编译过程中的缓存依赖包,通过设置ccache可以提高c/c++编译的效率;一般缓存设置的大小为50G;
sudo apt-get install ccache
source ~/.bashrc
配置缓存大小:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
至此,环境已经搭建完成。
下载源码
- 先初始化repo目录,
mkdir aosp
cd aosp
执行命令:
repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-5.0.2_r1
执行过程出现
SecureCRT
需要配置git config
git config --global user.name "your name"
git config --global user.email "your email"
- 同步代码
repo sync
编译源码
首先配置执行环境
cd aosp
. build/envsetup.sh
配置缓存:
cd aosp
prebuilts/misc/linux-x86/ccache/ccache -M 50G
选择编译目标包:
lauch
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. aosp_hammerhead-userdebug
8. aosp_mako-userdebug
9. mini_emulator_x86_64-userdebug
10. mini_emulator_mips-userdebug
11. m_e_arm-userdebug
12. mini_emulator_x86-userdebug
13. mini_emulator_arm64-userdebug
14. aosp_manta-userdebug
15. aosp_shamu-userdebug
16. aosp_tilapia-userdebug
17. full_fugu-userdebug
18. aosp_fugu-userdebug
19. aosp_grouper-userdebug
20. aosp_flo-userdebug
21. aosp_deb-userdebug
Which would you like? [aosp_arm-eng] 1
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0.2
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.2.0-42-generic-x86_64-with-Ubuntu-15.10-wily
HOST_BUILD_TYPE=release
BUILD_ID=LRX22G
OUT_DIR=out
============================================
其中1是通用型的,这个得根据自己的硬件环境来决定的。
执行编译命令
make -j4
1.make后面可以更参数:如你的机器时双核,每核双线程的话,使用make -j4,这样速度更快,但编译时使用的内存也更多
2.make失败或停止后,可以使用make -k 继续编译
模拟器测试
完成编译之后,查看源码以及编译生成的out文件夹大小
编译完成的默认输出文件out,接下来启动模拟器查看
cd aosp
emulator &
如果出现以下问题,即“未找到命令”
解决办法:
可将如下环境变量重新初始化一遍(也就是每次重新进入系统运行的时候,都需要初始化一遍),lunch后面的参数要与你编译的ROM选项一致。
. build/envsetup.sh
lunch aosp_arm-eng
aosp_arm-eng 上面编译是的选择,必须保持一致;
接下来继续执行启动模拟器命令:
emulator &
执行结果:
操作模拟器查看对应的Android版本信息是否和编译的版本一致(选择编译版本android_5.0.2_r):
编译过程的问题
1.由于源代码和javadoc中的类,方法,属性不一致,导致报错
解决办法,google 给了两个选择::
- 在你添加的API或者变量前面,增加javadoc 注释@hide。但是要注意的是,并不是简单写个@hide 或者 /@hide/ 就可以了,这些都是错误的javadoc注释格式,标准的javadoc都是这样的 /** */ 而且对于 format 变量 应该加上 { }。所以我们应该这样写 /** {@hide} */
- 你就是想要生成的javadoc里面出现这个方法或者变量,你必须输入:
make update-api
但是如果修改的是google没有开放出来的类,比如RIL,PhoneFactory,就不会出现这个问题,
实际上我并没有去修改源码,所以我估计可能是Android源码和javadoc存在一些差异导致的,所以我按照第二种方法去解决,执行完之后会在out/target/common/docs/doc-common-check 目录下创建文件current.txt和removed.txt,通过标记需要跳过的方法来实现编译通过;
2.clang++的问题
clang++: error: unable to execute command: Killed
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 3.5
Target: i386--linux-gnu
Thread model: posix
clang++: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.
clang++: note: diagnostic msg:
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/android_system_OsConstants-6e651d.cpp
clang++: note: diagnostic msg: /tmp/android_system_OsConstants-6e651d.sh
clang++: note: diagnostic msg:
host C: libbacktrace_libc++ <= system/core/libbacktrace/thread_utils.c
make: *** [out/host/linux-x86/obj32/SHARED_LIBRARIES/libjavacore_intermediates/luni/src/main/native/android_system_OsConstants.o] 错误 254
make: *** 正在等待未完成的任务....
make failed to build some targets (26:09 (mm:ss))
- 原因:
这是swap区不够大的原因。导致clang++ kernel opps - 解决方法:
请加大分区:
sudo fallocate -l 6G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
开机自动挂载swap:
使用 vi 或 nano 在 /etc/fstab 文件底部添加如下内容:
/swapfile none swap sw 0 0
总结
至此,进过三到四天的白天黑夜,我们的整个Android5.0.2_r版本的源码就全部编译完成。我们也可以尝试连接真机设备进行刷机烧录操作,同时也可以使用源码进行frameworks层的开发,可以针对frameworks模块单独编译烧录,实现framework自定义开发。针对真机烧录和framework层的开发,后续将跟进。这篇文章主要是将整个android源码编译过程详情展示,亲身体验搭建环境和编译过程,参看网上的资料整理出现来的,下面会将参考的博客一一列出,所以是站在巨人肩上实现的,欢迎大家反馈以及指正批评
参考资料:
网友评论