Android镜像构建时如何预置persistent_properties的系统属性初始值
预置Android镜像中/data/property/persistent_properties的初始值
由于/data是用户数据分区,首次刷入镜像时会被格式化,无法直接将persistent_properties文件打包进镜像的/data目录。以下是两种可靠的预置方案:
方案一:通过Init脚本在首次启动时复制预置文件
这种方式直接在系统初始化阶段将预置的属性文件拷贝到/data/property目录,属于镜像层面的预置:
- 在设备的vendor或product目录下创建预置文件,例如
vendor/your_vendor/etc/persistent_properties,内容格式为每行一个属性:
persist.custom.key1=value1 persist.custom.key2=value2- 在设备的vendor或product目录下创建预置文件,例如
- 编写Init脚本片段(如
vendor/your_vendor/etc/init/init.your_device.rc),添加以下逻辑:
on post-fs-data # 确保/data/property目录存在 mkdir /data/property 0700 root root # 复制预置文件到目标路径 copy /vendor/etc/persistent_properties /data/property/persistent_properties 0600 root root # 修正文件权限(必须为root拥有,0600权限) chown root root /data/property/persistent_properties chmod 0600 /data/property/persistent_properties- 编写Init脚本片段(如
- 在设备的
device.mk中添加文件拷贝规则,确保脚本和预置文件被打包进镜像:
PRODUCT_COPY_FILES += \ vendor/your_vendor/etc/init/init.your_device.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.your_device.rc \ vendor/your_vendor/etc/persistent_properties:$(TARGET_COPY_OUT_VENDOR)/etc/persistent_properties- 在设备的
方案二:通过首次启动脚本自动设置属性
如果需要更灵活的逻辑(比如判断是否已经设置过属性),可以用脚本在首次启动时调用setprop写入:
- 编写shell脚本
vendor/your_vendor/bin/setup_persistent_props.sh:
#!/system/bin/sh # 仅在persistent_properties不存在时执行设置 if [ ! -f /data/property/persistent_properties ]; then setprop persist.custom.key1 value1 setprop persist.custom.key2 value2 fi- 编写shell脚本
- 给脚本添加执行权限:
chmod 755 vendor/your_vendor/bin/setup_persistent_props.sh
- 给脚本添加执行权限:
- 在Init脚本中添加启动触发:
on boot exec -- /system/bin/sh /vendor/bin/setup_persistent_props.sh- 在
device.mk中添加脚本拷贝规则:
PRODUCT_COPY_FILES += vendor/your_vendor/bin/setup_persistent_props.sh:$(TARGET_COPY_OUT_VENDOR)/bin/setup_persistent_props.sh- 在
注意事项
- 只有以
persist.开头的属性才会被写入persistent_properties文件,这是系统的硬性规则 - 必须确保
/data/property目录和文件的权限正确(root用户拥有,目录0700,文件0600),否则系统无法读取或写入属性 post-fs-data是执行/data目录操作的合适时机,此时/data分区已经挂载完成
内容的提问来源于stack exchange,提问作者tyczj
相关产品推荐
相关产品推荐

