WM修改屏幕分辨率 —加快手機運行速度—一機也能做適配
注:轉自微信原文
一、多機型 UI 適配
在 Android 開發的工作日常中,UI 適配是一件比較重要的事情。一般開發新的功能,有新的頁面,最終開發完成發佈之前,都需要讓設計師來審 UI 效果。
而有時候,明明我們已經在一款標準的 3 倍手機上,做到了讓設計師小姐姐滿意的效果,但是當換了另外一臺手機的時候,效果又不那麼如意。
傳統的做法是,拿到效果不對的手機,單獨適配看看是不是哪裏佈局寫的不對導致效果不正確,然後改正它。但是總能碰到我們拿不到真實設備的情況。
本文就介紹一個命令,可以修改你當前設備的參數,來模擬出目標設備的顯示效果,讓你獨立就把多機型 UI 效果確認的事情給做了。
二、WM 命令
2.1 什麼是 WM 命令
說的這麼厲害,實際上需要使用的就是一行 wm 命令,可以通過 adb shell
來操作它。
wm 命令主要用來幫助我們修改一些屏幕的參數,先來看看它的文檔。使用 adb shell wm
命令,可以方便的查看 wm 的文檔描述
可以看到,wm 命令可以幫助我們修改當前設備的 size 、 density 等參數,而這兩個參數就是決定了當前設備的顯示效果。
2.2 WM 的命令
從上面的文檔可以看出,它其實支持的命令還是挺多的,但是有一些根本用不上,是需要系統權限的,所以正常來說我們是無法使用的。那麼,還是介紹幾個比較實用的命令。
以下例子都是在一款標準 density 爲 3 的設備上運行的,屏幕像素爲 1080px * 1920px。
1、wm size
wm size
命令,可以用來查詢和修改當前設備的尺寸,如果想要修改尺寸,可以使用 px 或者 dp 爲單位(默認爲 px),使用 x 進行連接,這個其實看看 wm size
的輸出,你就清楚了。
在這裏的例子中,做了幾件事情:
- 使用
wm size
命令查看當前設備的尺寸。 - 使用
wm size
命令將當前尺寸修改成了 1000x2000。 - 再次使用
wm size
命令查看當前設備的尺寸。 - 最後使用
wm size reset
命令,將屏幕尺寸還原。 - 再用
wm size
命令,查看還原後的尺寸。
這幾個步驟就已經涵蓋了 wm size 命令的所有使用步驟,可以使用它查看當前屏幕尺寸,並且修改屏幕尺寸和還原它。
2、wm density
wm density
命令,可以用來查看和修改當前設備的 density 參數。
使用起來很簡單,直接上命令了。
在這個例子中,我做了幾件事情:
- 使用
wm density
查看當前設備的 density。 - 在使用
wm density
命令,修改當前設備的 density 爲 420。 - 然後再使用
wm density
查看修改後的參數。 - 最後使用
wm density reset
將設備的 density 還原。 - 最後再查看一下還原後的值。
3、wm overscan
wm overscan
命令,可以修改當前設備的屏幕內邊距。其實我覺得這個命令沒什麼用處,但是還是演示一下如何使用。
在這個例子中,做了幾件事情:
- 使用
wm overscan
修改邊距爲 20 。 - 然後使用
wm overscan reset
將其還原。
2.3 WM 命令的原理
wm 命令的邏輯非常的簡單,它實際上是和 WindowManagerService 進行交互,通過 WMS 來修改屏幕相關的一些參數。
這裏就不介紹完整的 wm 源碼了,就以一個方法舉例來看看 wm 的邏輯。這裏就以 wm size
命令舉例好了。
首先,看看 wm 命令的入口。
這裏會初始化 mWm ,並且根據輸入的參數,調用不同的方法,如果輸入的是 size ,則會調用 runDisplaySize()
方法。
在 runDisplaySize()
方法中,會先判斷 size 命令後面有沒有跟其它參數,如果沒有,則認爲是一次查詢操作,會將查詢到的結果輸出。
而如果是 reset 方法的話,就將 w 、h 這兩個代表寬高的值,設置爲 -1,最終會通過 mWm.clearForcedDisplaySize()
方法,將屏幕的 size 還原。
否者就從輸入的參數中,通過 x 進行分割,拿到我們輸入的寬高。最終通過 mWm.setForcedDisplaySize()
方法,將當前屏幕的 size 修改成我們輸入的結果。
在設置size 的時候,還會通過 parseDimens()
方法,重新計算一下輸入的尺寸。
從這裏可以看出,它支持兩個尺寸,px 和 dp ,如果如果不指定尺寸,則默認認爲是 px 。
到這裏就完成了一次通過 wm size
命令,修改設備屏幕參數的全過程,跟多細節可以自行查閱源碼。
源碼的在線地址:
http://androidxref.com/7.1.1_r6/xref/frameworks/base/cmds/wm/src/com/android/commands/wm/Wm.java
三、實施修改設備參數
既然已經講清楚 wm 命令的所有細節了,那麼我們只需要拿到我們需要適配的設備的 size 和 density。就可以在我們自己的設備上模擬出對應的效果。
我這裏收集了一些比較常用的設備參數,可以供大家參考一下。
- 魅族MX3:440,1080x1800
- 一加5:420,1080x1920
- 紅米NOTE,320,720x1280
- 華爲MATE7,480,1080x1812
- MOTO-G5,480,1080x1920
- Moto-tx1095,432,1080x1790
- Nexus5x,420,1080x1794
- Nexus6p,560,1440x2392
- 奇酷360,460,1080x1920
- VivoX5,320,720x1280
當然,最重要的是拿到公司各種 CEO、CTO、CxO 正在使用的手機參數,進行一波適配,哈哈。
下面,我們隨便挑兩個設備的參數進行修改,然後看看運行後的效果。
命令如下:
// 修改成 一加5
adb shell wm density 420
adb shell wm size 1080x1920
// 修改成 Moto-tx1095
adb shell wm density 432
adb shell wm size 1080x1790
下面,從做到右,分別是原本的尺寸、一加5、Moto-tx1095。
其實看着差異不大,只能說桌面佈局寫的挺好的,所以說,如果佈局寫的好的話,是可以避免在不同設備上看着很明顯的不同的問題 ,就像現在這樣。