|
| 1 | +# DPIS |
| 2 | +<img src="https://raw.githubusercontent.com/Xposed-Modules-Repo/io.github.kwensiu.dpis/refs/heads/main/icon.png" height='70px'> |
| 3 | + |
| 4 | + |
| 5 | + |
| 6 | + |
| 7 | +[中文说明](./README.md) | English |
| 8 | + |
| 9 | +DPIS is an LSPosed/Xposed-based Android module for per-app display tuning (`virtual width + font size`) without changing global system display settings. |
| 10 | + |
| 11 | +## Core Capabilities |
| 12 | + |
| 13 | +- Configure per-app virtual width (`dp`) |
| 14 | +- Configure per-app font scale (`50-300%`) |
| 15 | +- Both width and font support `Emulation` and `Replacement` modes |
| 16 | +- App list search and filtering (`All apps` / `Configured apps`) |
| 17 | +- System-layer hook toggle and safe mode |
| 18 | + |
| 19 | +## Requirements |
| 20 | + |
| 21 | +- Android 8.0+ (`minSdk 26`) |
| 22 | +- Rooted device |
| 23 | +- LSPosed/Xposed installed and enabled |
| 24 | + |
| 25 | +## Quick Start |
| 26 | + |
| 27 | +1. Enable the DPIS module in LSPosed. |
| 28 | +2. Select the target app in scope. In regular cases you do not need `system`. |
| 29 | +3. Open DPIS and configure: |
| 30 | + - Virtual width (`dp`) |
| 31 | + - Font scale (`50-300%`) |
| 32 | + - Width mode and font mode (`Emulation` / `Replacement`) |
| 33 | +4. Save, then restart the target app process. Reboot the device if needed. |
| 34 | + |
| 35 | +If you use `Emulation`, also enable `system` scope in LSPosed. `Replacement` usually does not need it. |
| 36 | + |
| 37 | +## Modes |
| 38 | + |
| 39 | +| Mode | Characteristics | Best for | Notes | |
| 40 | +| --- | --- | --- | --- | |
| 41 | +| `Emulation` | Closer to native system behavior, usually more natural | System-like rendering consistency | Depends on system-layer hooks; some apps do not support it | |
| 42 | +| `Replacement` | Direct field rewrite, more immediate | Most regular apps | May cause layout drift or scaling glitches | |
| 43 | + |
| 44 | +## System-Layer Hook and Safe Mode |
| 45 | + |
| 46 | +- `Off`: only uses in-process overrides for the target app. Recommended with `Replacement`. |
| 47 | +- `On`: enables the full `system_server` path, useful for debugging and comparison. |
| 48 | +- `On + Safe mode`: limits hooks to lower-risk entries (`activity-start`), recommended as the default. |
| 49 | + |
| 50 | +If you use `Emulation`, make sure LSPosed scope includes `system`. `Replacement` can usually work with only the target app selected. |
| 51 | + |
| 52 | +## Logs and Diagnostics |
| 53 | + |
| 54 | +- `Log output` is recommended off by default to reduce overhead. |
| 55 | +- When enabled, high-frequency `system_server` entries are sampled and deduplicated. |
| 56 | +- Font debug stats and overlay are diagnostic tools only and are not required for the normal apply path. |
| 57 | + |
| 58 | +## Build and Test |
| 59 | + |
| 60 | +```powershell |
| 61 | +./gradlew :app:assembleModern101Debug :app:assembleCompat100Debug |
| 62 | +./gradlew :app:testAllDebugUnitTests |
| 63 | +``` |
| 64 | + |
| 65 | +Optional install commands (Windows PowerShell): |
| 66 | + |
| 67 | +```powershell |
| 68 | +./gradlew :app:assembleModern101Debug; if ($LASTEXITCODE -eq 0) { adb install -r "app/build/outputs/apk/modern101/debug/app-modern101-debug.apk" } |
| 69 | +./gradlew :app:assembleCompat100Debug; if ($LASTEXITCODE -eq 0) { adb install -r "app/build/outputs/apk/compat100/debug/app-compat100-debug.apk" } |
| 70 | +``` |
| 71 | + |
| 72 | +## Project Structure |
| 73 | + |
| 74 | +```text |
| 75 | +app/ Main Android module |
| 76 | + src/main/java/ Shared production code |
| 77 | + src/main/res/ Shared resources and UI |
| 78 | + src/modern101/java/ libxposed API 101 specific code |
| 79 | + src/compat100/java/ Legacy Xposed compatibility code |
| 80 | + src/test/java/ Unit tests |
| 81 | +docs/ Active documentation |
| 82 | +docs/archive/ Historical archived documentation |
| 83 | +refs/ Local references (LSPosed / AOSP / libxposed) |
| 84 | +``` |
| 85 | + |
| 86 | +## Version Notes |
| 87 | + |
| 88 | +| Variant | File name | Environment | |
| 89 | +| --- | --- | --- | |
| 90 | +| Standard | `DPIS_{version}.apk` | LSPosed (`libxposed API 101+`) | |
| 91 | +| Legacy | `DPIS_{version}_legacy.apk` | Classic Xposed / frameworks without `libxposed API 101` support | |
| 92 | + |
| 93 | +Both variants target the same user-facing feature set. The main differences are framework integration, download entry, and update behavior. Prefer the standard build and only use the legacy build when the standard one cannot load. |
| 94 | + |
| 95 | +For the legacy build, always follow the main repo Releases page. The LSPosed / Xposed module repository only syncs the standard APK. |
| 96 | + |
| 97 | +The standard and legacy builds cannot coexist. They share the same package name, so cross-installing them overwrites the other one and may reset existing state or configuration. |
| 98 | + |
| 99 | +## Documentation |
| 100 | + |
| 101 | +- Chinese README: [../README.md](../README.md) |
| 102 | +- Active docs: [README.md](README.md) |
| 103 | +- Archived docs: [archive/README.md](archive/README.md) |
| 104 | + |
| 105 | +## License |
| 106 | + |
| 107 | +DPIS is released under [GPL-3.0-or-later](../LICENSE). |
| 108 | + |
| 109 | +## References and Thanks |
| 110 | + |
| 111 | +DPIS references ideas and implementation patterns from the following open-source projects: |
| 112 | + |
| 113 | +- [libxposed/api](https://github.com/libxposed/api) |
| 114 | +- [LSPosed](https://github.com/LSPosed/Lsposed) |
| 115 | +- [AdClose](https://github.com/zjyzip/AdClose) |
| 116 | +- [App Settings(Xposed-Modules-Repo)](https://github.com/Xposed-Modules-Repo/ru.bluecat.android.xposed.mods.appsettings) |
| 117 | +- [InstallerX-Revived](https://github.com/wxxsfxyzm/InstallerX-Revived) |
| 118 | +- [InxLocker](https://github.com/Chimioo/inxlocker) |
| 119 | +- [视界调节](https://www.coolapk.com/feed/70930481?s=OGJiYmE1YjEyYmQ1MmZnNjllOTNiNWF6a1610b3) |
| 120 | + |
| 121 | +## Disclaimer |
| 122 | + |
| 123 | +DPIS runs in a Root/LSPosed environment and carries stability and compatibility risks. Back up important data first and evaluate the risks before use. |
0 commit comments