尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AOSP编译环境搭建与优化实战指南
1. AOSP编译环境搭建的血泪史第一次接触AOSP编译是在2016年当时为了给老旧的Nexus 5定制ROM我在Ubuntu 14.04上折腾了整整三天。现在回想起来那些看似简单的环境准备步骤里藏着无数暗坑。先说最基础的——磁盘空间官方文档说至少150GB但实际编译完Android 13的完整镜像后我的500GB SSD直接被吃掉370GB。这还没算上ccache缓存如果你打算长期做编译开发建议直接上1TB NVMe。重要提示永远不要在Windows的WSL里编译AOSP我见过至少五个同事因为文件系统性能问题导致编译失败NTFS的权限问题更是灾难性的。Java版本是另一个深坑。Android 7.0需要OpenJDK 8Android 8.0-9.0需要OpenJDK 910.0之后又换回OpenJDK 8。去年编译Android 12时我因为没注意文档里的小字说明用了默认的OpenJDK 11结果在编译art模块时遇到诡异的字节码错误。正确的做法是用sudo update-alternatives --config java切换版本后一定要执行make clobber清理之前的编译产物。2. 源码下载的玄学问题repo sync命令看起来简单但在国内网络环境下简直是噩梦。最稳的方案是repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest --depth1 repo sync -j4 --no-tags --no-clone-bundle这个组合拳里--depth1只拉取最新commit节省40%下载量-j4控制并发数避免被封IP清华镜像源比谷歌官方源快20倍不止但即使这样我还是遇到过几次.git目录损坏的情况。后来发现是SSD写入量过大导致的现在我会先在机械硬盘上完成初始同步再用rsync迁移到SSDrsync -av --delete ~/aosp-source/ /mnt/ssd/aosp/3. lunch菜单的隐藏关卡执行lunch时新手常犯的错误是直接选aosp_arm-eng。其实这里面有讲究userdebug版本比eng更接近出厂状态且能adb root带_car后缀的是车载系统专用配置aosp_x86_64比arm版本编译快3倍适合快速验证去年给Pixel 3编译时我发现官方文档里没有列出blueline-userdebugPixel 3代号最后是在device/google/crosshatch目录下找到的device配置。这里有个技巧先git grep PRODUCT_NAME -w device/查找设备代号再去看对应目录下的AndroidProducts.mk文件。4. make过程中的性能调优我的主力编译机是AMD Ryzen 9 5950X 64GB内存经过多次测试得出这些经验值export USE_CCACHE1 export CCACHE_EXEC/usr/bin/ccache ccache -M 50G # 不宜过大否则影响IO性能 make -j32 # 核心数×1.5是最佳值但要注意首次编译绝对不要加-j参数否则出错时日志会混乱ninja: build stopped: subcommand failed错误通常是因为内存不足此时要降低并行度遇到卡死时用Ctrl-\发送SIGQUIT比CtrlC更能保留现场信息5. 高频错误解决方案实录5.1 Java堆溢出Out of memory error: Java heap space解决方法是在prebuilts/sdk/tools/jack-admin文件中修改JACK_SERVER_VM_ARGUMENTS-Dfile.encodingUTF-8 -XX:TieredCompilation -Xmx4g然后执行./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-server5.2 文件权限问题error: unable to read system/sepolicy/prebuilts/api/33.0/private/property.te这通常发生在切换分支后执行repo forall -c git reset --hard HEAD repo sync -l5.3 模块编译失败ninja: error: unknown target MODULE_NAME先用m MODULE_NAME单独编译该模块如果还失败尝试export SOONG_ALLOW_MISSING_DEPENDENCIEStrue6. 增量编译的黑暗技巧开发阶段最痛苦的就是全量编译耗时这几个技巧能节省90%时间只编译特定模块mmm frameworks/base快速推送更改到设备adb sync adb shell am restart使用fastbuild目标仅Android 10make nothing BUILD_FASTtrue终极加速方案——RAM磁盘sudo mount -t tmpfs -o size100G tmpfs out/7. 自定义ROM的进阶操作当需要修改系统签名时必须同步更新四个地方的密钥build/target/product/security/下的platform、shared等密钥device/common/security/下的releasekeybootable/recovery/下的recovery密钥external/avb/下的avb密钥修改后要重新生成vbmeta.imgavbtool make_vbmeta_image --output vbmeta.img --key rsa2048.pem --algorithm SHA256_RSA20488. 调试技巧从logcat到内核崩溃查看启动阶段的隐藏日志adb logcat -b all -d | grep -E init|zygote动态调整内核日志级别echo 8 /proc/sys/kernel/printk捕获native崩溃tombstoned --max-tombstones109. 性能分析工具链生成perfetto跟踪文件adb shell perfetto --txt -c /data/misc/perfetto-configs/android_camera.pbtxt -o /data/misc/perfetto-traces/camera_trace.perfetto-trace使用simpleperf分析CPU热点simpleperf record -p $(pidof surfaceflinger) -g --duration 10内存泄漏检测MALLOC_DEBUGbacktrace adb shell setprop wrap.com.android.systemui LIBC_DEBUG_MALLOC_OPTIONSbacktrace10. 终极避坑指南遇到ninja: build stopped: subcommand failed时先看out/error.log末尾尝试make clean-[MODULE]终极方案rm -rf out/.lock网络问题导致repo sync中断while ! repo sync; do echo Retrying...; sleep 10; done磁盘空间不足的应急处理find out/ -name *.so -size 10M -delete快速清理编译产物保留ccachefind out/ -type f -exec rm {} 最后分享一个冷知识AOSP编译过程中会生成约420万个临时文件所以inode数量也要检查df -i
RELATED

相关推荐

AI如何重塑开源大数据工具源码阅读与调试:以SeaTunnel为例

AI如何重塑开源大数据工具源码阅读与调试:以SeaTunnel为例

1. 项目概述:当AI撞上开源大数据工具最近在社区里,一个话题的讨论热度挺高:“有了AI,我们还需要像以前那样,一行行地啃SeaTunnel的源码,或者费劲地打断点调试吗?” 这背后反映的,其实…

📅 2026/10/3 15:20:40
从特斯拉算力分配看AI资源管理:GPU调度与优化实践

从特斯拉算力分配看AI资源管理:GPU调度与优化实践

这次我们来看一个关于特斯拉算力分配的技术话题。项目标题“马斯克预估Terafab算力分配:Optimus占25%”并非指一个开源软件或工具,而是一个关于特斯拉内部超级计算集群“Terafab”资源规划的技术洞察。这背后反映的是AI时代,尤其是人形机器人…

📅 2026/10/15 6:04:24
从网络流行语到结构化意图:轻量级NLP系统构建实战

从网络流行语到结构化意图:轻量级NLP系统构建实战

最近在开发一个社区互动功能时,遇到一个有趣的挑战:如何将用户输入的、充满网络流行语和情绪化表达的文本(例如“老大,战斗爽喵!吃我胶娃拳喵!!”),转化为结构化的、可分…

📅 2026/10/6 22:17:47
MORE NEWS

更多资讯

📰

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

📰

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

📰

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

📰

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬