ByteScope

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 も不要、どこにもアップロードしません。

Android ADB Toolbox を開く

関連コマンド

wm density と同じ作業で出てくるコマンド。

コマンド何をするか
wm sizeディスプレイの解像度を報告します。上書きすれば、端末は別の画面のふりをします。
screencapスクリーンショットを撮ります。端末上のファイルに書くか、PNG として標準出力に流します。
settings put設定プロバイダに値を書きます。開発者向けオプションのほとんどの裏にある仕組みです。

他の画面と取り込みコマンド

コマンド何をするか
screenrecord端末上の MP4 ファイルに画面を録画します。

Web ADB ツール群のパーサを書きながら、AOSP・toybox・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。

よくある質問

adb shell のコマンドはどう実行しますか?

端末で開発者向けオプションと USB デバッグを有効にし、ケーブルを繋いだうえで、platform-tools を入れた機械から adb shell <コマンド> を実行します。adb shell だけを実行すれば対話プロンプトが出て、接頭辞なしで打てます。スクリーンショットのようにバイナリを出力するコマンドでは adb shell ではなく adb exec-out を使ってください。素のシェルサービスは端末を割り当て、それが改行のバイトを書き換えてデータを壊します。

adb shell のコマンドに root は必要ですか?

このリファレンスにあるものには不要です。すべて shell ユーザーとして動き、自分の Android ユーザー向けのパッケージ管理、ほとんどの dumpsys サービスの読み取り、設定プロバイダへの書き込み、入力の注入、共有ストレージの読み取りができます。root が必要なのはこのリファレンスがあえて避けていること、つまり他のアプリのプライベートデータの読み取り(debuggable なビルドに対する run-as を除く)、システムパーティションへの書き込み、/data/anr の直接読み取りです。

自分の端末では出力が違って見えるのはなぜ?

Android のバージョンか、メーカーのどちらかです。一部のフラグやフィールドは特定のリリースから入ったもので、それはコマンドごとに注記しています。残りはメーカーによる改変で、いちばん影響が大きいのは dumpsys です。ダンプはデバッグ出力で、そのテキストはサービスの作者が最後に印字した内容そのもの、しかもメーカーはそれを変えて自分の変更をバックポートします。フィールドは位置ではなく名前で読み、見慣れない形は失敗ではなく差分として扱ってください。

端末ではなくブラウザから実行できますか?

多くのコマンドは可能です。このサイトの Web ADB ツール群は、Chromium 系のデスクトップブラウザから WebUSB で端末と話し、SDK のインストールも不要、どこにもアップロードしません。各ページは、該当するツールがあればそこへリンクしています。知っておく価値のある制限が 2 つあります。ADB インターフェイスを保持できるプログラムは同時に 1 つだけなので、デスクトップの adb server は先に止める必要があります。そして adb forward と adb reverse はブラウザでは一切動きません。

打つより押したい場合は、Web ADB Toolkit がこの種のコマンドをブラウザから USB 経由で実行します。あるいは全コマンドを見る。