ShizuStore

雨晴截屏

CATMIAOZHI

0.1.4 · GitHub

Download APK
Miscellaneous Android 12+ 3 days ago Proprietary
82 ShizuStore
185 GitHub
4 Stars
44 MB Size

More about this app

Silent screenshots and screen recording through a Shizuku or Porter privileged shell instead of MediaProjection.

๐Ÿ“ธ Rainy Screenshot

็ฎ€ไฝ“ไธญๆ–‡ | English

"Silent Capture, Full Control"

An Android screenshot & screen recording app built on a privileged shell (dual backend: Shizuku / Porter) โ€” no MediaProjection, no system dialogs, no status-bar recording indicator. The foreground app never knows it is being captured. Supports quick triggers and fully customizable capture parameters.

screencap/screenrecord (shell uid 2000, u:r:shell:s0)
        โ”‚  No MediaProjection authorization dialog
        โ”‚  No "screenshot blocked" prompts (FLAG_SECURE content is still black)
        โ”‚  No "screen sharing" indicator
        โ–ผ
   RainyScreenShot gets the result exclusively

RainyScreenShot โ€” Silent Screenshot & Screen Recorder ยท the Rainy Family tools.


โœจ Features

Feature Description
๐Ÿคซ Silent screenshot screencap under shell uid reads the framebuffer directly; the foreground app gets no callback, no awareness, no "screenshot blocked" prompt (verified: dumpsys media_projection stays null during capture). If a window sets FLAG_SECURE its content appears blacked out โ€” system-level content protection no approach can bypass
๐ŸŽฌ Silent recording screenrecord (v1.4) system encoder under shell uid; start/stop are just process SIGINT โ€” no projection session registered, no notification, no indicator
โšก Quick triggers Three ways: in-app buttons ยท floating control ball (OverlayManager TYPE_APPLICATION_OVERLAY) ยท Quick Settings tiles (TileService, works on lock screen). Tiles are added manually from the home page (one silent tap adds them to the panel โ€” no edit mode needed); tapping a tile auto-collapses the panel first so the panel never appears in the shot
๐Ÿ› ๏ธ Custom parameters Screenshot: PNG/RAW, display-id, multi-display -a. Recording: resolution --size, bitrate --bit-rate (default 8M), time limit --time-limit (0 = unlimited), bugreport overlay, --display-id
๐ŸŽฏ Region capture (Phase 2) pixel-crop the captured result, no root needed
โบ๏ธ Floating control A translucent mini control ball while recording โ€” tap to stop; can be hidden entirely, leaving tiles/app as the only stop paths
๐ŸŒ™ Dark mode Global Material You adaptive
๐Ÿ”Œ Dual backend The shell channel is provided by Shizuku or Porter (an actively maintained Shizuku fork); switchable in Settings (Automatic / Porter / Shizuku) โ€” Automatic prefers Porter; force-stop and reopen to apply
๐Ÿ” Fully local Zero network, zero telemetry; outputs in private app paths

๐Ÿ” How the invisibility works (verified on Android 16 / API 36)

Conclusions from real-device testing (Shizuku shell uid 2000, u:r:shell:s0):

Detection vector MediaProjection approach This project (direct shell)
System authorization dialog Required every time (Android 14+ cannot skip) โœ… None
MediaProjectionManager session registration Yes โ€” apps can sense it via dumpsys media_projection / API โœ… Stays null throughout recording (verified)
Status-bar "recording/cast" icon Yes (Android 14+ cannot hide) โœ… No indicator
Foreground app callbacks No direct API, but indirect signals exist (virtual Display creation, mic focus, etc.) โœ… No callback path
FLAG_SECURE content Blacked out โš ๏ธ Also blacked out (system-level protection; the shell path cannot bypass it either). The difference: zero prompts, zero awareness for the target app

โš ๏ธ Honest boundary: this approach bypasses conventional perceptible signals. It does not modify the target app or inject any code. If the target app performs system-level self-checks via dumpsys (requires READ_LOGS/adb-level permission, which ordinary apps don't have) or applies digital watermarking/blur detection to its content, no recording approach can guarantee undetectability; FLAG_SECURE windows (banking apps, DRM video) are black on every capture path โ€” that is system-level content protection and equally unbypassable. The goal achieved in practice: every detection means available to an ordinary app fails.


๐Ÿ—๏ธ Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                 Android App                       โ”‚
โ”‚                                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚        Compose UI                            โ”‚ โ”‚
โ”‚  โ”‚  Home(status) ยท History ยท Settings          โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                       โ”‚                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚     RecordingSessionManager (singleton)      โ”‚ โ”‚
โ”‚  โ”‚  start/stop ยท state machine ยท duration       โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                       โ”‚                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚        ShellCapture (core)                   โ”‚ โ”‚
โ”‚  โ”‚  Shizuku shell session ยท stdout piping       โ”‚ โ”‚
โ”‚  โ”‚  ยท SIGINT stop ยท exit polling/watching       โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                       โ”‚                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  Triggers: App UI ยท OverlayManager ball      โ”‚ โ”‚
โ”‚  โ”‚           ยท TileService quick tiles          โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Key technical decisions:

  1. Direct shell invocation instead of Shizuku Binder APIs: screencap/screenrecord live in /system/bin and shell uid can execute them (verified). A persistent shell session is established via Shizuku.newProcess() (the SDK now ships through Porter's compatible layer while keeping the rikka.shizuku.* API, supporting both Shizuku and Porter backends); output streams back over stdout pipes and never touches public storage.
  2. Stop mechanism: screenrecord has no stop parameter โ€” sending SIGINT to the process finalizes the mp4 moov box (verified: SIGINT โ†’ clean, playable mp4). The same shell session holds the pid; stop = kill -INT <pid>.
  3. Session survival: the Shizuku shell process is independent of the app process โ€” killing the app mid-recording doesn't stop the capture; stop paths are the floating ball / tiles / time limit, triple-redundant.
  4. Silent design without foreground services: the recording body runs under shell uid, so the app itself holds no foreground service and shows no notification (Android 14+ mandatory FGS notifications therefore never apply).

๐Ÿ“ Project structure

RainyScreenShot/
โ”œโ”€โ”€ app/src/main/java/com/rainy/screenshot/
โ”‚   โ”œโ”€โ”€ capture/            # Core
โ”‚   โ”‚   โ”œโ”€โ”€ ShellExecutor.kt       # privileged shell session (Shizuku/Porter; stdout/exitcode/pid)
โ”‚   โ”‚   โ”œโ”€โ”€ ScreenshotEngine.kt    # screencap wrapper (PNG/RAW/display-id/-a)
โ”‚   โ”‚   โ”œโ”€โ”€ RecordingEngine.kt     # screenrecord wrapper (SIGINT stop/timeout)
โ”‚   โ”‚   โ””โ”€โ”€ CaptureConfig.kt       # capture parameter models
โ”‚   โ”œโ”€โ”€ session/
โ”‚   โ”‚   โ””โ”€โ”€ RecordingSessionManager.kt  # recording state machine + duration
โ”‚   โ”œโ”€โ”€ trigger/
โ”‚   โ”‚   โ”œโ”€โ”€ ScreenshotTileService.kt  # screenshot tile (collapse panel first)
โ”‚   โ”‚   โ””โ”€โ”€ RecordTileService.kt      # recording tile (collapse before toggle)
โ”‚   โ”œโ”€โ”€ overlay/
โ”‚   โ”‚   โ”œโ”€โ”€ FloatingBallService.kt    # floating control ball (OverlayManager)
โ”‚   โ”‚   โ””โ”€โ”€ FloatingBallController.kt # ball switch control (silent Shizuku grant)
โ”‚   โ”œโ”€โ”€ ui/
โ”‚   โ”‚   โ”œโ”€โ”€ home/          # Home: status card + quick capture + tile management
โ”‚   โ”‚   โ”œโ”€โ”€ history/       # Result browser (private app dirs)
โ”‚   โ”‚   โ”œโ”€โ”€ preview/       # Image/video preview (FileProvider sharing)
โ”‚   โ”‚   โ”œโ”€โ”€ settings/      # Parameter customization
โ”‚   โ”‚   โ””โ”€โ”€ theme/         # Rainy pink theme
โ”‚   โ””โ”€โ”€ data/
โ”‚       โ””โ”€โ”€ local/         # DataStore/SharedPreferences persistence
โ”œโ”€โ”€ gradle/libs.versions.toml
โ””โ”€โ”€ docs/
    โ””โ”€โ”€ TECH_NOTES.md      # Field-test archive (command behavior, exit codes, limits)

๐ŸŒ Localization

Three languages built in โ€” Simplified Chinese (default), Traditional Chinese, English. The app follows the system language automatically; on Android 13+ you can also pick one per-app in system settings (Languages โ†’ Rainy Screenshot).


๐Ÿ› ๏ธ Build

./gradlew assembleDebug
# APK output: app/build/outputs/apk/debug/app-debug.apk

Runtime prerequisite: Shizuku or Porter activated on the device (via ADB or Root) with permission granted to this app. The service backend can be switched in Settings (Automatic / Porter / Shizuku; force-stop and reopen to apply).


๐Ÿฑ About

RainyScreenShot is a member of the "Rainy Family" tools, developed and maintained by Rainy:

  • RainyLLM โ€” fully offline on-device LLM inference server for Android
  • RainyScanner โ€” Android QR scanner that never intercepts or redirects
  • Rainy2FA โ€” fully local, zero-network, biometric-protected TOTP authenticator
  • RainyToken โ€” AI balance & usage monitor
  • RainyScreenShot โ€” silent screenshot & recording tool (this project)

Comes quietly, records quietly ๐Ÿ“ท


๐Ÿ“„ License

MIT License ยฉ 2026 Rainy

Close

How Shizuku is used

Can take silent screenshots and record screen video via `screencap` and `screenrecord` through Shizuku shell.

This is an AI-assisted analysis of Shizuku-related usages in the app's public source code. It is best effort, so it may not catch every single usage.

How this app uses Shizuku

Through a privileged shell the app captures the screen silently without using the system capture prompt.

  • Take silent screenshots: saves PNG or raw screenshots with an optional display choice using the screencap shell command through Shizuku.
  • Record screen video: starts background screen recording with chosen resolution, bitrate, time limit and display options using the screenrecord shell command through Shizuku, then stops it cleanly so the video file is finalized and readable.
  • Grant floating overlay: enables its floating button without opening system settings using a privileged overlay grant through Shizuku.
  • Manage Quick Settings tiles: adds, checks and removes its screenshot and recording tiles and collapses the Quick Settings panel so the panel does not appear in captures, using system statusbar and settings commands through Shizuku.

Android APIs or commands used

  • screencap
  • screenrecord
  • appops set
  • cmd statusbar collapse
  • cmd statusbar add-tile
  • cmd statusbar remove-tile
  • settings get secure sysui_qs_tiles
  • pgrep
  • ps
  • kill -INT
  • cat /proc/.../cmdline
  • chmod 660
  • sh -c
Close

Changelog

What's new for version 0.1.4

What's Changed

New Contributors

Full Changelog: https://github.com/CATMIAOZHI/RainyScreenShot/compare/v0.1.3...v0.1.4

Close

Permissions

4 permissions requested

  • android.permission.SYSTEM_ALERT_WINDOW
  • moe.shizuku.manager.permission.API_V23
  • com.rainy.screenshot.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
  • eu.darken.porter.permission.API
Close