1.本次编译平台Ubuntu18.04。使用的虚拟机来完成的源码编译,本次编译的是android8.1版本。
2.虚拟机的虚拟硬盘最好在150g以上,我的虚拟中分配了268g内存,只安装了Android编译需要的库,编译完Android磁盘占用54%,
1.安装虚拟机Ubuntut虚拟机,为了方便查找编译过程中的资料,我选择了Ubuntu18.4的版本
ubuntu的下载地址是http://mirrors.163.com/ubuntu-releases/18.04/,使用VitralBox进行安装,具体的安装过程就不展示了。
安装完成之后需要设置用户名和邮箱(如果不设置,拉取repo的时候会拒绝)
git config --global user.name "xx"
git confit --global user.email "[email protected]"
git clone https://aosp.tuna.tsinghua.edu.cn/git-repo/
chmod a+x git-repo/repo
然后添加repo的目录(比如~/git-repo/repo)到path 环境变量。
export PATH=~/git-repo:$PATH
打开repo文件,把REPO_URL镜像地址设置成为清华镜像地址。
gedit ~/git-repo/repo
REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
首先新建一个目录用来存放Android的源码,这里在用户的目录下新建了一个android_src目录
mkdir android_src
进入android_src后,执行如下命令
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
ps:可能自带的python环境不可用,需要手动安装puthon,
等该命令执行结束之后就可以查看目前能够获得的分支了。
cd .repo/manifest.git/
git branch -a
这里我选择了android-8.1.0_r41分支。
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r41
repo sync
到这一步,需要时间比较久,我网速比差,断断续续用了一天半的时间,如果中途下载中断,就重复执行上述命令,一直到下载完成。
出现上述的log日志,就恭喜你,完成编译源码的一半了,
然后需要配置java8,这里需要使用openjdk
sudo apt-get install openjdk-8-jdk
sudo apt-get install openjdk-8-jre
注意配置完成之后,用java -version检查一下jdk版本,如果不是open-jdk,就需要切换程Open-jdk的版本。
接着是安装依赖的库
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
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
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 libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
ps:libesd0-dev可能会出现安装问题,百度搜 libesd0-dev就能找到解决方案。
最后开始执行
source build/envsetup.sh
lunch aosp_arm64-eng
这里的arm64 标识使用arm64 cpu设别,eng表示engineer版本。
最后的一步执行
make -j8;
其中j8表示开8个线程来参与编译源码,这个数字一般满足cup内核数*2,可以通过cat /proc/cpuinfo来查看相关的cpu信息。
编译完成后的样子是这样的
通常编译错误会是这样的
需要注意的一点是
出现端口冲突遇到的肯能性很大,jack-admin中配置的端口一般是8076和8077,
可以通过查看lsof -i查看端口是被占用,或者用netstat -ap | grep 8076
如果被占用,使用 kill -9 pid 来杀死相关进程,从而释放端口,
我这里使用的是修改端口为8070和8071
首先使用打开jack-admin
gedit android_src/prebutils/sdk/tools/jack-admin,
修改如下配置
然后修改~/.jack-server/confit.properties中对应的端口地址。
然后在修改.jack-settings文件中的端口地址。
这三者修改完成之后,如果还是报无法连上jack-server,可以执行下面两个操作。
1.检查上述三个位置文件是否一致。
2.检查端口是被占用,如果被占用,就杀死该进程。
通过上面的2个方法就可以彻底排除端占用问题。
Out of memory erro
这个问题我没有遇到,但是我也把相关的信息修改加进去了。
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
~/android_src/prebuilts/sdk/tools/jack-admin kill-server
~/android_src/prebuilts/sdk/tools/jack-admin start-server
sizeof (_nl_value_type_LC_TIME[0]))’ ???
执行
export LC_ALL=C
No Jack server running. Try ‘jack-admin start-server’
执行
jack-admin kill-server
jack-admin start-server
编译成功之后的展示
如果没有下面的那行build completed successfully, 接下来启动模拟器可能会失败,再次编译,完成之后就出了上图中的绿色字体。
然后执行 emulator命令,就开始启动模拟器了,启动会花费几分钟,耐心等待,
第一次运行emulator可以成功,后面报emulator找不到,需要设置环境变量
export PATH=$PATH:~/Android/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=~/Android/out/target/product/generic
source build/envsetup.sh
选择你的版本
lunch aosp_arm-eng
然后再执行emulator
参考文章
https://blog.csdn.net/m0_37302832/article/details/79278478
https://blog.csdn.net/Yoryky/article/details/81813717
https://blog.csdn.net/bible1/article/details/77848036