前言

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:保持设备自然方向;
  • 当前设备自然方向正好是横屏。

13 会分别将整个显示旋向两侧。

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

也就是说:

  1. Waydroid 整体是大型横屏设备;
  2. 应用启动后主动要求竖屏;
  3. Android 为它划出一个竖屏区域;
  4. 应用只能看到竖屏兼容框;
  5. 最终表现为横屏中间的一台“大手机”。

七、检查设备身份

继续检查 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

该文件不适合作为长期配置入口,因为它可能在升级、初始化或重新生成配置时被覆盖。

正确做法是:

  1. 修改 waydroid.cfg
  2. 将属性写入 [properties]
  3. 使用 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 平板设备。

Leave a Reply

Your email address will not be published. Required fields are marked *