安卓15/aosp15/lineage21使用brunch编译老是报错OOM内存不足

Ubuntu下小米6 LineageOS源码编译与刷机实战攻略 安卓系统的开放与开源特性,使其成为深度定制与二次开发的首选平台。AOSP作为底层系统框架,衍生出众多第三方ROM分支,其中LineageOS以其活跃的维护和极高的可扩展性,成为开发者与发烧友定制系统的热门选择。源码编译的核心原理,是将上游代码、内核、设备驱动及闭源二进制文件,通过交叉编译工具链组合为可直接刷入设备的系统镜像。这一过程的技术价值在于,既能获得干净无广告的原生体验,又可按需修改系统逻辑,更是深入理解安卓系统架构与构建体系的绝佳途径。在实际场景中,基于Ubuntu环境为特定机型打造专属ROM,是L 阅读详情
AI摘要

在编译新版本aosp15对应的lineage版本时,使用brunch编译常出现OOM内存不足问题。解决方法有:增加内存条、增加swap虚拟内存、减少编译线程。减少编译线程可采用两种方法,一是用breakfast、make、brunch分步编译;二是修改brunch函数指定线程数。

背景:

在编译新版本的aosp15对应的lineage版本时候发现,经常在brunch gemini(手机目标名字),会出现无故退出,或者terminal闪退的情况。
通过dmesg查看日志可以看到如下的报错:

[393958.626463] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/user@1000.service,task=Isolated Web Co,pid=695778,uid=1000
[393958.626505] Out of memory: Killed process 695778 (Isolated Web Co) total-vm:3728956kB, anon-rss:474468kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:4628kB oom_score_adj:167

即使用内存过多,导致oom了。那么针对上面的出现oom问题到底应该如何解决呢?

解决方法:

1、物理解决方法,直接增加内存条,把内存变成64G,这种方式可能最简单啥也不需要改变,不过很多同学可能也有条件限制不一定可以,比如内存插槽不够,或者是内存条贵。
在这里插入图片描述

2、增加swap虚拟内存,这种方法也是可以的,但是也需要消耗相关的硬盘空间等,需要重新扩展swap

3、不增加任何物理和swap虚拟内存,减少编译的线程

大部分同学都可能觉得最方便简单就是第3种方法,但是lineage os编译一般采用是brunch 命令,这个命令正常是不可以和make命令一样自由指定相关的线程数量,如果指定会导致无法编译报错如下:

test@test:~/disk_2T/aosp15_xiaomi$ brunch -j 8 gemini
In file included from build/make/core/config.mk:394:
In file included from build/make/core/envsetup.mk:351:
build/make/core/product_config.mk:226: error: Cannot locate config makefile for product "lineage_".
15:59:26 dumpvars failed with: exit status 1
Device  not found. Attempting to retrieve device repository from LineageOS Github (http://github.com/LineageOS).
Repository for  not found in the LineageOS Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml.
In file included from build/make/core/config.mk:394:
In file included from build/make/core/envsetup.mk:351:
build/make/core/product_config.mk:226: error: Cannot locate config makefile for product "lineage_".
15:59:30 dumpvars failed with: exit status 1
In file included from build/make/core/config.mk:394:
In file included from build/make/core/envsetup.mk:351:
build/make/core/product_config.mk:226: error: Cannot locate config makefile for product "lineage_".
15:59:32 dumpvars failed with: exit status 1

** Don't have a product spec for: 'lineage_'
** Do you have the right repo manifest?

No such item in brunch menu. Try 'breakfast'

那么到底该怎么在编译lineage os减少编译线程呢?
方法1
原理:因为breakfast,brunch其实属于lineage os自定义的函数帮助我们包装了一些操作而已,本身aosp是没有的,lineage os本质还是基于aosp的,所以自然aosp的所有编译命令也可以正常使用。基于这个背景那么就可以采用如下几个步骤:

步骤1:breakfast gemini
步骤2:make -j n //这里的n就是线程数量
因为make只是make了相关的img文件,正常如果模拟器的话make就结束了,但img文件不是我们实体机打包的zip文件,所以要做出对应zip文件还是需要再使用brunch命令
步骤3:brunch gemini
因为真正耗费内存时候都是在make img文件时候,make img都成功后只剩下打包工作了就完全可以交给brunch来做。

当然上面3个命令也可以封装写入一个脚本一起执行哈。

方法2
原理:因为brunch本质只是个shell脚本的函数,所以完全可以考虑到shell文件中修改这个函数,从而在函数中指定编译的线程数量
看看brunch的函数源码:

注意brunch属于非aosp自带的函数,所以不在build/envsetup.sh文件中,一般在vendor路径的envsetup.sh有定义:
定义路径:vendor/lineage/build/envsetup.sh

先看看brunch方法


function brunch()
{
    breakfast $*
    if [ $? -eq 0 ]; then
        mka bacon
    else
        echo "No such item in brunch menu. Try 'breakfast'"
        return 1
    fi
    return $?
}

可以看出来最后调用也是调用 mka bacon,注意 mka也是一个定义函数,bacon代表一个目标叫做培根,大家就理解为升级包的目标吧
那么看看mka方法:

function mka() {
    m "$@"
}

这里可以看到mka实际就是调用了m命令,这里m命令我们还是比较熟悉,m命令完全可以指定线程进行编译,所以修改如下:

function mka() {
    m  -j 4 "$@"
}

变成指定4线程进行brunch
然后在回到更目录一定要重新进行env操作,否则不生效

. build/envsetup.sh
brunch gemini

上面执行完就可以发现已经变成4线程编译了。

玩转Android10源码开发定制(16)LineageOS中编译user模式的系统 玩转Android10源码开发定制(16)LineageOS中编译user模式的系统 一、安卓系统编译选项简介 android编译的时候可以选择编译选项 eng、user 和 userdebug。 1.eng编译选项 (1). 系统编译的时候安装标签LOCAL_MODULE_TAGS为 user、debug、eng 的模块 (2). 设定属性 ro.secure=0,关闭安全检查功能 (3). 设定属性 ro.debuggable=1,启用应用调试功能 (4). 默认打开 adb 功能,adb拥有root权 阅读详情

相关推荐

Android15源码编译问题处理

树莓派5 Raspberry Pi 5 Android15源码编译错误,因为内存不足导致的处理方法。

阿xin*的嵌入式AI 855

Android编译系统分析之几个关键点(一)

已开通新的博客,后续文字都会发到新博客 https://www.0xforee.top Android 编译系统解析系列文档 解析lunch的执行过程以及make执行过程中include文件的顺序 Android编译系统分析之lunch分析 Android编译系统分析之make分析 关注一些make执行过程中的几个关键点 Android编译系统分析之几个关键点(一) Android编译系统分析...

beijing2008lm的专栏 2747

iTunes登录协议全解析:从抓包到加密参数生成(含HTTPDebugger避坑指南)

本文深度解析iTunes登录协议,提供从环境搭建、绕过反调试机制到捕获网络流量的完整实战指南。重点剖析了如何利用HTTPDebugger等工具进行抓包,并详细解读了核心加密参数X-Apple-ActionSignature的生成逻辑,为网络安全研究员和协议分析工程师提供了一份详尽的逆向分析与协议复现教程。

weixin_28314575的博客 869

error: Can not locate config makefile for product “xx“.

这个问题不一定属于是你的问题, 说下我发生问题的原因,lunch xx 的时候出现的问题, 就是好奇了为啥呢,xx为项目的编号这个是同事发给我的,最后又问题其他的同事, xx 选错了,我选的那一个配置文件里面没有配置。 ...

小牧在一直在学习,在前进的道路上大家一起学习,进步。 3809

如何用SPSS做logistic回归

详细到只有作者本人能看懂的SPSS逻辑回归育儿经

qq_44794961的博客 2万+

VirtualBox虚拟机上ubuntu系统安装问题记:显示画面太小、启动就异常退出等

报错:Failed to load R0 module D:/VMMR0.r0: The path is not clean of leading double slashes: ‘D:/VMMR0.r0’ (VERR_SUPLIB_PATH_NOT_CLEAN).解决方法特别简单,就是安装VIrtualBox的时候不要安装在CDE等盘根目录下。首先VirtualBox的下载安装过程是比较简单的,此处就不赘述了。然后E盘下新建个目录,安装到这个目录下就可解决。

qq_42595610的博客 2826

Android编译系统环境初始化过程分析

Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就是指定编译的类型和目标设备的型号。Android的编译类型主要有eng、userdebug和user三种,而支持的目标设备型号则是不确定的,它们由当前的源码配置情况所决定。为了确定源码支持的所有目标设备型号,Android编译系统在初始化的过程中,需要在特定的目录中加载特定的配置文件。接下来本文就对上述的初始化过程进行详细分析...

xiaoheliushuiya 483

SAP 行业扫盲系列之一:SAP 从业者的分类

本文简单介绍了 SAP 从业者的分类,限于笔者狭隘的视角,可能存在遗漏或者不恰当的地方,希望大家在评论区指出。 那些在知乎咨询上向我提问关于进入 SAP 行业建议的朋友们,也请大家提问时注明自己想具体从事 SAP 行业哪一类的工作,这样才能得到更让你们满意的回复。感谢阅读。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1589

解决一加9编译LineageOS源码breakfast时Cannot locate config makefile for product lineage_lemonade报错问题

本文记录了在编译LineageOS时找不到设备配置文件错误的解决方法。主要由于官方未默认提供OnePlus 9(lemonade)设备树文件,需手动从GitHub拉取相关源码:1)克隆android_device_oneplus_lemonade到device/oneplus目录;2)通过lineage.dependencies文件递归获取依赖项,包括sm8350公共设备树、oplus硬件驱动和内核源码;3)按目录结构要求放置各组件。文末作者表示因害怕而未做总结。

flyincat511的博客 1480

【实验必备】对AffectNet数据集进行人脸对齐的小Demo

本文首先简单介绍了AffectNet数据集,及人脸关键点等背景知识,接着Po出了人脸对齐的代码及效果展示。注:本文代码参考自FG2021的Emotion-GCN的开源代码,具有一定的可靠性,欢迎大家学习!

信小海 2670

全功能爬虫框架:Botasaurus 的详细使用(现代化、反检测、高并发的智能爬虫框架)

Botasaurus是一个基于 Python 的全栈式智能数据采集框架。它深度融合了以下关键技术: 无头浏览器自动化(Headless Browser Automation):基于 Playwright 或 Puppeteer,支持 Chromium、Firefox、WebKit; 高级反检测引擎(Anti-Detection Engine):自动绕过 WebDriver、Canvas、AudioContext 等 50+ 种指纹检测; 声明式任务模型(Declarative Task Model):用装

数据知道的博客 4371

Android N在lunch时出错

Android N在lunch时出错的解决方法在lunch的时候出现如下错误:build/core/config.mk:635: COMMON_GLOBAL_C(PP)FLAGS changed build/core/config.mk:639: *** bailing...。 停止。** Don't have a product spec for: 'xxx' ** Do you have the

ctwillson的博客 1378

Java使用POI生成柱状图导出到word文档(柱状图)

本篇文章主要介绍,如何使用Apache POI组件生成柱状图导出到word文档中,具体步骤看下文。 一、实现效果 Java使用POI技术生成柱状图导出到word文档中,最终生成的柱状图如下所示: 二、环境准备 编程语言:Java 第三方依赖:Apache POI Apache POI依赖代码如下所示: <dependencies> <dependency> <groupId>org.apache.poi</groupId.

✅ Java 开发工程师 7371

编译lineageos/aosp时总是内存不足

[ 96% 370/385] ----- Making recovery image ------ 这时出现java.lang.OutOfMemoryError 然后ninja就挂了 我一看swap还有10g没用 于是我照着网上的方法在prebuilts/sdk/tools/jack-admin里修改了JACK_SERVER_COMMAND变量(添加-Xmx6g -Xms4g),然后重启jack server,结果仍然报错 之后经过一番探索,发现了https://blog.youkuaiyun.com/ly199108

qq_38242030的博客 1325

【立创EDA-PCB设计基础】4.模块化布局

本文对本专栏绘制的原理图进行模块化布局,首先进行预布局(将每个模块放一起),然后进行精细化布局(按照原理图来精细化布局)。

嵌入式阿齐Archie 3万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[Android] build 流程

原文地址:http://forum.xda-developers.com/showthread.php?t=2751407 翻译地址: 翻译者:Younix 介绍AOSP 相当复杂,也很难找到一个方法去更好地了解它。我准备尝试一种务实的方法来了解它它,分析研究一下编译的过程(build process)。 在你真正的准备去学习 Android 之前,我推荐大家先读一读我的这份指南。

Younix凌乱的草稿本 2267

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

linux进程被杀 看日志方法

sudo dmesg | tail -7 oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0-1,global_oom,task_memcg=/user.slice,task=python3,pid=75788,uid=1002 [1274667.460252] Out of memory: Killed process 75788 (python3) total-vm:47140240kB, anon-rs

Axiaotangshuju的博客 1902

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

运行的程序总是莫名被 Killed

运行的程序总是莫名被 Killed说明问题描述解决方案 说明 本博客用于记录本人实习期间,在Linux环境下训练模型时,程序莫名中断的解决方案。 问题描述 错误信息 最近在Linux服务器上训练模型时,程序总是跑着跑着突然被中断掉,提示信息只有: xxx killed yyy,其中xxx是一个进程号,yyy是我的程序运行指令。 错误分析 根据提示信息分析原因,应该是使用 kill 命令把进程杀掉了,这就有两个可能:一个是人为的,一个是非人为的。这里排除了人为的,在导师的帮助下,猜测可能是系统行为,通

ID_AF12的博客 6035

为什么安卓aosp15打包system.img中无法包含没有在PRODUCT_PACKAGES定义的目标--学员作业

简单说就是为了方便,只会make xxx目标,,一般都会在system/bin目录或者system/app目录有对应程序,然后触发一下系统打包system.img,emulator启动后就可以在设备上看到编译的目标。但是经常我们有时候为了方便,自己写的一些简单的测试native,apk,可能只会进行的Module进行编译,不会把Moudle加入到PRODUCT_PACKAGES进行预制。接下来要触发系统打包system.img,一般这里采用touch一个系统一定会编译的cpp文件,然后进行make。

learnframework的博客 584

聊一聊linux中的cgroup

聊一聊linux中的cgroup 最近由于工作原因接触了docker,也就研究一下它的原理,主要看了阿里出的<<自己动手写docker>>,感觉蛮有意思,姑且记录一下。docker可以算是当前非常火热的技术了。我们知道docker基于Namespce和Cgroups,其中 Namespace主要用于隔离资源 Cgroups用来提供对一组进程以及将来子进程的资源限制 Cg...

readlnh的博客 585

ubuntu24 + android14 + lineage21源码编译

ubuntu24 + android14源码编译,一次成功,无报错

m0_58206963的博客 466

Postgresql在ubuntu 22.04上遭遇OOM的处理方法

分析:物理32GB的情况下,OOM时捕获的postgresql最大所需内存居然达total-vm:37766764kB,检查发现postgresql数据库级别的内存参数设置都是合理的,并且postgresql的被OOM级别很低值为-900(-1000的话就不会被内核OOM)。SHR:SHR是share(共享)的缩写,表示进程占用的共享内存大小,共享内存就是被多个进程所共享的内存,比如动态库libc.so占用的内存就是共享内存,因为这个共享内存可能被很多不同会话使用,但是这些会话都会去调用libc.so。

lusklusklusk的博客 2240
上一篇: 安卓面试题:第三方App如何ANR监听之SIGQUIT信号方案
下一篇: aosp15的audio hal的相关库情况介绍
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值