模拟与调试

PXA DEVELOPER GUIDE

Profile 与多设备模拟

选择四种现有屏幕,创建自己的 TOML Profile,并隔离多台模拟设备的安装状态。

中文指南 · 11 分钟阅读 · 开发版

Profile 描述桌面窗口中的设备显示与输入语义。同一个桌面 App 包可以分别放到横屏、竖屏、圆角屏和圆屏中检查布局,无需为每种屏幕重新烧录固件。

1. 当前有哪些 Profile

工作区 Profile 位于 simulator/profiles/<名称>.toml。以下数值来自当前仓库:

Profile 逻辑尺寸 外形与安全边距 默认语言
generic 390×844 矩形;未指定 inset,默认 0 en-US
pai-touch 296×240 圆角半径 58;[8,10,8,10] zh-CN
sensecap-watcher 412×412 圆屏;[60,60,60,60] zh-CN
esp32s31-korvo-1 800×480 矩形;未指定 inset,默认 0 zh-CN

四种配置当前都选择 dark 主题并启用标准 UI 手势。屏幕边距排列为上、右、下、左。

tools/simulator.sh ui --profile generic
tools/simulator.sh ui --profile pai-touch
tools/simulator.sh ui --profile sensecap-watcher
tools/simulator.sh ui --profile esp32s31-korvo-1

逐条启动,关闭窗口后再尝试下一种即可比较系统 UI。若 hello 已登记到 catalog,直接运行真实应用:

tools/dev.sh sim hello --profile sensecap-watcher --watch

工作区的 TOML Profile 名称与底层独立程序的内置 compact、phone、round 不是同一套入口。使用工作区脚本时传 TOML 文件名去掉扩展名后的名称。

屏幕实拍:四种 Profile

以下是桌面模拟器的原始帧截图,展示同一组应用目录在不同尺寸、语言和安全区下的启动器布局。09:41 和 86% 电量是截图时设置的模拟状态。图标表示目录中的应用,实际运行仍需要先构建并安装对应桌面包。

Pai Touch 圆角横屏启动器,296×240

pai-touch · 296×240 · 中文 · 圆角半径 58,小屏需要检查标题截断与触控空间。 点击图片查看原图。

Generic 竖屏启动器,390×844

generic · 390×844 · 英文,观察长屏下的布局与中英文标题差异。 点击图片查看原图。

SenseCAP Watcher 圆屏启动器,412×412

sensecap-watcher · 412×412 · 中文 · 四边安全区各 60 像素,重点检查圆形边缘。 点击图片查看原图。

Korvo 横屏启动器,800×480

esp32s31-korvo-1 · 800×480 · 中文,观察更宽的应用网格与留白。 点击图片查看原图。

2. 完整 Profile 示例

新建 simulator/profiles/watch-240.toml,内容如下。不要覆盖现有板子的配置:

[desktop]
width = 240
height = 240
round = true
safe_insets = [36, 36, 36, 36]
shape_background = "black"
locale = "zh-CN"
theme = "dark"
gestures = true

这是一块用于布局测试的虚拟圆屏,安全边距是示例值,应按实际产品的有效显示区与交互要求调整。运行:

tools/simulator.sh ui --profile watch-240
tools/dev.sh sim hello --profile watch-240 --watch

Profile 名称只使用小写字母、数字和连字符;传入 watch-240,不是完整文件路径,也不带 .toml。新建 Profile 不需要创建同名 BSP,App 开发可以继续使用默认 --board pai-touch。

3. 字段参考

字段 类型与默认值 含义或约束
width、height 必填正整数 逻辑显示像素尺寸
round 布尔值,默认 false 启用圆屏语义;圆屏示例使用相等宽高
corner_radius 非负整数,默认 0 不超过短边一半,不能与 round=true 同时启用
safe_insets 四个整数,默认 [0,0,0,0] 上、右、下、左;每项 0..65535;仍须自己保证剩余内容区合理
shape_background matte 或 black,默认 matte 面板形状以外的主机背景,不是应用背景色
locale 非空字符串,默认 en-US 例如 zh-CN、en-US;应用需要对应翻译和字体
theme dark / light / custom,默认 dark 标准 UI 的主题选择;不是任意颜色值
gestures 布尔值,默认 false 标准 UI 的系统手势配置

脚本没有通用的 scale、dpi、rotation 或 GPIO 配置字段;不要凭直觉在 TOML 中加入这些键并期待生效。横竖屏布局测试通过合适的宽高与安全区表达,真实面板旋转和触控变换仍在 BSP 中实现。

当前 product 路径转发尺寸、形状、安全区、背景和语言参数,不直接转发 TOML 的 theme 与 gestures 开关。主题联调应在标准 UI 与实际系统主题通路中验证,不能假定每个运行模式对所有字段都有相同效果。

4. 理解安全区与圆角

safe_insets = [8,10,8,10] 表示顶部 8、右侧 10、底部 8、左侧 10 像素,不是 CSS 的任意简写格式。以 296×240 屏幕为例,减去这些边距的参考区域为 276×224;系统栏或应用布局可能再占据部分区域。

边距是提供给系统和应用的布局信息,不应假设它会自动挪动所有硬编码坐标。按钮、文字和关键提示要明确落在可见安全区;背景或装饰可以延伸到圆角边缘。

shape_background 只影响主机窗口中圆形或圆角面板外部的颜色。PNG 截图的形状外像素保留为透明,不能靠它改变应用实际背景。

5. 同一个包切换不同设备外形

只改变显示形态时,可以构建一次桌面包,然后分别运行:

tools/app.sh build hello --target simulator

tools/simulator.sh product --profile pai-touch \
  --package local/app-output/pai-touch/pxa-hello

tools/simulator.sh product --profile sensecap-watcher \
  --package local/app-output/pai-touch/pxa-hello

命令默认用开发夹具公钥;如果包使用自己的私钥签名,追加 --publisher-key local/keys/publisher-public.der。这里包路径仍在 pai-touch 输出目录,并不妨碍用 Watcher 外形运行;桌面制品 target 仍是 linux-x86_64。

修改 Profile 后重新启动窗口。App watch 只观察 App 目录,不会因你保存 TOML 就重新配置窗口。

6. 中英文、主题与测试矩阵

复制现有 Profile 为 pai-touch-en.toml,把 locale 改为 en-US;再复制一个用于标准 UI 的 pai-touch-light.toml,把 theme 改为 light。为有意义的差异建立小规模矩阵:

测试组合 重点观察
296×240 横屏 + 中文 小屏信息密度、触控目标、长标题
390×844 竖屏 + 英文 换行、长单词、滚动和列表
412×412 圆屏 四角裁切、返回按钮、安全区
800×480 横屏 拉伸、对齐、空白与内容最大宽度
标准 UI 明暗主题 文本与背景对比、图标与状态栏

语言变化后文本没有变化,先确认应用资源是否提供该语言、是否处理语言事件,以及字体是否包含所需字符。屏幕尺寸变化后不应该仅依靠截图缩放来“通过测试”。

7. 多实例隔离

同一个 Profile 默认共享安装状态。如果要比较两个版本、两个账号状态或首次启动行为,用不同实例名。先构建稳定的桌面包,再启动两个服务:

tools/simulator.sh service start --profile pai-touch --instance demo-a
tools/simulator.sh service start --profile pai-touch --instance demo-b

pxadb package install local/app-output/pai-touch/pxa-hello.pxa --simulator pai-touch@demo-a
pxadb package install local/app-output/pai-touch/pxa-hello.pxa --simulator pai-touch@demo-b
pxadb devices

分别在两个终端打开窗口:

# 终端 A
tools/simulator.sh product --profile pai-touch --instance demo-a --installed pxa-hello
# 终端 B
tools/simulator.sh product --profile pai-touch --instance demo-b --installed pxa-hello

两个运行命令分别占用各自终端,以下截图命令在第三个终端执行。也可以选择用标准 UI 窗口进入已安装应用,但不要让同一实例的两个可见运行器同时争用控制通道。

各实例通过自己的安装目录、socket 与控制通道运行;同一 Profile 的构建目录仍共享,不应同时修改公共构建配置。

pxadb screenshot hello-a.png --simulator pai-touch@demo-a
pxadb screenshot hello-b.png --simulator pai-touch@demo-b

tools/dev.sh 当前没有 --instance,不能把这里的参数直接加到 dev 命令。需要隔离测试时使用上述显式 build → service → install → run 流程。

8. 文件位置与关闭

内容 路径或选择方式
屏幕定义 simulator/profiles/pai-touch.toml
Host 构建 build/simulator/pai-touch/
默认安装状态 local/simulator/pai-touch/
demo-a 状态 local/simulator/pai-touch@demo-a/
默认本地 socket /tmp/pxa-simulator-<uid>/pai-touch@demo-a.sock
PXADB 选择器 --simulator pai-touch@demo-a

--state-root 可以覆盖状态目录,PXA_SIMULATOR_SOCKET_ROOT 可以覆盖 socket 父目录;入门阶段使用默认布局更容易与 PXADB 自动发现保持一致。

关闭相关窗口后,停止显式启动的服务:

tools/simulator.sh service stop --profile pai-touch --instance demo-a
tools/simulator.sh service stop --profile pai-touch --instance demo-b

测试干净安装时优先新建实例,不要随意删除正在运行实例的数据目录。

9. 常见问题

现象 检查方法
Simulator profile is unavailable 文件是否位于工作区 simulator/profiles,名称和大小写是否一致
圆屏与圆角参数冲突 round=true 时去掉非零 corner_radius
画面被边缘裁切 核对逻辑尺寸、安全区和应用布局,避免硬编码整屏坐标
改 Profile 没反应 重启窗口;检查当前命令实际选择的 Profile
找不到实例里的包 package list、install、run 必须指向同一 PROFILE@INSTANCE
服务有端点却截图失败 service 只提供服务,还需要有实际运行并呈现画面的窗口
设备架构似乎没变化 Profile 只模拟显示;芯片代码生成由 target 决定

Profile 不模拟触控 IC、电源电路、PSRAM 性能和 LCD DMA 时序。完成屏幕适配后,继续板子调试验证真实硬件。

参考实现与资料tools/simulator.sh ↗profiles/pai-touch.toml ↗profiles/sensecap-watcher.toml ↗desktop/README.md ↗

输入关键词,搜索全部教程。