当前位置: 首页 > article >正文

从make clean到build.prop:揭秘Android系统属性生成的完整链条

从make clean到build.prop揭秘Android系统属性生成的完整链条当你通过adb shell getprop ro.build.display.id查看设备版本号时是否好奇过这个字符串背后的生成逻辑在Android编译系统中从Makefile执行到最终生成build.prop文件隐藏着一条精密的属性装配流水线。本文将拆解这条链条上的每个关键环节带你理解系统属性从源码到设备的完整生命周期。1. 编译系统的属性装配架构Android的构建系统本质上是一个由Makefile、Shell脚本和Python工具组成的自动化工厂。当我们执行make命令时系统会按照依赖关系依次触发多个模块的编译任务而系统属性的生成正是这个流水线上的关键环节。以ro.build.display.id为例它的生成涉及三个核心层次变量定义层在build/make/core/sysprop.mk中声明基础变量脚本转换层通过buildinfo.sh将Makefile变量转换为属性格式文件合成层由构建系统合并多个.prop文件生成最终产物这种分层设计使得属性管理既保持灵活性又能实现高效批量处理。在Android 10之后编译中间产物的路径发生了变化# Android 10之前 out/target/product/[project]/obj/PACKAGING/system_build_prop_intermediates/buildinfo.prop # Android 10及之后 out/target/product/[project]/obj/ETC/system_build_prop_intermediates/build.prop2. 关键文件的作用与交互2.1 buildinfo.sh的转换逻辑位于build/make/tools/buildinfo.sh的这个脚本负责将Makefile变量转换为标准的属性格式。其核心转换模式非常简单echo ro.build.display.id$BUILD_DISPLAY_ID但背后的变量传递机制却值得深究。在sysprop.mk中我们可以看到变量的真实来源BUILD_DISPLAY_ID : $(BUILD_ID)这意味着默认情况下显示ID实际上继承自BUILD_ID变量。开发者可以通过在设备树或产品配置中重写这个变量来自定义显示内容。2.2 中间文件的生成机制执行make命令时系统会通过以下规则生成中间文件$(gen_from_buildinfo_sh): $(INTERNAL_BUILD_ID_MAKEFILE) $(hide) BUILD_DISPLAY_ID$(BUILD_DISPLAY_ID) \ TARGET_DEVICE$(TARGET_DEVICE) \ ...其他变量... \ bash buildinfo.sh $这个规则解释了为什么直接删除system/build.prop后执行make不会重新生成文件——因为中间产物buildinfo.prop仍然存在构建系统认为不需要重新执行这个规则。而make clean会清除所有中间文件迫使系统完整重建。3. 属性传递的完整链条让我们用时间轴方式梳理整个流程准备阶段执行make clean清除历史构建产物读取所有产品相关的Makefile配置变量解析阶段解析BUILD_DISPLAY_ID等变量定义处理可能的变量覆盖和继承关系文件生成阶段执行buildinfo.sh生成中间.prop文件合并多个属性源文件包括default.prop等最终部署将合成的build.prop放入系统镜像打包生成完整的系统镜像文件这个过程中有几个关键检查点可以帮助开发者调试# 检查中间产物 ls -l out/target/product/[device]/obj/ETC/system_build_prop_intermediates/ # 验证变量传递 make -p | grep BUILD_DISPLAY_ID4. 实战自定义系统属性理解这个机制后我们可以通过几种方式自定义系统属性方法一通过产品配置文件覆盖在device/[vendor]/[device]/product.mk中添加BUILD_DISPLAY_ID : Custom_$(BUILD_ID)方法二修改buildinfo.sh在脚本中添加条件逻辑if [ -n $CUSTOM_DISPLAY_ID ]; then echo ro.build.display.id$CUSTOM_DISPLAY_ID else echo ro.build.display.id$BUILD_DISPLAY_ID fi方法三使用编译参数通过命令行传递参数make BUILD_DISPLAY_IDDevPreview_123注意直接修改构建系统脚本可能影响后续版本升级建议优先使用产品配置覆盖的方式5. 高级调试技巧当属性表现不符合预期时可以采用以下排查策略依赖关系检查make -d | grep buildinfo.prop变量追踪make --print-data-base | grep -A10 BUILD_DISPLAY_ID增量构建测试rm out/target/product/[device]/obj/ETC/system_build_prop_intermediates/* make -k属性来源验证adb pull /system/build.prop grep -n ro.build.display.id build.prop对于需要频繁修改属性的开发场景建议建立自动化测试流程# 示例验证脚本 import subprocess def test_display_id(): output subprocess.check_output([adb, shell, getprop, ro.build.display.id]) assert bCustom in output, Display ID not updated!理解Android属性生成机制不仅能解决日常构建问题更能帮助开发者深入掌握系统定制能力。当你在build.prop中看到预期的属性值时意味着整个编译链条上的每个环节都完美地完成了它们的使命。

相关文章:

从make clean到build.prop:揭秘Android系统属性生成的完整链条

从make clean到build.prop:揭秘Android系统属性生成的完整链条 当你通过adb shell getprop ro.build.display.id查看设备版本号时,是否好奇过这个字符串背后的生成逻辑?在Android编译系统中,从Makefile执行到最终生成build.prop文…...

MDXEditor指令系统详解:如何扩展Markdown语法

MDXEditor指令系统详解:如何扩展Markdown语法 【免费下载链接】editor A rich text editor React component for markdown 项目地址: https://gitcode.com/gh_mirrors/editor/editor MDXEditor是一个功能丰富的React组件,专为Markdown编辑设计&am…...

安规设计规范-3(如何计算电气间隙和爬电距离)

详尽的计算方式建议参考各个标准的要求,本文只指出常规的基础计算流程。以下示例严格遵循 GB/T 16935.1-2023/IEC 60664-1:2020《低压系统内设备的绝缘配合》,选用储能 PCS(储能变流器)最常见的230V AC 电网侧对低压控制侧场景&am…...

Tomato Novel Downloader:智能搜索功能的技术突破

Tomato Novel Downloader:智能搜索功能的技术突破 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读工具领域,用户体验的每一个细节都可能决定…...

毕业设计实战:基于Java+MySQL的教务管理系统设计与实现指南

毕业设计实战:基于JavaMySQL的教务管理系统设计与实现指南 在开发“基于JavaMySQL的教务管理系统”毕业设计时,曾因课程报名表未通过学生ID与课程ID双外键关联踩过关键坑——初期仅设计报名编号、报名时间等基础字段,未与学生表、课程表建立关…...

毕业设计实战:基于SSM+JSP的家纺用品销售管理系统设计与实现全攻略

毕业设计实战:基于SSMJSP的家纺用品销售管理系统设计与实现全攻略 在开发“家纺用品销售管理系统”这套毕设时,我曾因“订单管理与商家库存脱节”踩过一个关键坑。初期设计时,我将“用户下单”和“商家库存扣减”视为两个独立操作&#xff0c…...

Arduino_Threads:Mbed OS平台的嵌入式多线程实践框架

1. Arduino_Threads 库深度解析:面向 Mbed OS 的嵌入式多线程实践框架1.1 库定位与工程价值Arduino_Threads 是 Arduino 官方为基于 Mbed OS 核心的 Arduino 开发板(如 Nano RP2040 Connect、Portenta H7、Nicla Sense ME 等)设计的轻量级多线…...

AutoGen Studio效果展示:看Qwen3-4B如何协作完成网页设计

AutoGen Studio效果展示:看Qwen3-4B如何协作完成网页设计 1. AutoGen Studio简介 AutoGen Studio是一个基于微软AutoGen框架开发的低代码界面工具,它让构建和组合AI代理变得简单直观。通过这个平台,你可以快速创建多个AI代理,为…...

HuggingFace大语言模型实战:如何用Python脚本批量翻译YouTube字幕(含环境配置避坑指南)

HuggingFace大语言模型实战:Python脚本批量翻译YouTube字幕全攻略 当你在YouTube上发现一段精彩的英文技术讲座,或是需要研究某个外语行业报告时,自动翻译工具能大幅提升信息获取效率。本文将带你用HuggingFace生态构建一个本地化翻译工作流&…...

OpCore-Simplify:让OpenCore EFI配置变得智能高效

OpCore-Simplify:让OpenCore EFI配置变得智能高效 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题引入:为什么Hackintosh配…...

Joy-Con Toolkit终极指南:快速解锁Switch手柄隐藏功能

Joy-Con Toolkit终极指南:快速解锁Switch手柄隐藏功能 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款专为任天堂Switch手柄设计的开源控制软件,为游戏玩家提供前所…...

4个核心功能实现智能散热:FanControl个性化温控指南

4个核心功能实现智能散热:FanControl个性化温控指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...

Python内存管理策略对比评测报告(2024权威版):仅1种策略通过了金融级SLA压力测试,其余4种已淘汰

第一章:Python智能体内存管理策略对比评测报告(2024权威版)概述Python智能体(如基于LLM的Agent框架、自主任务调度器、多步推理引擎)在运行过程中面临高频对象创建、长生命周期缓存、跨线程引用共享等复杂内存场景。传…...

【JDK21虚拟线程生产就绪 checklist】:8类典型场景配置模板(WebFlux/Quarkus/Vert.x/RSocket全覆盖)

第一章:JDK21虚拟线程核心机制与生产就绪定义虚拟线程(Virtual Threads)是 JDK 21 中正式引入的里程碑特性(JEP 444),其本质是轻量级、用户态调度的 Java 线程抽象,由 JVM 在平台线程&#xff0…...

2026年高压电磁阀制造厂大比拼:哪家更值得信赖?

在工业领域,高压电磁阀是许多关键系统的核心部件,其性能和可靠性直接关系到整个系统的稳定性和安全性。随着技术的不断进步和市场需求的多样化,选择一家值得信赖的高压电磁阀制造厂变得尤为重要。本文将从多个维度对比分析几家主流高压电磁阀…...

Matlab源代码教程:枝晶生长模拟中的溶质与液相分数分析

枝晶生长模拟,溶质、液相分数,matlab源代码 教程相场法模拟枝晶生长这事挺有意思的——想象金属熔液凝固时,那些像雪花般绽放的晶体结构,背后其实是溶质扩散和相变的战场。今儿咱们用MATLAB整活,搞个能看见晶体长毛刺的…...

HiOmics平台:零代码实现ChIP-Seq数据可视化与深度解析

1. 为什么科研人员需要零代码ChIP-Seq分析工具 做表观遗传学研究的朋友们应该都深有体会,ChIP-Seq数据分析就像一场马拉松——从原始数据清洗、序列比对、peak calling到功能注释,每个环节都需要不同的工具和脚本。我刚开始接触这个领域时,光…...

保姆级教程:NotaGen一键部署,小白也能生成贝多芬风格交响乐

保姆级教程:NotaGen一键部署,小白也能生成贝多芬风格交响乐 1. 引言:AI音乐创作新体验 你是否曾经梦想过创作一首属于自己的交响乐?现在,NotaGen让这个梦想变得触手可及。这个基于大语言模型(LLM)的音乐生成工具&…...

Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比

Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比 如果你正在使用Nunchaku FLUX.1-dev模型生成图片,可能会发现一个问题:生成速度不够快,特别是当你想批量出图或者尝试不同参数时,等待时间有点长。 今天我…...

企微API集成指南——从回调到主动发送,全流程代码解析

企业微信提供了丰富的API,用于接收用户添加事件、发送消息、管理标签等。今天从实战角度,给出API集成的最佳实践,附带伪代码。一、核心API清单API用途频率限制获取access_token调用其他API的前提2000次/分钟添加外部联系人通过好友每个号300人…...

单片机调试:问题复现与定位的实战技巧

1. 单片机开发中的问题复现方法论在单片机项目开发过程中,遇到问题是不可避免的。作为一名从业多年的嵌入式工程师,我认为问题复现是整个调试过程中最关键的第一步。很多新手开发者常常急于解决问题,却忽略了问题复现的重要性,结果…...

CasRel在智能问答系统中的落地实践:为QA引擎注入结构化事实支撑

CasRel在智能问答系统中的落地实践:为QA引擎注入结构化事实支撑 1. 引言:当问答系统遇到关系抽取 想象一下这样的场景:用户向智能问答系统提问"苹果公司的CEO是谁?",系统需要快速准确地回答"蒂姆库克…...

SiameseUIE多任务统一Schema设计:一套定义覆盖NER/关系/事件/情感

SiameseUIE多任务统一Schema设计:一套定义覆盖NER/关系/事件/情感 1. 引言:信息抽取的“瑞士军刀” 想象一下,你手头有一堆杂乱无章的中文文档——可能是新闻稿、用户评论、技术报告或者客服对话。老板让你快速从中找出所有提到的人名、公司…...

Gemma-3-270m多场景落地:政务热线知识库问答、医疗术语解释系统

Gemma-3-270m多场景落地:政务热线知识库问答、医疗术语解释系统 1. 快速上手:部署你的第一个Gemma-3-270m服务 想要快速体验Gemma-3-270m的强大能力?通过Ollama部署只需几个简单步骤。 1.1 环境准备与模型选择 首先确保你已经安装了Ollam…...

用ESP32和TB6612FNG做个遥控小车:从硬件接线到Arduino代码调试全记录

从零打造ESP32智能遥控小车:硬件选型、代码优化与避坑指南 项目背景与核心组件解析 去年夏天,我在工作室里堆满了各种电机和开发板,试图为侄子制作一个生日礼物——能通过手机控制的遥控小车。经过多次迭代,最终选择了ESP32TB6612…...

双项目驱动:AI教育轻创合伙人对比传统教育创业的显著优势

随着人工智能技术的飞速发展,AI教育正成为教育行业的新风口。在这一背景下,轻创合伙模式应运而生,为创业者提供了低门槛、高潜力的入局机会。本文将深入分析AI教育轻创合伙人相较于传统教育创业的核心优势,探讨其规模化路径的实现…...

Qwen3-ASR-0.6B作品集:Qwen3-ForcedAligner-0.6B时间戳精度图谱

Qwen3-ASR-0.6B作品集:Qwen3-ForcedAligner-0.6B时间戳精度图谱 你有没有想过,一段语音里的每个字、每个词,甚至每个音节,是在哪个精确的时间点被说出来的?这听起来像是电影后期制作里的黑科技,但现在&…...

ClawdBot代码实例:修改clawdbot.json实现模型热切换实操

ClawdBot代码实例:修改clawdbot.json实现模型热切换实操 1. 引言:你的个人AI助手,想换模型就换模型 想象一下,你有一个24小时在线的AI助手,它能帮你写代码、回答问题、整理文档。但用久了,你可能会想&…...

基于OpenCV的边缘梯度模板匹配:代码与分析

基于Opencv边缘梯度模板匹配源码,今天,我决定深入研究一下基于OpenCV的边缘梯度模板匹配算法。说实话,这个算法听起来有点高大上,但我觉得只要一步步来,一定能搞明白。 什么是边缘梯度模板匹配? 边缘梯度模…...

Qwen3.5-2B镜像免配置部署:开箱即用WebUI(7860端口)快速上手教程

Qwen3.5-2B镜像免配置部署:开箱即用WebUI(7860端口)快速上手教程 1. 模型简介 Qwen3.5-2B是通义千问系列中的轻量化多模态基础模型,仅有20亿参数规模,专为低功耗、低门槛部署场景设计。这个版本特别适合在端侧设备和…...