Ubuntu 下 8G内存编译 Android 系统

背景

近期入手了一块 RK3568 的嵌入式开发板,与该开发板配合的编译系统是 Ubuntu 20.4 虚拟机。该虚拟机分配了 4 个CPU核,8G 内存,占用了我系统的一半物理资源。

在尝试编译该开发板厂商提供的 Android 源码时,当编译到 productimage、systemimage 时,java 编译部分报 OOM,导致编译失败。

尝试的解决方案

鉴于 Ubuntu 默认 swap 分区只有 2G,因此尝试调整 swap 分区到 16G、32G,OOM 现象依然存在。后厂商技术人员提示说 Android 编译时好像不使用 swap(暂未去证实)。

解决方案

通过谷哥哥检索到方案,说使用 zram,因此做了尝试,最终编译成功并刷入嵌入式主板。
以下过程为:

  1. 安装 zram-config
sudo apt install zram-config
  1. 禁用原swap(如果有)
sudo nano /etc/fstab
# or
sudo vi /etc/fstab
# or
sudo vim /etc/fstab

编辑上述文件,在 swap 磁盘(一般可能为 /swapfile)最前面添加 # 以注释掉对应列。

这里没测试直接使用 sudo swapoff 是否可以

  1. 重启计算机

  2. 查看 zram 配置

zramctl

可查看配置,显示类似如图:

默认情况下,zram 默认初始化 zram 为电脑内存的 1/2

  1. 调整 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 大小

  1. 调整 soong 编译文件

直接截图了,更清晰

行数不一定一样,请自行根据实际情况定位。

编辑文件:vim build/soong/java/droidstubs.go

Flag(config.JavacVmFlags). 后换行追加 Flag("-J-Xmx6114m").

额外提醒:

  1. 建议虚拟机放在 SSD 硬盘上
  2. android 源代码路径名称按照规范处理,不要使用非 ASCII 字符
  3. 编译过程比较漫长,需要足够的耐心等待
  4. Android 官方目前建议最小内存是 64G

当然还可能存在其他的解决方案,欢迎赐教

浅水习文一篇,还望海涵 :stuck_out_tongue:

再再补充下:是否适用于当前官方 AOSP 暂未测试,厂商附送的 Android 版本为 Android 12

参考

  1. 8GB_android-12_compilation-note
  2. droidstubs: now buildable on 8GB RAM Machines
  3. Meet hardware requirements

编译成品图:

16 个赞

技术贴来了 氛围起来了

22 个赞

mark,技术好贴

顶一个

不错不错,搬张小凳子学习了

7 个赞

不明觉厉啊。只能默默顶一个

厉害,思路活跃清晰

学一下

27 个赞

技术贴一定要顶一下

技术贴赶快学习起来

会用到Swap的,我们公司电脑最低配置都是i9-12900K,然后32G内存。在编译A14的时候就需要将Swap设置为最少64G不然编译就会报错的。

mark

技术贴,顶

From #dev:embedded to 开发调优