English | 日本語
A tiny KernelSU / KernelSU Next / Magisk module that removes the forced camera
shutter sound on Pixel and other AOSP devices sold in Japan and South Korea —
without changing your region, locale, or SIM, and without any /system footprint.
On JP/KR firmware, Android's AudioService sets mCameraSoundForced = true, which
routes the shutter through STREAM_SYSTEM_ENFORCED with FLAG_AUDIBILITY_ENFORCED.
That flag makes the sound play at an audible level regardless of volume or mute,
and the Camera app's toggle is greyed out.
mCameraSoundForced is computed at boot from a single framework boolean resource:
com.android.internal.R.bool.config_camera_sound_forced // true on JP/KR builds
The region logic that sets this to true lives in framework-res.apk and can't be
reached with setprop. (The runtime property audio.camerasound.locale.enabled
looks related but does not drive the decision on modern Pixel — flipping it does
nothing.)
This module overrides exactly one boolean resource with a fabricated RRO
(Runtime Resource Overlay), created at boot via cmd overlay fabricate:
| Resource | Original | Overridden to |
|---|---|---|
android:bool/config_camera_sound_forced |
true |
false |
Your region detection is left completely intact — locale stays ja-JP, the SIM
country stays jp, every other region-dependent behavior is untouched. Only the
result this one flag feeds into AudioService is overridden, so the shutter sound
follows normal volume/mute rules again.
overlay: com.android.shell:CameraSoundOff (priority max, target = framework-res.apk)
0x0111006d -> boolean 0x00000000 (bool/config_camera_sound_forced)
No APK is installed, no partition is mounted, no file is modified. Because it
does not use overlayfs, no metamodule is required and there is zero /system
footprint — it won't disturb root-hiding / Play Integrity setups.
- Root (KernelSU / KernelSU Next / Magisk).
cmd overlay fabricaterequires root; it cannot be done from plain non-rootadb. - Android 11+ (fabricated overlays /
idmap2FRRO support).
- Flash the release zip in the KernelSU / KernelSU Next / Magisk manager
(or
ksud module install pixel-shutter-silencer.zip). - Reboot.
- The shutter sound is gone. Verify below.
service.sh re-creates and re-enables the overlay on every boot (idempotent), so the
effect self-heals even if the overlay state is ever cleared.
adb shell su -c 'dumpsys audio | grep mCameraSoundForced' # expect: false
adb shell su -c 'cmd overlay list | grep CameraSoundOff' # expect: [x] ...Remove the module in your manager and reboot. uninstall.sh disables the overlay.
- Verified on Pixel 11 (Tensor G6), Android 17, KernelSU Next.
- Should work on any AOSP device where the shutter is forced through
config_camera_sound_forced. If your device forces it differently, open an issue with the output ofadb shell su -c 'dumpsys audio | grep -i camera'.
Some jurisdictions expect a camera shutter sound. Use responsibly and in line with local law. This is provided for personal customization of your own device.
./build.sh # produces dist/pixel-shutter-silencer.zipAudioService.readCameraSoundForced() returns the value of the framework resource
config_camera_sound_forced. A fabricated RRO is a runtime overlay that maps a
single resource ID to a new value, stored under /data/resource-cache and persisted
across reboots — no APK and no signing needed. We set that resource to false with
maximum priority, so the resolver returns false while the original true remains
untouched in framework-res.apk.
MIT (see LICENSE). The flashable-zip installer stub under
module/META-INF/ follows the widely-used Magisk module template convention.
Releases are built by GitHub Actions: push a tag vX.Y.Z (matching
module/module.prop version) and the workflow builds the zip and attaches it to
a GitHub Release.
git tag v1.0.0 && git push origin v1.0.0To enable in-manager auto-update, set your GitHub user in update.json (replace
<you>) and add this line to module/module.prop:
updateJson=https://raw.githubusercontent.com/<you>/pixel-shutter-silencer/main/update.json