从0开始编译Android 7.1
Android源码需要在Linux环境下编译,由于平时使用windows,所以使用VMware虚拟机来安装一个Ubuntu专门用于编译Android。
安装的是 Ubuntu 18.04
版本,也有很多人说用16,但实际上18也能用,所以就用18了。
0x00 在虚拟机中安装Ubuntu
这一步非常简单,去官网下载一个18.04的镜像 18.04.5 Desktop 64.iso ,然后在虚拟机用加载光盘即可。
随后新建一个虚拟机,注意编译Android源码需要巨大的空间和内存,因此建议按如下配置:
加载Ubuntu官方镜像后,VMware会提示使用简单模式安装,但不要使用,很容易出现卡住的问题,所以在配置完成后不要点击启动虚拟机,而是先在设置中将两个包含 autoins
镜像的光驱和软驱先移除,这样一来就可以手动安装Ubuntu了。
启动后选择安装即可,也可以按F2将语言改为中文。大部分过程参照提示,就不再赘述了。值得注意的是去掉安装过程中更新的选项,否则会因为网络问题耗时极长。
安装完成后安装 vm-open-tools
以更方便的使用虚拟机,主要用于支持虚拟机和宿主机间拖拽,分辨率调整等;
sudo apt-get install vm-open-tools open-vm-tools-desktop
加大 swap 分区
由于虚拟机内存不够,为了避免编译失败,增加现swap分区大小,物理内存加虚拟内存至少需要 12~16GB 的空间。
#关闭swap分区
sudo swapoff -a
#将原有swapfile增大至8G
sudo dd if=/dev/zero of=/swapfile bs=1M count=8192
#设置swap分区文件
sudo mkswap /swapfile
#启用swap分区
sudo swapon /home/swapfile
0x01 下载源码
取决于你编译的是 AOSP
还是其他如 Firefly
等开发板的系统。
前者需要通过repo来同步代码,由于直接从google官方下载太过缓慢,建议使用国内镜像。过程可参考: 清华大学AOSP镜像使用帮助 。里面有详细的步骤说明,根据网络可能需要一整天来同步代码。
后者则一般都会提供打包好的源码,避免极其耗时的下载过程,可按开发板提供的步骤说明操作,但不论是哪一种都需要配置编译所需的各种依赖。
0x02 配置编译时所需要的依赖
切换到国内仓库,提升下载速度
可用源,自选其一http://mirrors.aliyun.com/ubuntu/
http://mirrors.163.com/ubuntu/
https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
#先备份原来的文件:
cp /etc/apt/sources.list /etc/apt/sources.list.bak
#然后将sources.list修改为如下内容:
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
完成后开始安装所需编译工具链
sudo apt-get update
#安装open jdk
sudo apt-get install openjdk-8-jre openjdk-8-jdk
#安装其余依赖
sudo apt-get install m4 g++multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev flex curl bison libxml2-utils
#安装python, Ubuntu自带的是3.x版本,还需要安装一个2.7的
sudo apt-get install python
配置环境变量
#全局文件路径 /etc/profile 需要root权限
#当前用户 ~./.bashrc
#可以改全局的,也可以改当前的,在文件中加入如下内容,JAVA_HOME按实际安装好的目录来配置,下为默认的安装目录,如果你的源码有指定的jdk版本则要进行修改
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
0x03 提前配置编译时容易错误所涉及的问题
-
增大
jack-server
虚拟机可用内存#修改源码目录下./prebuilds/sdk/tools/jack-admin文件 #找到 JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME" #在-cp前加入 -Xmx 配置其可用内存,建议4096m或8192m,即修改成如下 JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx8192m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
-
增大系统线程数上限(一般不需要)
sudo echo "kernel.pid_max=1000000" >> /etc/sysctl.conf sysctl -p
0x04 编译源码
在准备开始编译前,单独对编译使用的 Terminal
执行环境变量配置语句
export LC_ALL=C
然后执行运行环境设置脚本
source build/envsetup.sh
随后执行 lunch
按提示选择你的目标版本;
然后执行 make -j8
或 m
开始编译!
取决于性能一次编译可能需要数个小时,可以按照具体有多少核心来设置参数
[100% 18992/18992] Checking build with...ump_intermediates/jack.check.timestamp
#### make completed successfully (41:29 (mm:ss)) ####
#看到这个就是成功啦!
对于 AOSP
可以使用 qemu
用虚拟机跑你编译好的Android,对于开发板则可以直接刷入板卡!
jack.check.timestamp
make completed successfully (41:29 (mm:ss))
#看到这个就是成功啦!
对于 `AOSP` 可以使用 `qemu` 用虚拟机跑你编译好的Android,对于开发板则可以直接刷入板卡!