背景
近期入手了一块 RK3568 的嵌入式开发板,与该开发板配合的编译系统是 Ubuntu 20.4 虚拟机。该虚拟机分配了 4 个CPU核,8G 内存,占用了我系统的一半物理资源。
在尝试编译该开发板厂商提供的 Android 源码时,当编译到 productimage、systemimage 时,java 编译部分报 OOM,导致编译失败。
尝试的解决方案
鉴于 Ubuntu 默认 swap 分区只有 2G,因此尝试调整 swap 分区到 16G、32G,OOM 现象依然存在。后厂商技术人员提示说 Android 编译时好像不使用 swap(暂未去证实)。
解决方案
通过谷哥哥检索到方案,说使用 zram,因此做了尝试,最终编译成功并刷入嵌入式主板。
以下过程为:
- 安装
zram-config
包
sudo apt install zram-config
- 禁用原swap(如果有)
sudo nano /etc/fstab
# or
sudo vi /etc/fstab
# or
sudo vim /etc/fstab
编辑上述文件,在 swap 磁盘(一般可能为 /swapfile
)最前面添加 #
以注释掉对应列。
这里没测试直接使用
sudo swapoff
是否可以
-
重启计算机
-
查看 zram 配置
zramctl
可查看配置,显示类似如图:
默认情况下,zram 默认初始化 zram 为电脑内存的 1/2
- 调整 ram 内存到需要大小
sudo vim /usr/bin/init-zram-swapping
# vim 可使用 nano 或 vi 代替或其他熟悉的编辑工具
找到 # Calculate memory to use for zram (1/2 of ram)
这一行下面的
mem=(((totalmem / 2 / {NRDEVICES}) * 1024))
进行适当修改。
比如修改为 16G
mem=$(((totalmem / 2 / ${NRDEVICES}) * 16384))
修改完成后需要重启计算机,重新初始化 zram 大小
- 调整 soong 编译文件
直接截图了,更清晰
行数不一定一样,请自行根据实际情况定位。
编辑文件:vim build/soong/java/droidstubs.go
在 Flag(config.JavacVmFlags).
后换行追加 Flag("-J-Xmx6114m").
额外提醒:
- 建议虚拟机放在 SSD 硬盘上
- android 源代码路径名称按照规范处理,不要使用非 ASCII 字符
- 编译过程比较漫长,需要足够的耐心等待
- Android 官方目前建议最小内存是 64G
当然还可能存在其他的解决方案,欢迎赐教
浅水习文一篇,还望海涵
再再补充下:是否适用于当前官方 AOSP 暂未测试,厂商附送的 Android 版本为 Android 12。
参考
- 8GB_android-12_compilation-note
- droidstubs: now buildable on 8GB RAM Machines
- Meet hardware requirements
编译成品图: