Android ADB中getprop输出修改失败问题求助
我碰到过类似的问题,结合Android 7.1.2_r3的属性加载机制,帮你梳理下问题原因和解决办法:
你已经在build/target/product/core.mk里配置了PRODUCT_PROPERTY_OVERRIDES,也确认/system/build.prop已经更新,但getprop输出还是旧值,这主要是属性加载优先级和部分属性的特殊初始化逻辑导致的,具体分析和方案如下:
一、先搞清楚哪些属性你改不动
有些属性是由bootloader或init进程早期阶段硬设置的,优先级远高于build.prop,你的修改自然不会生效:
ro.bootloader:这个值是bootloader启动时直接传给kernel的,init只会读取这个原始值,不会用build.prop里的内容覆盖ro.bootmode:同样属于boot阶段的属性,由bootloader或init早期流程设置,不受build.prop影响ro.hardware:init会根据设备的硬件标识(比如设备树、硬件ID)自动初始化,优先级高于build.propro.kernel.qemu:这个是用来标记是否在模拟器运行的属性,init会自动读取kernel的cmdline参数设置它,真机上固定为0,模拟器上固定为1,手动修改无效
二、针对可修改属性的解决办法
对于ro.product.device、ro.product.model、ro.product.name这类产品属性,你可以试试以下方案:
1. 检查是否有更高优先级的配置文件覆盖了你的设置
如果你的设备是基于generic编译的,可能存在其他产品配置文件(比如build/target/product/generic.mk,或者厂商定制的设备专属mk),这些文件里的PRODUCT_PROPERTY_OVERRIDES会覆盖core.mk的配置。你需要找到最终编译时生效的产品mk,把你的属性配置放在那里,或者确保你的配置在所有其他override之后。
2. 替换成PRODUCT_DEFAULT_PROPERTY_OVERRIDES
在Android 7.x中,PRODUCT_DEFAULT_PROPERTY_OVERRIDES的优先级比PRODUCT_PROPERTY_OVERRIDES更高,你可以把配置改成这个变量试试:
PRODUCT_DEFAULT_PROPERTY_OVERRIDES :=\ ro.product.device="PWN" \ ro.product.model="PWN" \ ro.product.name="PWN"
3. 直接修改default.prop
既然你的设备只有/default.prop和/system/build.prop,你可以直接修改build/target/product/core/default.prop文件,把这些属性加进去或者修改现有值。因为default.prop是init加载的第一个属性文件,优先级比/system/build.prop高(除了bootloader传递的那些属性),这样修改后大概率能生效。
三、验证修改的正确姿势
- 编译完成后,除了看
/system/build.prop,别忘了检查out/target/product/[你的设备名]/root/default.prop,确认属性已经正确写入 - 启动设备后,用
cat /system/build.prop和cat /default.prop对比getprop的输出,就能看出哪个值被覆盖了 - 查看init的日志(
adb logcat | grep init),搜索属性加载相关的日志,能看到init到底是从哪里读取到旧值的
内容的提问来源于stack exchange,提问作者Xudong Shao




