1 build.prop文件
build.prop文件类似windows的环境变量,可以在android应用层、native层直接读取获得该键值对(key/value)。对于所有程序都是可见的,可以区分流程分支、添加不同功能、android各层直接交互、记录数据、绕开SElinux执行自定义添加的可执行程序等等。
1.1 build.prop来自于何方?
build.prop的生成是由make系统(编译系统源码)时,解析build/core/Makefile过程中生成的。
- Makefile中首先定义各种变量,这在下一步执行时会用到。比如:
PRODUCT_DEFAULT_LANGUAGE="$(calldefault-locale-language,$(PRODUCT_LOCALES))" \
PRODUCT_DEFAULT_REGION="$(calldefault-locale-region,$(PRODUCT_LOCALES))" \
- Makefile中调用build/tools/ buildinfo.sh执行脚本,并输出到build.prop。Buildinfo.sh很简单,只是echo一些属性,比如:
echo"ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
echo"ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
- Makefile中直接把$(TARGET_DEVICE_DIR)/system.prop的内容追加到build.prop中。
- 收集ADDITIONAL_BUILD_PROPERTIES中的属性,追加到build.prop中。ADDITIONAL_BUILD_PROPERTIES又会收集PRODUCT_PROPERTY_OVERRIDES中定义的属性
ADDITIONAL_BUILD_PROPERTIES:= \
$(ADDITIONAL_BUILD_PROPERTIES)\
$(PRODUCT_PROPERTY_OVERRIDES)
通过build.prop生成过程的分析,可知可以在buildinfo.sh、system.prop修改原有的属性或加入自己定义属性。
Add System Properties 添加系统属性
1.2 build.prop 属性格式
Property name 属性名称的格式: [{prefix}.]{group}[.{subgroup}]*.{name}[.{type}]
prefix:
1. ""(省略)
2. ro (对于仅设置一次的属性,只读属性)
3. persist (对于在重新启动后持续存在的属性)
当确定将来不需要 prefix 可写时才使用 ro 。** 不要指定 ro 前缀。**
Group:
Group (and subgroup) 组(和子组)
bluetooth :bluetooth related 蓝牙相关
boot :来自内核 cmdline 的 sysprops from kernel cmdline
telephony :telephony related 电话相关
audio :audio related 音频相关
graphics :graphics related 图形相关
vold :vold related VOLD 相关
name: 标识组中的系统属性
enabled :如果类型是用于打开或关闭功能的布尔系统属性,则使用。
config :如果目的是阐明系统属性不表示系统的动态状态,则使用;它表示预配置的值(例如,只读事物)。
List :如果它是值为列表的系统属性,则使用。
Timeoutmillis :如果它是以毫秒为单位的超时值的系统属性,则使用。
2 如何操作build.prop文件数据?
1. Java中使用:
import android.os.SystemProperties;
SystemProperties.set("persist.sv.debug",”hello_data”);
java获取属性:
String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "24m");
2. Native C/C++中设置属性:
#include "cutils/properties.h"
property_set("persist.sv.debug", "hello_data");
在C中取得属性:
char encrypted_state[32];
property_get("persist.sv.debug", encrypted_state, ""); 最后一个参数是默认值。
3. rc文件中使用property,app直接使用系统属性打开应用,在调试串口直接设置系统属性打开应用。这样的写法也可以绕过selinux
service testService /vendor/bin/test
user root
group root
seclabel u:r:evs_app:s0
disabled
oneshot
on property:test.up_enable=1
start testService
on property:test.up_enable=0
stop testService