前言
Waydroid 在 Linux 桌面上运行 Android 时,常见用法有两种:
- 将每个 Android 应用作为独立桌面窗口运行;
- 将整个 Waydroid Full UI 当作一台完整 Android 设备使用。
本文讨论第二种场景:不启用多窗口模式,而是让整个 Waydroid 窗口表现为一台大尺寸横屏 Android 平板。
测试环境具备以下特点:
- Linux 桌面运行于 Wayland;
- 物理显示器为 4K;
- 桌面缩放比例为 150%;
-桌面面板位于屏幕左侧; - Waydroid 以完整 Android 界面运行;
- Android 应用需要尽量启用真正的平板布局,而不只是把手机界面旋转或放大。
最终问题并不在分辨率、DPI 或旋转角度,而在于:
Waydroid 虽然拥有足够大的屏幕尺寸,却仍向应用报告自己是普通设备,而不是平板设备。
解决办法是在 Waydroid 持久配置中,将设备类型声明为 tablet。
一、问题表现
Waydroid Full UI 本身已经可以横屏显示,Android 桌面、搜索栏和底部导航也都处于正确方向。
但部分应用仍然存在异常:
- 应用只能以竖屏比例运行;
- 应用位于横屏中央;
- 两侧出现大片空白;
- 界面看起来像一台被放大的竖屏手机;
- 同一个应用在真实 Android 平板上却能够正常横屏显示。
这说明问题不能简单归结为“应用不支持平板”。
二、先明确目标:不是桌面多窗口模式
Waydroid 支持让 Android 应用分别显示成 Linux 桌面窗口,例如:
waydroid prop set persist.waydroid.multi_windows true
但这种模式并不适合将 Waydroid 当作完整平板使用。
正确目标应当是:
Waydroid Full UI
├── 整个 Android 系统显示在一个窗口内
├── 系统自然方向为横屏
├── Android 将设备识别为大屏平板
└── 应用根据平板条件加载横屏或大屏布局
因此应保持多窗口模式关闭:
waydroid prop set persist.waydroid.multi_windows false
三、旋转设置的误区
Android 的 user_rotation 支持四个值:
0 = 设备自然方向
1 = 相对自然方向旋转 90°
2 = 相对自然方向旋转 180°
3 = 相对自然方向旋转 270°
需要注意:
0并不固定代表竖屏,它代表设备自身定义的自然方向。
如果 Waydroid 的虚拟显示本身就是宽屏,那么:
sudo waydroid shell settings put system user_rotation 0
反而可能正好是正确的横屏方向。
在本次环境中,最终正确设置是:
sudo waydroid shell settings put system accelerometer_rotation 0
sudo waydroid shell settings put system user_rotation 0
其中:
accelerometer_rotation=0:关闭自动旋转;user_rotation=0:保持设备自然方向;- 当前设备自然方向正好是横屏。
而 1 和 3 会分别将整个显示旋向两侧。
4 并不是额外角度。Android 没有第五种离散旋转方向,写入无效值不会产生新的显示角度。
四、忽略应用方向请求仍然无法解决
为了阻止某些应用把整个 Waydroid 旋转成竖屏,可以使用:
sudo waydroid shell wm set-ignore-orientation-request true
检查状态:
sudo waydroid shell wm get-ignore-orientation-request
预期输出类似:
ignoreOrientationRequest true for displayId=0
这条设置确实有效,但它的作用容易被误解。
它做的是:
不允许应用改变整个显示器的方向。
它并不会:
强制应用加载横屏平板布局。
因此,对于明确声明自己必须竖屏的应用,Android 仍可能采用兼容模式:
横屏显示器
┌──────────────────────────────────────┐
│ ┌──────────────┐ │
│ │ │ │
│ │ 竖屏应用 │ │
│ │ │ │
│ └──────────────┘ │
└──────────────────────────────────────┘
这种显示方式称为 letterbox,即固定方向兼容框。
五、确认 Waydroid 的屏幕尺寸已经足够大
首先检查 Android 看到的屏幕尺寸与密度:
sudo waydroid shell wm size
sudo waydroid shell wm density
测试环境返回了类似结果:
Physical size: 3360x2100
Physical density: 270
将像素换算为 Android 的 dp:
宽度:3360 × 160 ÷ 270 ≈ 1991 dp
高度:2100 × 160 ÷ 270 ≈ 1244 dp
Android 常以最小宽度 600dp 作为大屏和平板布局的重要分界。
当前最小宽度已经超过 1200dp,远高于普通平板标准。
因此可以排除:
- 分辨率过低;
- DPI 过高;
- 屏幕逻辑宽度不足;
- 未达到
sw600dp; - Wayland 150% 缩放导致 Android 仍被识别为手机尺寸。
换句话说:
Waydroid 的屏幕已经足够像一台大型平板,但设备身份仍然不像平板。
六、通过 dumpsys 找到真正原因
让问题应用保持在前台,然后检查 Activity 状态:
sudo waydroid shell dumpsys activity activities |
grep -A 40 -B 5 '<应用包名>'
关键输出可能包含:
requestedOrientation=SCREEN_ORIENTATION_PORTRAIT
overrideOrientation=SCREEN_ORIENTATION_PORTRAIT
这表明应用主动请求竖屏。
同时还能看到:
areBoundsLetterboxed=true
letterboxReason=FIXED_ORIENTATION
这表示 Android 正在使用固定方向兼容框,而不是让应用占满横屏。
更关键的是,全局配置与应用配置明显不同。
全局显示可能是:
sw1244dp
w1991dp
land
但应用实际获得的配置却可能变成:
sw743dp
w743dp
h1160dp
port
也就是说:
- Waydroid 整体是大型横屏设备;
- 应用启动后主动要求竖屏;
- Android 为它划出一个竖屏区域;
- 应用只能看到竖屏兼容框;
- 最终表现为横屏中间的一台“大手机”。
七、检查设备身份
继续检查 Waydroid 向应用报告的设备属性:
for p in \
ro.build.characteristics \
ro.product.manufacturer \
ro.product.brand \
ro.product.model \
ro.product.device
do
printf '%-28s ' "$p"
sudo waydroid shell getprop "$p"
done
默认环境可能返回类似内容:
ro.build.characteristics default
ro.product.manufacturer Waydroid
ro.product.brand waydroid
ro.product.model WayDroid x86_64 Device
ro.product.device waydroid_x86_64
其中最值得注意的是:
ro.build.characteristics=default
这意味着 Waydroid 没有明确声明自身是平板设备。
部分 Android 应用并不会只检查 sw600dp,还可能综合判断:
ro.build.characteristics- 设备型号
- 厂商名称
- CPU 架构
- 触摸屏能力
- 电话功能
- 系统构建特征
- PackageManager 提供的设备功能
因此,即便屏幕已经达到 sw1244dp,应用仍可能把 Waydroid 当作普通设备或手机环境。
八、核心修复:将设备类型声明为 tablet
Waydroid 的持久配置文件中可以加入自定义 Android 属性。
为避免泄露具体系统布局,本文统一将配置路径写为:
<Waydroid 数据目录>/waydroid.cfg
修改前应先备份原文件。
推荐备份方式:
cd '<Waydroid 数据目录>'
f=waydroid.cfg
old="${f}.$(date -r "$f" +%Y%m%d-%H%M%S)"
sudo mv -- "$f" "$old"
sudo cp -a -- "$old" "$f"
sudo ls -l --time-style=long-iso -- "$old" "$f"
这种方式具有几个优点:
- 备份名使用原文件的修改时间;
- 原文件先通过
mv保留下来; - 再用
cp -a创建工作副本; - 权限、属主、时间戳和扩展属性更容易保留。
随后在配置文件的 [properties] 区段加入:
[properties]
ro.build.characteristics = tablet
如果 [properties] 已经存在,只需增加这一行,不要重复创建区段。
例如:
[properties]
ro.build.characteristics = tablet
ro.product.cpu.abilist = ...
ro.product.cpu.abilist32 = ...
ro.product.cpu.abilist64 = ...
九、不要直接长期修改生成文件
Waydroid 数据目录中通常还会存在一个生成后的属性文件,例如:
waydroid_base.prop
该文件不适合作为长期配置入口,因为它可能在升级、初始化或重新生成配置时被覆盖。
正确做法是:
- 修改
waydroid.cfg; - 将属性写入
[properties]; - 使用 Waydroid 自己的离线更新流程重新生成属性文件。
执行:
sudo waydroid upgrade --offline
--offline 表示使用本地已有镜像和配置重新生成相关文件,不需要重新下载 Android 镜像。
随后检查生成结果:
sudo grep '^ro\.build\.characteristics=' \
'<Waydroid 数据目录>/waydroid_base.prop
预期:
ro.build.characteristics=tablet
十、验证属性是否真正进入 Android
重新启动 Waydroid Full UI 后执行:
sudo waydroid shell getprop ro.build.characteristics
预期结果:
tablet
如果仍然显示:
default
说明属性没有进入当前 Android 实例,需要检查:
- 是否修改了正确的配置文件;
[properties]是否拼写正确;- 是否执行了离线重新生成;
- Waydroid Session 是否完全停止并重新启动;
- 是否存在重复属性定义。
十一、最终横屏平板设置
完整生效后,可以继续保留以下设置:
sudo waydroid shell settings put system accelerometer_rotation 0
sudo waydroid shell settings put system user_rotation 0
sudo waydroid shell wm set-ignore-orientation-request true
验证:
sudo waydroid shell getprop ro.build.characteristics
sudo waydroid shell wm size
sudo waydroid shell wm density
sudo waydroid shell wm get-ignore-orientation-request
预期状态类似:
ro.build.characteristics = tablet
显示尺寸 = 宽屏高分辨率
显示密度 = 适合桌面缩放
自然方向 = 横屏
ignoreOrientationRequest = true
十二、修复后的实际变化
修改前,应用表现为:
横屏 Waydroid
└── 中央竖屏应用
├── 两侧大量留白
├── 手机式导航
├── 单列或窄列布局
└── letterbox 固定方向兼容模式
修改后,应用切换为:
横屏平板布局
├── 横向顶部导航
├── 宽屏搜索栏
├── 多列应用卡片
├── 横向大型 Banner
├── 平板侧边导航栏
└── 内容区域完整利用屏幕宽度
这不是简单的旋转或拉伸,而是应用真正加载了自己的平板界面。
十三、为什么修改一个属性就能生效
应用在启动时可能存在类似判断逻辑:
屏幕最小宽度足够大?
│
├── 否 → 手机界面
│
└── 是
│
├── 设备类别是 tablet → 平板横屏界面
│
└── 设备类别不明确 → 保守使用手机界面
Waydroid 原先虽然满足:
sw1244dp
land
xlrg
但设备特征仍是:
ro.build.characteristics=default
将其改为:
ro.build.characteristics=tablet
后,应用的设备判断条件同时得到满足,于是启用了真正的大屏布局。
十四、这次排查中容易走的弯路
1. 一直尝试不同旋转角度
user_rotation 只能改变方向,不能改变设备类别。
旋转正确 ≠ 平板识别正确
2. 继续降低 DPI
当前最小宽度已经远高于 600dp,继续降低 DPI只会让文字和控件变得更小,不会解决设备类型识别。
3. 继续增大分辨率
当屏幕已经达到约 2000dp × 1200dp 时,再增加分辨率没有意义。
4. 认为 ignoreOrientationRequest=true 会强制横屏布局
这条设置只能阻止应用旋转整个显示器,不能修改应用内部的平板判断逻辑。
5. 伪装成某个具体品牌或型号
本次修复不需要修改:
ro.product.manufacturer
ro.product.brand
ro.product.model
ro.product.device
仅将通用设备类型改为 tablet 就已经成功。
相比伪装具体厂商,这种修改:
- 影响范围更小;
- 更容易恢复;
- 不涉及具体设备指纹;
- 不容易触发额外兼容问题。
十五、恢复原状
如需恢复默认设备类型,可在配置文件的 [properties] 中删除:
ro.build.characteristics = tablet
随后重新生成属性文件:
sudo waydroid upgrade --offline
完全停止并重新启动 Waydroid,再检查:
sudo waydroid shell getprop ro.build.characteristics
恢复后通常会重新显示:
default
结语
将 Waydroid Full UI 变成真正的横屏 Android 平板,不能只关注分辨率与旋转设置。
本次问题的完整逻辑是:
高分辨率横屏
+
足够大的 dp 尺寸
+
固定自然横屏
+
忽略应用旋转显示器
+
ro.build.characteristics=tablet
↓
应用真正启用平板布局
最关键的一行配置是:
ro.build.characteristics = tablet
它让 Waydroid 不再只是“一块很大的 Android 屏幕”,而是成为应用能够正确识别的 Android 平板设备。