settings put
changes the deviceWrites a value into the settings provider — the mechanism behind most developer-options tricks.
- Command
- adb shell settings put
- Commands
- Settings provider
- Risk
- changes the device
Syntax
settings put <system|secure|global> <key> <value>Flags and arguments
| Token | Meaning |
|---|---|
| system | secure | global | The namespace. Writing a key into the wrong one creates a key nothing reads, and it fails silently. |
Examples
settings put global window_animation_scale 0.0Turn one animation off. Developer options actually sets three scales; `transition_animation_scale` and `animator_duration_scale` are the other two.
settings put system show_touches 1Draw a dot where the screen is touched — useful for recording a demo.
settings put global http_proxy 10.0.0.5:8080Point the phone's HTTP stack at a proxy on your machine.
settings put global http_proxy :0Clear the proxy. `:0` is what the platform's own settings UI writes.
Reading the output
Nothing on success. Silence is the answer, so verify with `settings get` rather than believing the absence of output — a write into the wrong namespace is just as silent as a correct one.
Output fields
| Field | Meaning |
|---|---|
| (no output) | The write was accepted. |
| Exception / Permission Denial | The shell user may not write that key on this build. |
What access it needs
No root and no `adb root`, but this is the half of the family that leans on a real platform permission. `settings` is a one-line shell script running `cmd settings "$@"` (AOSP `cmds/settings/settings.sh`), so the write is attempted as the `shell` user, and `com.android.shell` — the package that user runs as — is granted both `android.permission.WRITE_SETTINGS` and `android.permission.WRITE_SECURE_SETTINGS` in its own manifest. That is why an authorised cable can change `secure` and `global` keys no ordinary app may touch, and why nothing in developer options gates it beyond USB debugging itself. What the grant does not give you is a guarantee per key: an individual key can still be refused by the provider, and a refusal arrives as an exception banner with a stack trace under it rather than as a tidy one-line error. Then there is the stream question, which matters more here than anywhere else on this site, because a successful write prints nothing at all. Values go to stdout, parser complaints go to stderr, and silence is the success signal — so "it worked", "it was rejected and you threw the rejection away" and "it wrote into a namespace nothing reads" are the same observation unless you keep stderr and read the key back afterwards.
Failure messages, decoded
| Message | Meaning |
|---|---|
| Bad arguments | The command line ended before a complete request existed. For `put` that means the value is missing: `settings put global http_proxy` alone lands here. Nothing was written, and nothing names which piece was short, so check the whole line. |
| Too many arguments | `put` accepts a namespace, a key, a value, an optional tag and then only the literal word `default`; anything beyond that is refused. The trap is one word short of this error: an unquoted value with a single space in it does not fail, it writes the first word as the value and silently takes the second as the tag. Quote the value, then read it back. |
| Argument expected to be 'default' | Five positional arguments were supplied and the fifth was something else. The parser only allows `default` in that position, which is the switch that also makes the value the new platform default. Nothing was written. |
| Exception occurred while executing 'put': | The shell-command handler caught a `Throwable` and wrote this banner plus the stack trace to stderr. The line after it names the cause: a `java.lang.SecurityException` means the provider refused that particular key, not that the value was malformed. You only see any of it if you kept stderr, and the write did not happen. |
| Invalid namespace 'gobal' | The namespace has to be `system`, `secure` or `global`, matched case-insensitively. Parsing stops immediately, so nothing was written — which is the good outcome, because the alternative is a key sitting in a table nothing reads. |
What it changes, and the way back
There is no derivable antidote: the platform does not remember what the value was, so read it with `settings get` *before* you write and keep that number. The proxy key is the one that bites hardest — a phone that leaves the building with `global http_proxy` set has no working internet on any network and nothing on the phone explains why. Clear it with `settings put global http_proxy :0`, not with an empty string.
Version and vendor notes
- Restoring means writing the old value back, which means having read it first. The command has no undo of its own.
- Clearing the proxy with an empty string does not work reliably: several builds store the two quote characters literally and leave the phone pointed at nothing useful. `:0` is the value to write.
- "Animations off" is three keys, not one. Setting only the window scale leaves transitions and animators running.
We have a UI for this
Android ADB Toolbox runs this command over USB and parses what comes back — a Chromium browser, no SDK, nothing uploaded.
Related commands
Commands that turn up in the same session as settings put.
| Command | What it does |
|---|---|
| settings get | Reads one value out of the phone's settings provider. |
| am broadcast | Sends a broadcast intent, which is how SystemUI demo mode and other platform receivers are driven from a shell. |
| wm size | Reports the display's resolution, or overrides it so the phone pretends to be a different screen. |
Checked against AOSP, toybox and kernel sources while writing the parsers behind our Web ADB tools. Where a behaviour genuinely varies by Android version or manufacturer, this page says so instead of giving a number that would be wrong on half the phones out there.