wm density
端末を変えるディスプレイの密度を報告、または上書きします。レイアウトのブレークポイントを実際に動かすのはこちらです。
- コマンド
- adb shell wm density
- コマンド
- 画面と取り込み
- リスク
- 端末を変える
構文
wm density [<dpi> | reset]フラグと引数
| トークン | 意味 |
|---|---|
| <dpi> | 報告させる密度。Android 自身のバケットは 120 から 640 で、ベンダーはその間の値も出荷します。 |
| reset | 上書きを外して物理密度に戻します。 |
使用例
wm density報告のみ。
wm density 420`wm size 1080x2340` と組み合わせると幅 411 dp の端末になり、これは実在するブレークポイントです。
wm density reset取り消し。
出力の読み方
出力例
Physical density: 560
Override density: 420`wm size` と同じ形です。Physical は常に、Override は設定されている間だけ。どのレイアウトになるかを決めるのは dp なので、意味のある量は「幅のピクセル × 160 ÷ この dpi」です。420 dpi の 1080 px は 411 dp、同じ 1080 px を 320 dpi にすると 540 dp のタブレット寄りのレイアウトになります。
出力フィールド
| フィールド | 意味 |
|---|---|
| Physical density | パネルの実際の dpi。 |
| Override density | 代わりに報告されている値。上書きが設定されている間だけ現れます。 |
必要な権限
root も `adb root` も不要です。`wm` は `cmd window "$@"` を実行する 1 行のシェルスクリプト(AOSP の `cmds/wm/wm.sh`)で、上書きが通る `setForcedDisplayDensityForUser` と `clearForcedDisplayDensityForUser` には `@EnforcePermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)` が付いています。`com.android.shell` は自身のマニフェストでその権限を与えられているので、認可済みのケーブル 1 本で足り、USB デバッグを超える開発者向けオプションのスイッチは関係しません。ただし持ち歩く価値のある非対称が 1 つあります。density の呼び出しはユーザー id を取り、shell command は `USER_CURRENT` を渡しますが、size の呼び出しはユーザーをまったく取りません。つまり density の上書きは前面にいる人に対して記録されるので、第 2 のユーザーや仕事用プロファイルのある端末では、片方に上書きが見えてもう片方には見えないということが起こります。size の上書きにはその次元がありません。もう半分は権限ではなく境界の話です。shell command は window manager を呼ぶ前に 72 未満を断りますが、上限はまったくありません。この site が課している範囲はプラットフォームのものではなく自前の正気の確認で、プラットフォームのほうはボタンが 1 個半しか残らない密度も平気で受け入れます。
エラーメッセージの読み解き
| メッセージ | 意味 |
|---|---|
| Error: density must be >= 72 | 下限は window manager を呼ぶ前に `runDisplayDensity` 自身が確認するので、何も変わっていません。確認が「ない」場所に注意してください。対応する上限はないので、打ち間違えた `4200` は受け入れられて適用されます。試す前に `wm density reset` を画面に出しておいてください。 |
| Error: bad number | 例外自身の `toString()` が末尾に付き、失敗したトークンを名指しします。`wm size` と違ってこの引数は素の整数として解析され、`dp` や `px` の接尾辞の処理はありません。だから `420dpi` は 420 の気の利いた書き方ではなく構文エラーです。 |
| Error: the uniqueId is invalid | `-u <uniqueId>` の形に、display manager が知らない id が渡され、コマンドは何も読まず何も設定せずに戻ります。行末の前の空白は上流自身のものなので、行全体ではなくテキストで照合してください。 |
| Remote exception: | 報告の経路が window manager に届かず、density の代わりにこれと例外を印字しました。0 ではなく「不明」として扱ってください。dpi の 0 が dp の計算に流れ込むとゼロ除算になり、それが 1 回の読み取り失敗をページ一面の無意味に変える経路です。 |
| cmd: Can't find service: window | `wm.sh` は `cmd window` の薄い包みでしかないので、`cmd` がサブコマンドを渡す先の `window` サービスを見つけられませんでした。起動途中、`system_server` がそれを公開する前なら想定内です。ディスプレイに density がないと結論せず、起動を待ってください。 |
何が変わるか、そして戻る道
サイズの上書きと同じく再起動をまたいで残り、設定アプリを含む端末上のすべての UI 要素の縮尺を変えます。端末のパネルで密度 800 にすると、ボタンが 1 個半しか見えない状態になり、タップで抜け出すことはできません。`wm density reset` が戻る道です。試す前に手元に置いてください。
バージョンとメーカーに関する注意
- density だけ、あるいはサイズだけを変えると、存在しない端末の形になります。両方設定してください。
- 0 やとんでもなく大きい値は、画面を試す方法ではなく読めなくする方法です。
これには UI があります
Android ADB Toolbox はこのコマンドを USB 経由で実行し、返ってきたものを解析します。Chromium 系ブラウザだけで、SDK も不要、どこにもアップロードしません。
関連コマンド
wm density と同じ作業で出てくるコマンド。
| コマンド | 何をするか |
|---|---|
| wm size | ディスプレイの解像度を報告します。上書きすれば、端末は別の画面のふりをします。 |
| screencap | スクリーンショットを撮ります。端末上のファイルに書くか、PNG として標準出力に流します。 |
| settings put | 設定プロバイダに値を書きます。開発者向けオプションのほとんどの裏にある仕組みです。 |
他の画面と取り込みコマンド
| コマンド | 何をするか |
|---|---|
| screenrecord | 端末上の MP4 ファイルに画面を録画します。 |
Web ADB ツール群のパーサを書きながら、AOSP・toybox・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。