很久之前就想要编译Android源码,这次仔细研究了一下,遇到了很多的坑也学到了很多东西,这里做一些记录,方便之后的编译,同事在遇到新的问题的时候会不定时在此篇文章中更新。
Mac下载编译踩坑
在用Ubuntu编译Android源码之前,原本是准备使用Mac试试的,结果摔的很惨。
不要用高版本的MAC、XCODE编译低版本的ANDROID源码!!!
如果不是有很多时间去浪费,或者专门去研究Mac编译Android源码,否则不建议使用高版本MacOS系统+XcodeSDK去编译低版本源码,这里并不是说无法编译,而是说会遇到数不清的问题,最好是找网上其他人编译成功的版本去尝试。本人准备有时间可以再次去挑战一下。成功之后可以在此补充。
编译环境
Ubuntu16.04
Android 6.0.1_r1
环境搭建
这里如何下载安装Ubuntu虚拟机就不在一一阐述了,本次测试是在Mac中安装VMware Fusion 12然后安装Ubuntu16.04虚拟机中进行。
准备一个好用的梯子
网上很多文章在下载源码过程中建议使用清华源之类的国内源下载,我尝试过体验很差,下载需要很长时间不说,很多文件一次还下载不下来,换成官方源,科学上网之后很快便将源码下载下来了,不会有其他问题。
虚拟机空间一定要分配的足够大
Android源码下载编译所需的物理内存是很大的,300G是个比较稳妥的大小,建议有足够的空间的朋友可以考虑进行扩容到此大小。
VMware Fusion12如何扩容如下:
https://blog.csdn.net/zsx1314lovezyf/article/details/105445554
源码下载
下载git
Google采用Git对AOSP项目进行多仓库管理,所以需要先安装git
sudo apt-get install git
git config --global user.email “xxxxxx@qq.com”
git config --global user.name “xxxxxx”
下载repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
新建工作目录
mkdir Android_source
cd Android_source
初始化仓库
repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r1
如果没有梯子的话,就使用国内镜像
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-6.0.1_r62
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
接下来同步源码树
repo sync
漫长的等待,下载过程中出现问题一般都是因为没有使用科学上网或者网速的问题,余额不足请充值!!!
删除.repo
下载完源码后,会发现代码有50多G 其中有个隐藏文件夹.repo 他自己就有40多G ,这个文件夹只跟代码同步有关,并不影响编译,果断删除,删除后源码只有7G ,可以备份下源码
编译环境配置
安装依赖
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib \
tofrodos python-markdown libxml2-utils xsltproc \
zlib1g-dev:i386 dpkg-dev libsdl1.2-dev libesd0-dev \
git-core gnupg zip curl zlib1g-dev gcc-multilib \
libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev \
libx11-dev lib32z-dev ccache u3nzip m4
安装 openJDK7
Ubuntu16.04没有open JDK7的源,增加个仓库源
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
安装后环境变量已经配置好,java -version查看,上述方法是网络上出现最多的方法,但是我自己尝试的失败的,如果仍然失败,可以通过直接下载其他人下载好的安装包,然后解压文件
sudo tar -zxvf java-7-openjdk-amd64.tar.gz -C /usr/lib/jvm/
设置环境变量,修改profile文件
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
更新profile文件 source /etc/profile,之后通过java -version查看版本号。
编译
下载设备驱动
因为源码最终编译完需要跑在真实设备上,因此除了使用 AOSP 源码编译出可以在特定设备中运行的系统镜像,还需要在设备驱动下载对应设备的驱动。
可以通过 printconfig 命令查看本地源码的配置,对应其中BUILD_ID然后下载对应版本的硬件设备驱动。
下载完成后,将文件解压得到两个脚本,放到源码根目录下,运行脚本,会有很长的协议,在命令模式下输入 q 即可跳到最后,输入 “I ACCEPT” 确认协议, 二进制文件将会在源码根目录下新建 /vender 文件存放二进制文件及其对应的 Makefile
开始编译
在源码根目录下:
make clobber
source build/envsetup.sh
通过lunch选择编译目标,这里编译aosp_hammerhead-userdebug,选择19
lunch
开始编译
make -j8
刷机
编译成功之后连接bootloader
adb reboot bootloader
刷入镜像
fastboot -w flashall
问题记录及解决方案
clang问题
编译时出现clang: error: linker command failed with exit code 1 (use -v to see invocation)
修改 android_source/art/build/Android.common_build.mk 文件,定位到75行,将下面的代码:
ifneq ($(WITHOUT_HOST_CLANG),true)
改为:
ifeq ($(WITHOUT_HOST_CLANG),false)
open-jdk7问题
open-jdk在安装好之后,java&javac无法运行,显示无权限,找到安装位置赋予权限,在编译过程中仍然提示只支持openjdk7.x,修改envsetup.sh文件
sudo gedit build/envsetup.sh
刚才解压的jdk路径粘贴到JAVA_HOME 变量中 ,修改main.mk文件
sudo gedit build/core/main.mk
注释掉第 171 行的终止命令:
$(error stop)
进入bootloader之后无法连接设备
https://github.com/snowdream/51-android
参考链接
https://blog.csdn.net/ynshi57/article/details/110728754
https://blog.csdn.net/fuchaosz/article/details/51487585
https://daimajiaoliu.com/daima/479c5637b1003fc
https://www.dazhuanlan.com/2019/12/26/5e04348c59a63/
https://blog.csdn.net/qq_30123335/article/details/115488942