Release repository for Storage Redirect X packages (APK + Zygisk module). Source code is not included.
- Release Contents
- Prerequisites
- What It Does
- Common Use Cases
- Quick Start
- In-App Configuration Flow
- How Mapping Works
- Manual Configuration
- Configuration Starter Samples
- Notes
storage.redirect.x_<version>-arm64-v8a.apkstorage.redirect.x_<version>-x86_64.apkstorage-redirect-x_v<version>-zygisk.zip
IMPORTANT Before using this app:
- Your device is rooted.
- Zygisk is enabled.
- Redirects app storage operations through Zygisk hooks.
- Supports separate rules for each device user (
users.{userId}) on multi-user devices. - Lets you set real-path whitelist rules (
allowed_real_paths) and path rewrite rules (path_mappings) per app. - Provides runtime logs, file monitor logs, and in-app config management.
- Keep shared storage cleaner by reducing direct app writes in common folders.
- Isolate heavy-writing apps to avoid cross-app path pollution.
- Apply different redirect behavior for owner and work profile users.
- Fine-tune virtual-to-real path mapping for compatibility with specific apps.
- Ensure your device is rooted and Zygisk is enabled.
- Install
storage-redirect-x_v<version>-zygisk.zipin your root manager. - Reboot the device.
- Install and open the manager APK.
- Grant root permission to the manager app.
- Go to
Apps-> select an app -> enable redirect. - Add allowed paths or path mappings, then save.
- Open
Appsand choose target user/app. - Turn on
Enable Redirect. - Optional: add entries in
Allowed Paths. - Optional: add entries in
Path Mappings(virtual_path->real_path). - Save config.
NOTE After saving, the target app process will be stopped automatically to apply changes.
Assume app com.example on user 0.
When redirect is enabled, the default redirect base is:
/storage/emulated/0/Android/data/com.example/sdcard
So by default, app access like:
/storage/emulated/0/DCIM/MyApp/a.jpg
is redirected to:
/storage/emulated/0/Android/data/com.example/sdcard/DCIM/MyApp/a.jpg
Then exception rules are applied on top of that default behavior:
| Priority | Rule | Behavior |
|---|---|---|
| 1 | path_mappings |
Longest matching virtual_path prefix rewrites to a target real path. |
| 2 | allowed_real_paths |
Matched path is restored to the same real path instead of default redirect path. |
| 3 | Fallback redirect | Other storage paths are moved under default redirect base. |
How user-input relative paths are resolved:
- If current user is
0:path_mappings.virtual_path = "DCIM/MyApp"->/storage/emulated/0/DCIM/MyApppath_mappings.real_path = "Pictures/MyApp"->/storage/emulated/0/Pictures/MyAppallowed_real_paths = "Download/Public"->/storage/emulated/0/Download/Public
- If current user is
10, the same config becomes:/storage/emulated/10/DCIM/MyApp/storage/emulated/10/Pictures/MyApp/storage/emulated/10/Download/Public
path_mappings example:
- Rule:
DCIM/MyApp -> Pictures/MyApp - Input:
/storage/emulated/0/DCIM/MyApp/a.jpg - Output:
/storage/emulated/0/Pictures/MyApp/a.jpg
If no rule matches:
- Input:
/storage/emulated/0/Download/a.txt - Output:
/storage/emulated/0/Android/data/com.example/sdcard/Download/a.txt
If path matches allowed_real_paths:
- Allowed path:
Download/Public - Input:
/storage/emulated/0/Download/Public/a.txt - Output: unchanged
They can be used together. Practical behavior:
- No overlap: each rule does its own job.
allowed_real_pathsrestores listed directories to real paths, whilepath_mappingsrewrites listed virtual directories to different real paths. - Parent + child overlap: child mapping still applies.
Example: allowDCIM, and mapDCIM/MyApp -> Pictures/MyApp. Other files underDCIMstay in realDCIM, butDCIM/MyAppgoes to mapped target. - Exact same path in both: mapping wins.
Example: allowDownload/Public, and mapDownload/Public -> Documents/Public. Final path follows mapping targetDocuments/Public.
This matches implementation order: mapping has higher decision priority than allowed paths, and mount flow applies mapping after allowed-path restore.
Config directory on device:
/data/adb/modules/storage.redirect.x/config/
├─ global.json
└─ apps/
└─ <package_name>.json
{
"file_monitor_enabled": true
}{
"users": {
"0": {
"enabled": true,
"allowed_real_paths": [
"Download/MyApp",
"Documents/MyApp"
],
"path_mappings": {
"DCIM/MyApp": "Pictures/MyApp"
}
}
}
}- Use relative paths only.
- Do not start with
/. - Do not include
... - Do not start with
Android. virtual_pathandreal_pathcannot be identical.
- Recommended: trigger module action
重载重定向. - Alternative: restart affected apps or reboot device.
{
"users": {
"0": {
"enabled": true
}
}
}{
"users": {
"0": {
"enabled": true,
"allowed_real_paths": ["Download/OwnerOnly"]
},
"10": {
"enabled": true,
"allowed_real_paths": ["Download/WorkProfile"],
"path_mappings": {
"Movies/Input": "Movies/WorkMapped"
}
}
}
}- Keep APK and Zygisk module versions aligned.
- Reboot after upgrade to avoid stale process cache.
- Release assets with the same filename may be replaced, always install the latest version.