编译环境:
编译 Android 2.3.x 及以上版本的系统源码需要 64 位的系统运行环境来支持,而编译 2.3.x 以下的版本则需要 32 位的系统运行环境。磁盘空间至少150G,虚拟机内存至少分配8g
Android 版本与编译系统版本的对应关系
Linux:
Mac OS:
下载 repo 工具:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod +x ~/bin/repo
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
git 工具安装:
sudo apt-get install git
git config --global user.name "lqc123"
git config --global user.email "845338422@qq.com"
建立工作目录:
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
初始化仓库:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
指定版本
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.1_r1
同步镜像,j4 指定线程数量,线程数量=CPU核心数*2
repo sync -j4
安装jdk:
图3.jpg安装jdk 1.8
sudo apt-get install openjdk-8-jdk
环境配置
JAVA_HOME=/usr/lib/jdk1.8.0_101
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH
安装1.7
如果你要编译的是Android 5.x到android 6.0之间的系统版本,需要采用openjdk7. 但是在Ubuntu 15.04及之后的版本的在线安装库中只支持openjdk8和openjdk9的安装.
因此,如果你想要安装openjdk 7需要首先设置ppa:
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
然后再执行安装命令:
sudo apt-get install openjdk-7-jdk
不同版本切换
sudo update-alternative --config java
sudo update-alternative --config javac
环境变量
打开/etc/profile文件,配置OpenJDK:
sudo gedit /etc/profile
在末尾追加下面代码:
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
修改完/etc/profile文件需要重启才能生效,但在不重启的情况下,使用下面命令可以使当前bash环境生效:
source /etc/profile
修改源码:
修改源码/androidsource/art/build/Android.common_build.mk文件,定位到75行,将下面的代码
把true改成false
ifneq ($(WITHOUT_HOST_CLANG),true)
若不修改这里,编译源码的时候会出现错误,修改的目的是为了把CLANG这个编译选项关掉,不会影响源码编译。
安装依赖:
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 lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
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
开始编译:
在 .bashrc文件末尾添加:export USE_CCACHE = 1
echo export USE_CCACHE=1 >> ~/.bashrc
提高编译效率,设置编译器高速缓存:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
导入编译Android源码所需的环境变量和其它参数:
//source是点符号另一种写法,可以强制执行shell,无视权限,重新执行刚修改的初始化文件 如 。 bash_profile 等
source build/envsetup.sh
lunch命令选择目标
lunch 5
编译
make -j4
启动模拟器
emulator
模拟器运行加速:
检测是否支持hardware virtualization(硬件虚拟化),输出大于说明支持
egrep -c '(vmx|svm)' /proc/cpuinfo
如果是虚拟机安装勾选虚拟化Intel VT-x项
图4.png
安装
Cosmic (18.10) or later
$ sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
Lucid (10.04) or later
$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
Karmic (9.10) or earlier
$ sudo aptitude install kvm libvirt-bin ubuntu-vm-builder bridge-utils
打开模拟器:
导入编译Android源码所需的环境变量和其它参数:
source build/envsetup.sh
lunch命令选择目标,由于我编译的版本是aosp_x86-eng,所以选择5
lunch 5
打开模拟器
emulator
导入源码到AndroidStudio中:
编译idegen,idegen 工具会自动生成针对 Android 开发工具(Android Studio和Eclipse)的配置文件。
源码路径
developement/tools/idegen
初始化命令工具
source build/envsetup.sh
编译 idegen 模块,生成idegen.jar
mmm development/tools/idegen/
生成针对 Android 开发工具的配置文件
sudo ./development/tools/idegen/idegen.sh
在执行完上述指令后,会在源码路径下生成下面三个文件
android.ipr:工程相关的设置,比如编译器配置、入口,相关的libraries等。
android.iml:描述了modules,比如modules的路径,依赖关系等。
android.iws:包含了一些个人工作区的设置。
图5.png
注:<excludeFolder> 表示不需要加载的目录
模块编译:
除了通过make命令编译整个系统外,还可以通过下列命令进行分模块编译
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
mmm命令编译launch2:
mmm packages/apps/Launcher2/
图6.png
编译成功,生成文件路径如下
图7.png
aapt编译:
查看编译环境
. build/envsetup.sh
图8.png
进入appt目录,输入mm命令,开始编译
cd frameworks/base/tools/aapt
图9.png
图10.png
编译成功,生成目录
图11.png
常见问题
问题一:
error: Exited sync due to fetch errors #33
解决方法:
repo sync -j8 -f --force-sync//8=cpu核心数*2
问题二:
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 目录
可以通过修改该目录中 config.properties 文件里的.jack.server.max-service值来设置并发线程数。
图13.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
问题三
编译百分之一的时候报的错误,bison 没有安装。
解决方法:
sudo apt-get install bison
sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
问题四
You are attemping to build with the incorrect version.具体错误如下:
如果你认真看了构建环境的的要求,那么这个错误是可以避免的.当然,这个问题也很容易解决:安装openjdk 8,别忘了使用sudo update-alternative命令切换jdk版本.
问题五
Out of memory error.具体错误如下:
这个错误比较常见,尤其是在编译AOSP主线代码时,常常会因为JVM heap size太小而导致该错误.
此时有两种解决方法:
方法一:
在编译命令之前,修改prebuilts/sdk/tools/jack-admin文件,找到文件中的这一行:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后在该行添加-Xmx4096m,如:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后再执行
time make -8j
方法二:
在控制台执行以下命令:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
out/host/linux-x86/bin/jack-admin kill-server
out/host/linux-x86/bin/jack-admin start-server
图17.png
执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.(其实,你可以用方法一,而无须重新repo sync)
注意:在编译SDK的时候同样可能出现因jvm heap size太小而导致编译错误,一旦出现用以上任何一种方案都可以解决.
问题六
使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令
/out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7
通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)
如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.
问题七
Out of memory error.具体错误,该错误和第二条本质一样,尤其是你在进行编译Android 8.*版本时更容易遇到该问题,其表现如下:
或是 图19.png
无论表现是什么,但错误的本质还是Java heap space 。当然,其解决该问题的方式和之前的第二条解决方案一样内存值尽量设置大一些。
简单的来说一下具体步骤:打开prebuilts/sdk/tools/jack-admin文件,修改以下内容:
图20.png
参考
Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战
网友评论