Releases: Enginex0/resetprop-rs
v0.4.0
feat(core): add context, appcompat, bionic, and wait Property area lookup now parses the property_info binary trie for O(depth) resolution instead of linear scanning all areas. Falls back to text property_contexts on Android 8-9, then to linear scan if neither is available. Android 14+ appcompat_override areas are detected and dual-written automatically, preserving the write mode (stealth, init, standard) on the mirror area. Bionic __system_property_* functions are loaded via dlsym as a read fallback when direct mmap access is unavailable. Entire bionic module is cfg-gated to Android targets only. New --wait flag blocks until a property exists or matches a value, with optional --timeout. Uses bionic __system_property_wait when available, falls back to futex_wait on the property serial or the global serial for properties that don't exist yet. New modules: context.rs (643 LOC), bionic.rs (202 LOC), appcompat.rs (52 LOC), wait.rs (115 LOC). All 60 tests pass.
v0.3.1
build: add x86_64 and x86 Android targets Extends from 2 ABIs to all 4 Android ABIs so emulator users and x86 devices get prebuilt binaries too.
v0.3.0
v0.3.0
- Persistent property support via
-pand-Pflags -pwrites to both prop_area (memory) and/data/property/persistent_properties(disk)-Preads directly from the persist file without requiring prop_area access- Hand-rolled proto2 encode/decode matching AOSP's
PersistentPropertiesschema - Atomic write with SELinux xattr preservation, matching AOSP's temp+rename+fsync pattern
- Legacy format read support for pre-Android 9 devices (one file per property)
PersistStorepublic API: load, get, set, delete, listPropSystem::set_persist()andPropSystem::delete_persist()for dual memory+disk writes
v0.2.1
v0.2.1: add set_init() and --init CLI for init-style serial writes
v0.2.0
resetprop-rs v0.2.0 — Stealth Harvest Overhaul
Major hexpatch-delete rework. Replacement names now come from the device's own property vocabulary instead of a static dictionary.
What changed
Runtime segment harvesting — hexpatch scans all properties on the device and builds a per-length word pool. Replacements are drawn from segments that already exist on that specific device, making them indistinguishable from real properties.
Randomized selection — pool picks use OS-seeded entropy instead of deterministic first-match. Same device, different mangled names each run.
Dot-split compound generation — when harvest pool and static dict are exhausted, the fallback now joins short stems with dots (e.g. cfg.hw.svc) instead of cyclic underscore patterns. Produces more natural-looking segment names for long replacements.
Plausible value — mangled properties now show value 0 instead of empty string. Serial field encodes length=1 with counter bits preserved. Indistinguishable from a boot-time property via the public API.
Name consistency fix — trie segments and prop_info name are now written from the same source vector. Previously they could diverge, creating a detectable mismatch between __system_property_find and __system_property_foreach.
Shared segment protection — trie nodes that have children with their own properties are no longer renamed, preventing corruption of sibling properties.
3-tier replacement strategy
- Harvest pool (device vocabulary, randomized)
- Static dictionary (~95 words, lengths 1-16)
- Dot-split compound (stem combinations with dots)
Testing
- 29 unit tests (mock property areas)
- 20 on-device tests (OnePlus, Android 14, KSU Next) — all pass
- Verified against Magisk resetprop: property counts match within 3
Binaries
| ABI | File |
|---|---|
| arm64-v8a | resetprop-arm64-v8a |
| armeabi-v7a | resetprop-armeabi-v7a |
Static, stripped, zero runtime dependencies beyond libc.
v0.1.0
resetprop-rs v0.1.0
Pure Rust Android property manipulation. No Magisk dependency.
Features
- Get/Set/Delete — direct mmap writes, bypasses property_service
- Hexpatch Delete — trie-aware name destruction with dictionary words, serial preserved
- Batch Load —
-fflag loads name=value pairs from file - Library crate —
PropAreaandPropSystemwith typed errors
Hexpatch Stealth
Unlike magiskboot's blind byte substitution, resetprop-rs walks the actual property prefix trie:
- Segments renamed with same-length dictionary words (thermal, display, sensor, codec)
- Trie structure intact — no enumeration gaps
- Serial counters preserved — no NativeTest detection
- Shared prefixes (ro, persist) automatically skipped
Binaries
| ABI | Size |
|---|---|
| arm64-v8a | 322 KB |
| armeabi-v7a | 237 KB |
Static, stripped, zero runtime dependencies beyond libc.
Testing
- 16 off-device unit tests (mock property areas)
- 17 on-device tests (Redmi, Android 14, KSU Next) — all pass
- Verified against Magisk resetprop: property count and values match