# 系统属性定制

## 概述

系统属性是Android系统中用于配置和存储系统信息的重要机制。本文档介绍如何定制系统属性，包括属性定义、读写管理、持久化等。

## 系统属性基础

### 1. 属性类型

#### 只读属性（ro.*）
- **特点**: 只读，系统启动时设置，不能修改
- **示例**: `ro.build.version.sdk`, `ro.product.model`
- **用途**: 系统信息、硬件信息

#### 可写属性（其他）
- **特点**: 可读写，运行时可以修改
- **示例**: `sys.settings.global.*`, `persist.*`
- **用途**: 系统配置、应用配置

#### 持久化属性（persist.*）
- **特点**: 修改后持久化到文件，重启后保持
- **示例**: `persist.sys.timezone`, `persist.vendor.*`
- **用途**: 需要持久化的配置

### 2. 属性命名规范

#### 命名规则
- **ro.**: 只读属性
- **persist.**: 持久化属性
- **vendor.**: 厂商属性
- **sys.**: 系统属性
- **ctl.**: 控制属性

#### 命名示例
```bash
# 只读属性
ro.build.version.sdk
ro.product.manufacturer

# 持久化属性
persist.sys.timezone
persist.vendor.custom.property

# 系统属性
sys.settings.global.screen_brightness

# 厂商属性
ro.vendor.custom.feature
```

## 属性定义

### 1. 在源码中定义属性

#### 定义位置
```
build/target/product/
└── system_prop.mk
```

#### 定义方式
```makefile
# system_prop.mk
# 定义只读属性
PRODUCT_PROPERTY_OVERRIDES += \
    ro.custom.property=value \
    ro.vendor.feature.enabled=true

# 定义持久化属性默认值
PRODUCT_PROPERTY_OVERRIDES += \
    persist.sys.custom.setting=default_value
```

### 2. 在代码中设置属性

#### 设置只读属性
```java
// 在init进程或SystemServer中设置
SystemProperties.set("ro.custom.property", "value");

// 注意：ro.*属性只能在系统启动时设置
```

#### 设置可写属性
```java
// 设置系统属性
SystemProperties.set("sys.custom.property", "value");

// 设置持久化属性
SystemProperties.set("persist.custom.property", "value");
```

### 3. 属性默认值

#### 在default.prop中设置
```bash
# default.prop
ro.custom.property=default_value
persist.sys.custom.setting=default
```

#### 在build.prop中设置
```bash
# build.prop
ro.build.custom.feature=true
ro.vendor.custom.config=value
```

## 属性读写

### 1. Java层读写

#### 读取属性
```java
// 读取属性
String value = SystemProperties.get("ro.custom.property", "default");

// 读取整数属性
int intValue = SystemProperties.getInt("sys.custom.int", 0);

// 读取长整数属性
long longValue = SystemProperties.getLong("sys.custom.long", 0L);

// 读取布尔属性
boolean boolValue = SystemProperties.getBoolean("sys.custom.bool", false);
```

#### 设置属性
```java
// 设置属性（需要系统权限）
SystemProperties.set("sys.custom.property", "value");

// 注意：只有系统进程可以设置属性
```

### 2. Native层读写

#### C/C++代码
```cpp
#include <cutils/properties.h>

// 读取属性
char value[PROPERTY_VALUE_MAX];
property_get("ro.custom.property", value, "default");

// 设置属性
property_set("sys.custom.property", "value");
```

### 3. Shell命令

#### 查看属性
```bash
# 查看所有属性
adb shell getprop

# 查看特定属性
adb shell getprop ro.custom.property

# 查看属性列表（过滤）
adb shell getprop | grep custom
```

#### 设置属性
```bash
# 设置属性（需要root）
adb shell setprop sys.custom.property value

# 设置持久化属性
adb shell setprop persist.custom.property value
```

## 属性持久化

### 1. 持久化机制

#### persist.*属性
- 自动持久化到 `/data/property/`
- 系统启动时自动加载
- 修改后立即持久化

#### 持久化文件
```bash
# 持久化属性文件位置
/data/property/
├── persist.sys.timezone
├── persist.vendor.custom.property
└── ...
```

### 2. 自定义持久化

#### 实现持久化逻辑
```java
public class CustomPropertyManager {
    private static final String PROPERTY_FILE = "/data/custom/properties";
    
    public void saveProperty(String key, String value) {
        try {
            Properties props = loadProperties();
            props.setProperty(key, value);
            saveProperties(props);
        } catch (IOException e) {
            Slog.e(TAG, "Failed to save property", e);
        }
    }
    
    public String loadProperty(String key, String defaultValue) {
        try {
            Properties props = loadProperties();
            return props.getProperty(key, defaultValue);
        } catch (IOException e) {
            return defaultValue;
        }
    }
}
```

## 属性使用场景

### 1. 系统配置

#### 系统设置
```java
// 使用属性存储系统配置
SystemProperties.set("sys.settings.screen_brightness", "128");
SystemProperties.set("sys.settings.sound_enabled", "true");
```

### 2. 功能开关

#### 功能控制
```java
// 使用属性控制功能开关
boolean featureEnabled = SystemProperties.getBoolean(
    "ro.vendor.feature.enabled", false);
    
if (featureEnabled) {
    enableFeature();
}
```

### 3. 调试配置

#### 调试开关
```java
// 使用属性控制调试功能
boolean debugMode = SystemProperties.getBoolean(
    "debug.custom.enable", false);
    
if (debugMode) {
    enableDebugLogging();
}
```

## 属性安全

### 1. 权限控制

#### 属性访问权限
- **读取**: 所有应用可以读取
- **写入**: 只有系统进程可以写入
- **控制**: 通过SELinux策略控制

### 2. SELinux策略

#### 属性访问策略
```sepolicy
# 允许进程读取属性
allow system_server system_prop:property_service get;

# 允许进程设置属性
allow system_server system_prop:property_service set;
```

### 3. 属性验证

#### 输入验证
```java
public void setCustomProperty(String key, String value) {
    // 验证属性名
    if (!isValidPropertyName(key)) {
        throw new IllegalArgumentException("Invalid property name");
    }
    
    // 验证属性值
    if (!isValidPropertyValue(value)) {
        throw new IllegalArgumentException("Invalid property value");
    }
    
    // 设置属性
    SystemProperties.set(key, value);
}
```

## 常见问题

### 1. 属性不生效

#### 问题原因
- 属性名错误
- 权限不足
- 属性未持久化

#### 解决方法
- 检查属性名拼写
- 检查权限配置
- 使用persist.*属性

### 2. 属性丢失

#### 问题原因
- 未使用persist.*
- 持久化文件被删除
- 系统重置

#### 解决方法
- 使用persist.*属性
- 保护持久化文件
- 在代码中设置默认值

### 3. 属性冲突

#### 问题原因
- 属性名冲突
- 属性值冲突

#### 解决方法
- 使用命名空间
- 检查属性使用
- 统一属性管理

## 最佳实践

### 1. 命名规范
- 使用清晰的命名
- 遵循命名规范
- 使用命名空间

### 2. 属性管理
- 统一属性管理
- 文档化属性
- 版本控制

### 3. 安全考虑
- 权限控制
- 输入验证
- SELinux策略

## 相关链接

- [[README]]
- [[系统服务添加流程]]
- [[07-系统安全/SELinux策略编写]]