rsproperties
A pure Rust implementation of Android's property system, providing cross-platform access to Android system properties on both Linux and Android platforms.
Features
- Complete Android Properties Implementation: Full Rust implementation of Android's property system - read, write, and monitor properties exactly like Android native code
- Cross-Platform Compatibility: Works seamlessly on both Android devices and Linux systems without modification
- Pure Rust Solution: No dependencies on Android's C libraries or JNI - everything implemented in safe Rust
- Real-time Property Monitoring: Watch for property changes in real-time, enabling reactive applications
- High Performance: Optimized for speed with direct memory access and zero-copy operations
- Drop-in Replacement: Compatible with Android's property naming conventions and value constraints
- Linux Emulation: Full Android property system emulation on Linux for development and testing
- Thread-Safe Design: Safe to use across multiple threads without external synchronization
Quick Start
Add rsproperties to your Cargo.toml:
[]
= "0.1"
# Optional features
[]
= ["rsproperties/builder"] # Enable property database building
Basic Usage
use rsproperties;
// Get property with default value (no initialization needed for default configuration)
let sdk_version = get_with_default;
println!;
// Get property (returns empty string if not found)
let device_name = get;
// Get property with error handling
match get_with_result
// Set property (requires property service to be running)
if let Err = set
### Custom Configuration
```rust
use rsproperties::PropertyConfig;
// Configure custom directories
let config = PropertyConfig {
properties_dir: Some("/custom/properties".into()),
socket_dir: Some("/custom/socket".into()),
};
rsproperties::init(config);
// Using the builder pattern
let config = PropertyConfig::builder()
.properties_dir("/my/properties")
.socket_dir("/my/socket")
.build();
rsproperties::init(config);
// Convenience methods
rsproperties::init(PropertyConfig::with_properties_dir("/my/props"));
Property Monitoring
use rsproperties;
let system_properties = system_properties;
// Wait for any property change
spawn;
// Wait for specific property change
spawn;
Setting Properties
Setting properties requires a running property service (like rsproperties-service):
use rsproperties;
// Basic property setting
if let Err = set
// Set application configuration
set?;
set?;
// Set system properties (may require elevated permissions)
set?;
// Set persistent properties (survive reboots on Android)
set?;
Property Setting Requirements
On Android:
- Properties are set through the property service
- Some properties require specific SELinux permissions
ro.*properties are read-only and cannot be modified- System properties may require root or system privileges
On Linux:
- Requires
rsproperties-serviceto be running - Properties are stored in memory-mapped files
- All properties are writable unless explicitly restricted
Property Setting Examples by Type
// Debug properties - usually writable by applications
set?;
set?;
// Vendor properties - device-specific configuration
set?;
// Custom application properties
set?;
set?;
// System state properties
set?;
set?;
Error Handling
use ;
// Batch property operations with error handling
Platform Support
Android
- Native Integration: Direct access to
/dev/__properties__ - Property Contexts: Full SELinux property context support
- Bionic Compatibility: Compatible with Android's property implementation
- Standard Properties: Access to all standard Android properties
Linux
- Full Emulation: Complete Android property system emulation
- Socket Communication: Unix domain socket property setting
- Memory Mapping: Efficient memory-mapped property storage
- Property Service: Use with
rsproperties-servicefor full daemon functionality
Property Naming Conventions
The library follows Android property naming conventions:
- Read-only properties:
ro.*(e.g.,ro.build.version.sdk) - System properties:
sys.*(e.g.,sys.boot_completed) - Persist properties:
persist.*(e.g.,persist.sys.timezone) - Debug properties:
debug.*(e.g.,debug.my_app.log_level) - Vendor properties:
vendor.*(e.g.,vendor.audio.config)
Property Constraints
- Name length: Maximum 32 characters
- Value length: Maximum 92 characters (except ro.* properties)
- Character set: Alphanumeric, dots, underscores, and hyphens
API Reference
Configuration
PropertyConfig- Configuration for property system initializationPropertyConfig::builder()- Builder pattern for configurationinit(config)- Initialize the property system
Property Operations
get(name)- Get property value (returns empty string if not found)get_with_default(name, default)- Get property with default valueget_with_result(name)- Get property with error handlingset(name, value)- Set property value (requires property service)
System Properties
system_properties()- Get global SystemProperties instanceSystemProperties::find(name)- Find property index by nameSystemProperties::wait_any()- Wait for any property changeSystemProperties::wait(index, timeout)- Wait for specific property change
Advanced Features (with builder feature)
SystemProperties::new_area(dir)- Create new property areaSystemProperties::add(name, value)- Add new propertySystemProperties::update(index, value)- Update existing propertyload_properties_from_file()- Load properties from build.prop files
Thread Safety
All operations are thread-safe and can be used concurrently:
use thread;
// Multiple threads can safely access properties
let handles: = .map.collect;
for handle in handles
Performance
- Memory-mapped access: Direct memory access for optimal performance
- Zero-copy reads: Efficient property value retrieval
- Atomic operations: Thread-safe property updates
- Futex-based waiting: Efficient property change notifications
Examples
The crate includes command-line tools demonstrating usage:
getprop.rs- Android-compatible property gettersetprop.rs- Android-compatible property setter
Related Crates
rsproperties-service- Full async property service daemon for Linux environments
Building
# Build the library
# Build with all features
# Run tests
# Build documentation
License
Licensed under the Apache License, Version 2.0. See LICENSE for details.
Contributing
Contributions are welcome! Please ensure:
- All tests pass:
cargo test - Code is formatted:
cargo fmt - No clippy warnings:
cargo clippy --all-targets --all-features
This implementation is based on Android's property system and maintains compatibility with Android's property semantics and behavior.