这是一个介绍 Android 属性系统的系列文章:
- Android 属性系统入门
- 属性文件生成过程分析
- 如何添加系统属性 (本文)
- 属性与 Selinux
- 属性系统整体框架与启动过程分析
- 属性读写过程源码分析
常见的自定义系统属性有三类:
- 添加系统属性到 /system/build.prop
- 添加系统属性到 /vendor/build.prop
- 添加系统属性到 /product/build.prop
添加系统属性到 /system/build.prop
我们先看看生成 /system/build.prop
文件相关的部分源码:
makefile
# build/make/core/Makefile
ifdef TARGET_SYSTEM_PROP
system_prop_file := $(TARGET_SYSTEM_PROP)
else
system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
endif
在上文我们分析过 system_prop_file 文件的内容最终会写入到 /system/build.prop
中,/system/build.prop
的值又来自 TARGET_SYSTEM_PROP
,所以我们添加一个属性文件,再修改 TARGET_SYSTEM_PROP
的值即可。
在我们的自定义 Product device/jelly/rice14
目录下,添加一个 system.prop
文件,文件的内容如下:
bash
ro.rice14.test=2.0
接着在 device/jelly/rice14/BoardConfig.mk
中添加:
makefile
TARGET_SYSTEM_PROP += device/jelly/rice14/system.prop
然后重新编译系统,启动模拟器:
bash
source build/envsetup.sh
lunch rice14-eng
make -j16
emulator
启动虚拟机后,我们可以进入虚拟机终端查看属性值:
bash
adb shell
rice14:/ # getprop ro.rice14.test
2.0# end of device/jelly/rice14/system.prop
这里查询到了我们刚添加的属性。
添加系统属性到 /vendor/build.prop
同样的,我们先看看生成 /vendor/build.prop
文件相关的部分源码:
makefile
ifdef property_overrides_split_enabled
FINAL_VENDOR_BUILD_PROPERTIES += \
$(call collapse-pairs, $(PRODUCT_PROPERTY_OVERRIDES))
FINAL_VENDOR_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \
$(FINAL_VENDOR_BUILD_PROPERTIES),=)
endif # property_overrides_split_enabled
这里会把 PRODUCT_PROPERTY_OVERRIDES
变量中的值赋值写入到 FINAL_VENDOR_BUILD_PROPERTIES
,从变量名字就可以看出,这就是最终的 vendor 属性文件,所以我们通过修改 PRODUCT_PROPERTY_OVERRIDES 变量的值即可添加属性:
makefile
# device/jelly/rice14/rice14.mk
PRODUCT_PROPERTY_OVERRIDES += \
ro.vendor.xxx=xxx \
ro.vendor.yyy=yyy
添加系统属性到 /product/build.prop
同样的,我们先看看生成 /product/build.prop
文件相关的部分源码:
makefile
ifdef TARGET_PRODUCT_PROP
product_prop_files := $(TARGET_PRODUCT_PROP)
else
product_prop_files := $(wildcard $(TARGET_DEVICE_DIR)/product.prop)
endif
FINAL_PRODUCT_PROPERTIES += \
$(call collapse-pairs, $(PRODUCT_PRODUCT_PROPERTIES) $(ADDITIONAL_PRODUCT_PROPERTIES))
FINAL_PRODUCT_PROPERTIES := $(call uniq-pairs-by-first-component, \
$(FINAL_PRODUCT_PROPERTIES),=)
可以看到这里会把 product_prop_files
文件和 PRODUCT_PRODUCT_PROPERTIES
变量以及 ADDITIONAL_PRODUCT_PROPERTIES
变量中的值都会写入到最终的属性文件中。
所以上两节介绍的两种方式都可以,这里我们演示先通过添加变量值的方式添加属性:
bash
# device/jelly/rice14/rice14.mk
PRODUCT_PRODUCT_PROPERTIES += \
ro.product.xxx=xxx \
ro.product.yyy=yyy