Android 系统属性 (SystemProperties)
*用于存储系统的一下属性信息,以字符串格式储存,在开机的时候在init进程中完成初始化和启动
*用来记录系统设置或进程之间的信息交换
*android分配一个共享内存区来存储的属性,属性是在整个系统中全局可见的
*每个进程可以get/set属性, set是通过向init进程发出请求,又init去完成,get可以直接读取共享内存
属性格式:
ro只读属性 --- ro即read only这类属性通常是系统默认属性,在系统编译或初始化时设置的
persist持久属性 --- 设置persist开头的属性,断电后仍能保存,值写入data/property/persistent_properties
net属性 --- 当设置这个属性时,"net.change"属性将会自动修改,用于记录最新被修改的以net.开头的属性
普通属性 --- 设置其他格式开头的属性,断电后不能保存
添加的属性前缀必须是在system/sepolicy/private/property_contexts中被定义过的,否则无效
make android后在out/target/product/xxx/system/build.prop 可找到添加的属性
如果需要拦截setprop命令 需要在 system_property_set.cpp中进行处理
默认文件路径
/default.prop 系统默认的属性,一般都在根文件系统目录的顶层
/system/build.prop 系统编译的属性,主要记录编译时间,编译主机,编译平台,以及dvm的信息
/system/default.prop
/data/local.prop
串口使用
getprop | grep 节点名
setprop 节点名 节点值
Java 层
import android.os.SystemProperties;
SystemProperties.get("key")
SystemProperties.get("key", true) //bealoon
SystemProperties.set("key", value)
SystemProperties.set("key", "true") //bealoon
具有system权限:
在AndroidManifest.xml中,配置android:sharedUserId=“android.uid.system”
在Android.mk中,配置LOCAL_CERTIFICATE :=platform
C++ Native 层
include <cutils/properties.h>
int property_get(const char *key, char *value, const char *default_value);
int8_t property_get_bool(const char *key, int8_t default_value);
int64_t property_get_int64(const char *key, int64_t default_value);
int32_t property_get_int32(const char *key, int32_t default_value);
int property_set(const char *key, const char *value);
int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie);
Android.mk或Android.bp或Makefile中需要链接libcutils库
ctl 控制属性
setprop ctl.start xxx //启动某服务
setprop ctl.stop xxx //关闭某服务
setprop ctl.restart xxx //重启某服务
sys.powerctl 属性可控制设备重启关机
setprop sys.powerctl shutdown //设备关机
setprop sys.powerctl reboot //设备重启
setprop sys.powerctl shutdownanim //设备关机动画;空为开机动画
添加系统默认属性
device/qcom/qssi/system.prop 和 device/qcom/kona/system.prop 中添加
这里添加的属性前缀必须是在system/sepolicy/private/property_contexts中被定义过的,否则无效;定制化前缀属性在后面定制prop属性配置中会介绍。
make android后在out/target/product/xxx/system/build.prop 或out/target/product/xxx/vendor/build.prop可找到添加的属性persist.hello.world,则说明基本添加成功,烧录img验证即可。
prop 源码介绍 Android 系统属性(SystemProperties)介绍-优快云博客
SystemProperties vs Settings DB
Settings 变量是存储在系统数据库中的配置变量,它们存储在/data/data/com.android.providers.settings/databases/settings.db 数据库中。这些变量用于存储应用程序和系统级别的偏好设置,例如语言、屏幕亮度、通知设置等等。Settings 变量可以通过 Settings API 进行读写,可以通过代码或系统设置应用程序进行访问和更改。
Prop 变量是系统属性变量,它们是存储在 /system/build.prop 文件中的键值对。Prop 变量用于存储系统级别的配置,例如设备名称、制造商名称、操作系统版本等等。Prop 变量可以通过 Android Debug Bridge (ADB) 或命令行工具(如 adb shell 或 terminal emulator)进行读写,也可以通过修改 build.prop 文件进行修改。
因此,Settings 变量和 Prop 变量在用途和存储位置上有所不同。Settings 变量用于应用程序和系统级别的偏好设置,而 Prop 变量用于系统级别的配置。Settings 变量可以通过代码或系统设置应用程序进行访问和更改,而 Prop 变量可以通过 ADB 或命令行工具进行读写和修改。
SystemProperties vs 共享内存
安卓的 SystemProperties 是一个API,用于读取或设置设备的系统属性。这些属性包括硬件配置,软件版本,网络设置等等。通过该API,应用程序可以获取或更改设备的系统属性。systemproperties是安卓平台提供的一种轻量级的数据交换方式,用于应用程序之间的通信或与系统之间的通信。
共享内存是一种机制,允许两个或多个进程共享同一块内存区域。共享内存通常用于高性能的数据交换,因为它比其他进程间通信机制(例如管道或信号量)更快。在安卓中,共享内存可以通过使用ashmem模块来实现。
在比较 SystemProperties 和共享内存的优劣时,需要注意它们的应用场景不同。SystemProperties 适用于轻量级的数据交换,例如应用程序之间的通信或与系统之间的通信,而共享内存适用于高性能的数据交换,例如图形处理或多媒体应用程序中的数据传输。同时,共享内存的实现相对复杂,需要考虑同步、互斥等问题,而 SystemProperties 则更为简单,易于使用和维护。因此,要根据具体情况选择适合的机制