一、问题
在Android10.0源码编译时,编译到99%提示报错。报错的原因是需要更新一下api,首先执行 make api-stubs-docs-update-current-api
,然后再去执行make去编译才能通过。
这样编译出的系统有问题,虽然能够正常烧录,但是用OTA升级包升级的时候会报错。
二、系统配置
CPU:AMD R9 5950X 16核32线程
内存:32GB
硬盘:2.5TB SSD + 4TB HDD
系统:Ubuntu18.04LTS
三、问题原因
在编译Android10.0时,用32个线程去编译,即make -j32。在编译到最后通过系统的监视器发现,内存已经不够用。怀疑是内存不足导致的编译问题。
通过在一台1TB内存的服务器上测试编译,开启相同的线程,发现期间没有报执行 make api-stubs-docs-update-current-api
的错误,一次性编译通过,因此基本上可以确定内存不足的问题。
四、解决方法
1. 思路一,降低编译线程
经测试,将服务器的编译线程数设置为内核数可以一次编译通过,即make -j16。整个系统编译耗时35分钟左右。
2. 思路二,设置swap交换分区
经测试,为系统添加8G的交换分区后,make -j32可以一次性编译通过。整个系统编译耗时30分钟左右。
步骤如下:
首先查看swap分区大小。
# 执行以下命令查看交换分区大小,默认2GB
free -m
可以看到内存使用情况,其中swap分区为2GB。
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 32079 1000 234 48 30844 30577
交换: 2047 695 1379
设置交换分区
# 切换root用户
sudo su
# 创建交换分区的文件为8GB
dd if=/dev/zero of=/home/swapfile bs=1M count=8192
# 设置交换分区文件,建立swap的文件系统
mkswap /home/swapfile
# 启用swap文件
swapon /home/swapfile
设置完成后,需要在 /etc/fstab中添加
# 开机挂载交换分区
/home/swapfile swap swap defaults 0 0
重启系统,再次执行free -m查看,swap分区已设置为2+8=10GB。
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 32079 1000 234 48 30844 30577
交换: 10239 695 9544
五、总结
编译源码遇到 make api-stubs-docs-update-current-api
错误,可以先降低编译线程或者添加swap分区试试。