pengchujin 说明 Aerial 4K 画布在 Q10L 上的实现与验证
pengchujin 说明 Aerial 1.51 通过独立 HardwareRenderer 和 3840×2160 SurfaceView 绘制 4K 画布,Q10L 默认不自动开启,需在真机强制测试并保留关闭方式。
作者原文@pengchujin谢谢这么完整的排查,dumpsys 的对比把问题说得很清楚。先承认一点:之前说的「4K 适配」只在系统直接给 App 4K 窗口时才生效(Aerial 按窗口大小决定画布密度),Q10L 给第三方的窗口是 1920×1080,所以在你这台上从来没起过作用。
1.51 加了「4K 画布」:你说的 SurfaceControlViewHost 收不到按键,我换了个接法。Compose 照常在 Activity 的 1080p 窗口里排版,按键和焦点不变;只把「画」这一步挪走:录成 RenderNode、放大 2 倍,用单独的 HardwareRenderer 画进一个
setFixedSize(3840, 2160)的 SurfaceView;航拍视频的 SurfaceView 留在窗口里、垫在下面。图层的形状和你抓到的 TCL 桌面一样:3840×2160 缓冲,0.5 缩放。在 4K 模拟器上的对比(1:1 截取,上面是现在的 1080p 放大,下面是 4K 画布):compare
Q10L 上它不会自动打开:自动打开的条件是系统报的显示模式至少是界面的 2 倍,而 Q10L 报的显示模式是 1080p。关键的一步模拟器验证不了:MTK 的 HWC 会不会像对 TCL 桌面那样,把这一层 1:1 送到面板。所以想请你升级到 1.51 后强制打开试一下:
adb shell am broadcast -n app.orchard.tv/.guard.ConfigReceiver --ez uhd_canvas true adb shell am force-stop app.orchard.tv # 从遥控器打开 Aerial,停在主屏幕,左右来回移动焦点一会儿,然后: adb logcat -d -s AerialDiag | grep -E "uhd|display " adb shell dumpsys SurfaceFlinger > sf.txt # 看 SurfaceView[app.orchard.tv...] 那层的 geomBufferSize,和 HWC 表里它的 Disp Frame / Comp Type最重要的还是肉眼对比:文字是不是和 TCL 桌面一样锐利,移动焦点卡不卡。想关掉就把
true改成false再 force-stop;--es uhd_canvas auto是回到自动。另外,TCL 的 UHD 名单:要是名单只要普通 App 拿得到的权限(比如 ADB 授予的
WRITE_SECURE_SETTINGS),或者存在某个可写的设置里,让 Aerial 进名单就最省事。方便的话请把这几个拉下来传到网盘或附在这里,我反编译看updateUhdActivityList在哪个服务、要什么权限:adb pull /system/framework/framework.jar adb pull /system/framework/services.jar adb shell ls /system/framework /system_ext/framework /vendor/framework adb shell service list | grep -i -E "tcl|uhd|4k"
ls里有 TCL 自己的 jar(名字带 tcl)也一并拉一下。如果两条路都不行,我会在文档里写清楚「Q10L 上第三方桌面只能拿到 1080p」。