settings put
端末を変える設定プロバイダに値を書きます。開発者向けオプションのほとんどの裏にある仕組みです。
- コマンド
- adb shell settings put
- コマンド
- 設定プロバイダ
- リスク
- 端末を変える
構文
settings put <system|secure|global> <key> <value>フラグと引数
| トークン | 意味 |
|---|---|
| system | secure | global | 名前空間。間違ったところに key を書くと、誰も読まない key が作られ、しかも黙って失敗します。 |
使用例
settings put global window_animation_scale 0.0アニメーションを 1 つ切ります。開発者向けオプションは実際には 3 つの倍率を設定し、残りは `transition_animation_scale` と `animator_duration_scale` です。
settings put system show_touches 1画面を触った位置に点を描きます。デモの録画に便利です。
settings put global http_proxy 10.0.0.5:8080端末の HTTP スタックを自分の機械のプロキシに向けます。
settings put global http_proxy :0プロキシを消します。`:0` はプラットフォーム自身の設定 UI が書く値です。
出力の読み方
成功時は何も出ません。無言が答えなので、出力がないことを信じるのではなく `settings get` で確かめてください。間違った名前空間への書き込みも、正しい書き込みと同じくらい無言です。
出力フィールド
| フィールド | 意味 |
|---|---|
| (no output) | 書き込みが受け付けられました。 |
| Exception / Permission Denial | このビルドでは shell ユーザーがその key を書けません。 |
必要な権限
root も `adb root` も要りませんが、この一族のうち本物のプラットフォーム権限に寄りかかるのはこちら側です。`settings` は `cmd settings "$@"` を実行する 1 行のシェルスクリプト(AOSP の `cmds/settings/settings.sh`)なので、書き込みは `shell` ユーザーとして試みられ、そのユーザーの正体である `com.android.shell` は自身のマニフェストで `android.permission.WRITE_SETTINGS` と `android.permission.WRITE_SECURE_SETTINGS` の両方を与えられています。認可済みのケーブル 1 本で、普通のアプリが触れない `secure` や `global` の key を変えられるのはそのためで、USB デバッグ自体を除いて開発者向けオプションが関門になっていないのもそのためです。ただしこの付与は key ごとの保証ではありません。個々の key はプロバイダに拒まれ得ますし、その拒否はきれいな 1 行のエラーではなく、下にスタックトレースを従えた例外のバナーとして届きます。そして stream の話は、成功した書き込みが何も印字しないぶん、この site のどこよりもここで効いてきます。値は標準出力、パーサの苦情は標準エラー、そして成功の合図は無言です。つまり「うまくいった」「拒否されたのにその拒否を捨てた」「誰も読まない名前空間に書いた」の 3 つは、標準エラーを残して key を読み返さない限り、まったく同じ観測になります。
エラーメッセージの読み解き
| メッセージ | 意味 |
|---|---|
| Bad arguments | 完全な要求ができる前にコマンドラインが終わりました。`put` では値が足りないという意味で、`settings put global http_proxy` だけならここに来ます。何も書かれておらず、どこが足りないかは名指しされないので、行全体を確認してください。 |
| Too many arguments | `put` が受け取るのは名前空間、key、値、任意の tag、そしてその後は `default` という語だけで、それ以上は拒否されます。罠はこのエラーの 1 語手前にあります。引用していない、空白 1 つを含む値は失敗せず、最初の語を値として書き、2 番目の語を黙って tag として受け取ります。値を引用し、そのうえで読み返してください。 |
| Argument expected to be 'default' | 位置引数が 5 つ与えられ、5 番目が `default` 以外でした。パーサがその位置に許すのは `default` だけで、それは値を新しいプラットフォーム既定にもするスイッチです。何も書かれていません。 |
| Exception occurred while executing 'put': | shell command のハンドラが `Throwable` を捕まえ、このバナーとスタックトレースを標準エラーに書きました。原因を名指しするのはその次の行で、`java.lang.SecurityException` なら値の形が悪いのではなく、プロバイダがその key を拒んだという意味です。標準エラーを残していなければ何一つ見えず、書き込みも起きていません。 |
| Invalid namespace 'gobal' | 名前空間は `system` / `secure` / `global` のいずれかで、大文字小文字は区別しません。解析は即座に止まるので何も書かれておらず、それは良い結末です。代わりの結末は、誰も読まない表に key が居座ることでした。 |
何が変わるか、そして戻る道
導出できる解毒剤はありません。プラットフォームは前の値を覚えないので、書く「前」に `settings get` で読み、その値を保管してください。いちばん痛いのはプロキシの key です。`global http_proxy` が設定されたまま端末を持ち出すと、どのネットワークでもインターネットが使えず、端末上には理由を説明するものが何もありません。空文字ではなく `settings put global http_proxy :0` で消してください。
バージョンとメーカーに関する注意
- 元に戻すとは古い値を書き戻すことで、そのためには先に読んでおく必要があります。このコマンド自身に取り消しはありません。
- 空文字でプロキシを消すのは確実ではありません。いくつかのビルドは 2 つの引用符をそのまま保存し、端末は無意味な宛先を向いたままになります。書くべき値は `:0` です。
- 「アニメーション off」は 1 つではなく 3 つの key です。window の倍率だけを設定しても、transition と animator は動いたままです。
これには UI があります
Android ADB Toolbox はこのコマンドを USB 経由で実行し、返ってきたものを解析します。Chromium 系ブラウザだけで、SDK も不要、どこにもアップロードしません。
関連コマンド
settings put と同じ作業で出てくるコマンド。
| コマンド | 何をするか |
|---|---|
| settings get | 端末の設定プロバイダから値を 1 つ読みます。 |
| am broadcast | ブロードキャスト intent を送ります。SystemUI の demo mode などプラットフォームのレシーバをシェルから動かす方法です。 |
| wm size | ディスプレイの解像度を報告します。上書きすれば、端末は別の画面のふりをします。 |
Web ADB ツール群のパーサを書きながら、AOSP・toybox・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。