安卓 prop 文件

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 则更为简单,易于使用和维护。因此,要根据具体情况选择适合的机制

<think>好的,我现在需要回答用户关于安卓prop文件的开机加载顺序的问题。首先,我需要回忆一下安卓系统的启动流程以及prop文件的作用。 我记得在安卓系统中,prop文件,比如default.prop、build.prop等,用于存储系统配置参数。这些参数在启动过程中会被读取,影响系统的行为。但具体的加载顺序可能涉及到不同的阶段,比如bootloader、内核启动、init进程等步骤。 首先,启动过程大概分为以下几个阶段:Bootloader -> Linux内核 -> init进程 -> zygote -> 系统服务等。prop文件的加载可能主要集中在init进程阶段,因为init是用户空间的第一个进程,负责解析init.rc文件并设置系统属性。 接下来,我需要确认不同prop文件的存放位置和作用。例如,/system/build.prop是系统构建时的配置,/vendor/default.prop是厂商的默认配置,还有可能在/data分区有persist属性相关的存储。另外,不同的prop文件可能在启动的不同阶段被读取,比如在初始化属性服务时,会按照一定的顺序加载这些文件。 然后,关于加载顺序,我记得在init进程中,会读取多个prop文件,顺序可能是先/system,再/vendor,然后是persist存储的属性。另外,在开机过程中,可能会有overlay机制,允许后面的文件覆盖前面的属性值。例如,/vendor/default.prop可能会覆盖/system中的某些设置,而/data分区的persist属性可能在重启后仍然保留。 不过,我可能需要更详细地查阅相关文档或源码来确认加载顺序是否正确。比如,在init进程启动时,会调用property_init函数初始化属性区域,然后加载各个prop文件。可能的顺序是: 1. /default.prop(通常由boot镜像提供) 2. /system/build.prop 3. /vendor/build.prop 4. /factory/factory.prop(如果有的话) 5. /data/local.prop(如果存在) 6. 持久属性(/data/property下的文件) 此外,每个阶段加载的属性可能会被后续阶段的属性覆盖。比如,vendor的prop文件会覆盖system的,而data分区的local.prop或persist属性可能最后加载,因此优先级更高。 需要注意的是,不同安卓版本可能会有差异,比如在Android 8之后引入的Treble项目,可能会将vendor分区独立出来,所以vendor的prop文件加载顺序可能有所调整。另外,某些设备可能有厂商自定义的prop文件,比如odm分区的prop文件。 总结一下,加载顺序大致是按照从只读分区到可写分区,后者覆盖前者。同时,persist属性在重启后保留,并且可能在其他prop文件加载之后被重新应用。 不过,为了确保准确性,我需要检查相关的安卓源代码或官方文档。例如,查看init进程的代码,了解property_load_boot_defaults函数的执行顺序,以及各个阶段加载哪些prop文件。 例如,在AOSP的init.cpp代码中,可能在早期阶段加载/default.prop,然后是system和vendor的build.prop,接着是其他分区的prop文件。同时,在加载过程中,使用load_system_props函数来加载不同目录下的prop文件。 此外,可能还存在分模块加载的情况,比如在Treble架构下,system、vendor、odm等分区各自有自己的prop文件,init进程会按顺序加载它们。 最后,用户可能需要知道这些prop文件的加载顺序如何影响系统行为,比如在调试时如何通过修改特定prop文件来覆盖默认设置,或者如何设置持久属性。 所以,在回答中需要分步骤说明各个阶段的prop文件加载,强调顺序和覆盖关系,同时指出不同安卓版本可能存在的差异,以及persist属性的处理方式。</think>Android 系统中的属性(`prop`)文件在开机过程中按特定顺序加载,这些文件定义了系统配置参数。以下是典型的加载顺序及其关键文件的作用: --- ### **1. Bootloader 阶段** - **文件**: 无直接 `prop` 文件加载。 - **作用**: Bootloader 初始化硬件并加载内核,但此时尚未涉及 Android 属性系统。 --- ### **2. Linux 内核启动阶段** - **文件**: `default.prop`(位于 `boot` 镜像或 `ramdisk` 中)。 - **作用**: - 内核启动后,首个用户空间进程 `init` 会读取 `default.prop`,定义最基础的只读属性(如 `ro.*`)。 - 此文件通常由设备厂商预置,不可修改(除非重新编译系统)。 --- ### **3. Init 进程阶段** `init` 进程是用户空间的第一个进程(PID=1),负责解析 `init.rc` 脚本并加载属性文件,顺序如下: #### **a. 核心属性文件** 1. **`/system/build.prop`** - 系统构建时生成,包含全局配置(如版本号、设备型号等)。 - 例如 `ro.build.version.release` 定义 Android 版本。 2. **`/vendor/build.prop`** - 厂商自定义属性,覆盖 `/system/build.prop` 中的同名参数。 - 用于硬件适配或差异化配置(如摄像头驱动参数)。 3. **`/odm/build.prop`**(可选) - 针对特定外设模块(ODM, Original Design Manufacturer)的配置。 - 在 Treble 项目后引入,用于模块化硬件支持。 #### **b. 持久化属性** - **`/data/property/` 目录下的文件** - 存储 `persist.*` 属性,重启后保留(如 `persist.sys.timezone`)。 - 在后续阶段加载,优先级高于上述文件。 #### **c. 动态覆盖** - **`/data/local.prop`**(若存在) - 用户或开发者可自定义的属性,覆盖之前的配置。 - 需 `root` 权限写入,常用于调试或临时修改。 --- ### **4. 属性加载规则** - **覆盖机制**:后加载的文件优先级更高。例如,`vendor/build.prop` 会覆盖 `system/build.prop` 的同名属性。 - **只读属性(`ro.*`)**:仅在首次加载时生效,后续无法修改。 - **持久属性(`persist.*`)**:存储在 `/data` 分区,重启后自动恢复。 --- ### **5. 关键命令与调试** - **查看属性**: ```bash adb shell getprop ``` - **修改属性**(需 root): ```bash adb shell setprop <key> <value> ``` - **调试加载顺序**: 查看 `init` 日志中的 `prop` 加载信息: ```bash adb logcat | grep -i "prop" ``` --- ### **6. 版本差异** - **Android 8+(Treble 架构)**:`vendor` 和 `odm` 分区独立,属性加载更模块化。 - **Android 10+**:引入动态分区,但 `prop` 加载逻辑基本不变。 --- 通过理解 `prop` 加载顺序,开发者可以更高效地调试系统行为或定制 ROM(如覆盖默认配置、适配硬件等)。需注意修改系统级 `prop` 文件可能导致不稳定,建议操作前备份。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值