柳市那些做網(wǎng)站的公司定制網(wǎng)站和模板建站
背景:
上面是正常屏幕1440x2960的屏幕大小,如果對display進行相關(guān)的修改,可以使用如下命令:
adb shell wm size 1080x1920
得出如下的畫面
明顯看到差異就是屏幕上下有黑邊了,那么下面就來調(diào)研這個wm size是怎么做的的display大小修改的
相關(guān)命令調(diào)研方式
adb shell dumpsys activity containers看看display的大小
這里可以看出當(dāng)前的displaycontent的大小就是固定的1080x1920
adb shell am stack list可以看到activity的configration大小也是1080x1920
RootTask id=1 bounds=[0,0][1080,1920] displayId=0 userId=0configuration={1.0 310mcc260mnc [zh_CN_#Hans,en_US] ldltr sw309dp w309dp h501dp 560dpi nrml port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 1920) mAppBounds=Rect(0, 0 - 1080, 1836) mMaxBounds=Rect(0, 0 - 1080, 1920) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s.125 fontWeightAdjustment=0}taskId=654: com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher bounds=[0,0][1080,1920] userId=0 visible=true topActivity=ComponentInfo{com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}RootTask id=3 bounds=[0,0][1080,1920] displayId=0 userId=0configuration={1.0 310mcc260mnc [zh_CN_#Hans,en_US] ldltr sw309dp w309dp h501dp 560dpi nrml port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 1920) mAppBounds=Rect(0, 0 - 1080, 1836) mMaxBounds=Rect(0, 0 - 1080, 1920) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.125 fontWeightAdjustment=0}taskId=4: unknown bounds=[0,0][1080,1920] userId=0 visible=falsetaskId=5: unknown bounds=[0,1920][1080,2880] userId=0 visible=false
分析角度dumpsys SurfaceFlinger:
可以看到Layer的buffer大小確實只是1080x1920的
從上面一系列的dumpsys可以得出結(jié)論,一旦wm size成了新的屏幕size后,整個系統(tǒng)的大小確實變化了,連displayContent也是變化的。
那么這里大家肯定有疑問,難道真的一個命令真的就可以隨意改變我們手機硬件屏幕的分辨率么?
當(dāng)然不是哈,其實上面的displaycontent大小只是軟件層面東西,真正手機屏幕大小其實一點沒有變化。
可以通過如下看出:
可以看到這里的
可以看出來這里申請sf申請送到hwc的buffer其實大小依然是1440x2960
那么sf是怎么做到把二者不同的屏幕大小統(tǒng)一的呢?
一樣在dumpsys SurfaceFlinger堆棧中查找到了如下輸出:
這里看到了一個transform,縮放參數(shù)是1.3333
這里剛好是1440 / 1080 = 1.3333
所以這里其實就是最核心的transform,有了它就可以把自定義的屏幕size和屏幕本身size進行統(tǒng)一,讓1440x2960大小屏幕可以顯示1080x1920屏幕大小內(nèi)容。
同時注意這里里面其實有一個參數(shù)layerStackSpace這里就是代表了自定義屏幕的大小rect參數(shù)
他是如何設(shè)置呢?看如下堆棧
堆棧:
到此基本上就對wm size進行了相關(guān)的解密,解釋清楚了為啥wm size可以任意改變屏幕大小
本文章更多詳細代碼和資料需要購買課程獲取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
私聊作者+v(androidframework007)
其他課程七件套專題:
點擊這里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
視頻試看:
https://www.bilibili.com/video/BV1wc41117L4/