跳到正文
Hacker News· stjanovitz·· 7 天前AI 评分34

Tilefinch:为 PSP(333MHz、64MB RAM)从零打造的 Web 浏览器

Show HN: Tilefinch – a from-scratch* web browser for the PSP (333Mhz, 64MB RAM)

AI 导读

Tilefinch 是一款在 Sony PSP(333MHz MIPS、64MiB RAM)上从零构建的实验性浏览器,自带布局引擎、QuickJS 运行时与硬件加速视频,无需代理或配套电脑即可运行真实 HTTPS 页面。

正文 · AI 翻译

为 Sony PSP(333 MHz,64 MB)打造的实验性网页浏览器:从零开始的排版引擎、JavaScript 和硬件辅助视频,全部在掌机本身上运行。

PSP 分辨率下的 Wikipedia 360p 视频播放
The English Wikipedia PlayStation Portable article rendered by Tilefinch Tilefinch's video overlay—Big Buck Bunny title, pause control, scrubber, and timestamps—over a Big Buck Bunny frame
阅读器模式 深色模式
The Wikipedia PlayStation Portable article reflowed in Tilefinch Reader mode The Wikipedia PlayStation Portable article rendered with Tilefinch forced dark mode
WebGL 游戏 Danzeff 文本输入
Treadline Arena on the PSP: the jade player tank in a close fight with blue, yellow, orange and purple bots, with the score, armor and loadout HUD drawn in the canvas Tilefinch's Danzeff radial keyboard with bookmark and history suggestions

为什么

我大约十年没碰 PSP 了,这次重新拿起它,想找个理由弄清楚三件事:这台机器能被推到什么程度,现代网页有多少能在这般受限的环境里运行,以及如今的编程智能体能做什么。一个网页浏览器正好能检验这三点。

它能做什么

功能 支持
网页浏览 带 JavaScript、受限 WebAssembly 和 WebSockets、Cookie、图片、移动端布局和 TrueType 文本的真实 HTTPS 页面。不涉及代理或配套电脑。
原生媒体 YouTube(通过其轻量级提供方)以及兼容的 HTML <video>/<audio> 元素会在同一个原生播放器中打开。官方构建使用 PSP 固件解码器处理 240p/360p Baseline/Main MP4 和带 AAC-LC 的 240p HLS,包括 YouTube 直播和首播。内置跳转、缓冲状态、首选音频和字幕语言、轨道选择、可续传下载以及纯音频播放。一个可选的、单独构建的解码器增加了 240p H.264 High。
标签页与导航 五个标签页、书签、历史记录、地址和搜索建议、页内查找、可选的会话恢复,以及可选的单标签页休眠。
广告拦截 保守的请求拦截和外观隐藏默认开启。支持自定义 uBlock/EasyList 风格规则和按站点例外。
Cookie 提示 常见的同意横幅会被隐藏,无需点击“接受”或创建同意 Cookie;单个站点可以豁免。
阅读器、基础视图与离线 阅读器模式重排文章;基础视图挽救脚本失败的页面,保留其链接、表格和简单搜索表单。保存文章,并安装由小型清单支持、可离线使用的 Web 应用,连同其图标和已加载的同源资源,然后更新、重装或移除它们。
文本输入 PSP 系统键盘或更快的 Danzeff 径向键盘,支持从本地书签和历史记录中补全。
游戏 受限的 Canvas 2D 和 WebGL 1,用于图表和适度规模的游戏,支持 ImageBitmap 资源准备、用户启动的 PCM 游戏音频、页面全屏,以及映射到 PSP 控制键的标准 Gamepad API。随附的 Treadline Arena 是一款 3D WebGL 坦克游戏,包含战役、机器人对战、练习场和自适应音乐。
外观 自动或强制页面深色模式、深色和浅色浏览器界面、可下载配色主题、页面文本缩放、翻译后的浏览器菜单、支持阿拉伯语系字形塑造的受限混合从右到左和从左到右布局,以及可选的日语、中文、韩语、西里尔文、扩展拉丁文、阿拉伯文、希伯来文、印地文和彩色 emoji 字形包。
原生 PSP 界面 即时主屏幕、收藏集、时钟、电池和 Wi-Fi 状态、上下文控件、PNG 截图,以及以可拍照二维码形式显示的诊断信息。
可选的 XMB 重定向 配合 ARK-4,Sony 的 Internet Browser 图标可以启动 Tilefinch;按住 L 则打开原始浏览器。
更新 带 A/B 槽位的签名应用内更新、试启动、自动回滚、明确批准,以及可选的已签名早期版本选择器。
实验性语音搜索 一个可选的可下载模型和按需语音引擎。默认关闭;目前速度慢且不准确。

概览

硬件目标 PSP-3000:333 MHz MIPS,64 MiB RAM(实测堆约 43 MiB,页面和语音共享 32 MiB 信封),480×272 显示屏,页面和界面使用 RGB565 表面,全屏视频使用 32 位扫描输出
执行模型 网络、HTML、CSS、JavaScript、布局和渲染全部在 PSP 上运行
浏览器引擎 Lexbor HTML 解析器,Tilefinch 自有的样式、布局和渲染,QuickJS 运行时
呈现 增量保留显示列表,带有有界 RGB565 瓦片缓存
网络 HTTPS 带证书和主机名验证、Cookie、重定向、缓存,以及用于强制门户的隔离 Wi-Fi 登录流程
许可证 MIT,第三方组件单独授权

工程亮点

领域 有趣之处
是浏览器,不是移植 样式、布局、绘制、策略、媒体和原生接口层均为原创 C11。Lexbor、QuickJS、curl、Mbed TLS、nghttp2 和 FreeType 以 vendored 方式引入并固定哈希(声明)。它足够像一个浏览器,以至于 chatgpt.com 的未登录聊天——包含一百多个 JavaScript 模块、客户端水合和流式回答——已在 PSP-3000 上端到端运行,这得益于验证性预解析器、作用域样式失效和针对配置文件优化的 JavaScript 引擎(架构)。
一本严格的内存账本 DOM、JavaScript、CSS、资源、布局和瓦片共享一个 24 MiB 页面预算。每个表和循环都有界,被拒绝的分配是一条经过测试、可恢复的路径,而不是异常。
下载结束前就有有用的像素 流式 HTML 和 CSS、预加载发现、可恢复布局、可见资源优先、延迟加载的引导模块,以及编译样式和脚本的有界缓存,都旨在 333 MHz 顺序核心上实现首次绘制。
确定性渲染 主机和 PSP 共享相同的布局和光栅化器,直至有序 RGB565 抖动。对照 Chrome 参考测得的保真度下限只能上升(保真度工作流)。
固件视频加速 原始 NAL 桥和有界 H.264 恢复点重写器馈入 PSP 的 Media Engine,两个受保护的解码表面将色彩转换与呈现重叠(媒体状态机)。
可选双核视频 用户构建的附加组件通过将 CABAC、去块、音频和色彩转换交给 Media Engine,同时 CPU 重建行,来解码 240p H.264 High。官方二进制文件有意不包含它。
480×272 屏幕上的 360p 640×360 帧作为两条受保护的条带通过 EDRAM,GE 以双线性方式缩放它们,无需逐像素 CPU 处理(设备信封)。
显式生命周期所有权 媒体和网络使用纯 reducer、纪元令牌服务、消费者租约、泵送拆除和隔离,因此内存绝不会在活跃固件或工作线程活动之下被释放(架构)。
不假装沙箱的安全 HTTPS 优先导航、CORS、CSP、SRI、私有网络保护、分区感知资源授权、Cookie 控制以及签名 A/B 更新,均在文档化的共享进程模型(安全模型)内强制执行。
硬件感知门禁 优化后的主机套件由 sanitizer、恶意输入、WPT、保真度和 PSP 交叉构建门禁支撑,并对可执行文件大小和热点函数大小设有棘轮限制(工程指南)。

详细的性能和内存实验记录保存在本地和私有开发归档中,不在这个公开仓库里。公开的工程文档描述当前契约和可复现的检查。

你需要什么

  • A PSP that runs homebrew (custom firmware) and has the 64 MB memory mode:
    • PSP-3000:经过测试的型号。本页声称的一切都在它上面运行过。
    • PSP-2000 和 PSP Go:相同内存模式,预期可用,尚未验证。
    • PSP-1000:不支持。它只有 32 MB 内存,而大多数网站需要更多。
    • PSP-E1000(Street):内存够,但没有 Wi-Fi,所以只有离线库能用。不是合理的目标。
  • About 20 MB free on the Memory Stick for everyday browsing and updates.
    • 可选字形包每个约 1 MB;彩色 emoji 包约 5 MB。除了所选语言包之外,当页面使用其他已安装包的脚本时,Tilefinch 最多可附加两个其他已安装包。如果页面需要你尚未安装的包,会在通知中提供,你可以忽略;从该通知安装时会先显示签名下载大小,然后再次询问。
    • 安装可选语音模型时,在已验证下载和新副本共存期间需要额外约 19 MB。如果你想要语音识别,请预留 40 MB 可用空间。
  • 一个 PSP 可以加入的 Wi-Fi 网络。使用最新的 ARK-4 自定义固件时,WPA2 可用;否则 PSP 只能加入 WPA(TKIP)或开放网络,这是其硬件时代的限制。大多数路由器可以提供 WPA/TKIP 访客网络。请先在 PSP 自带的网络设置中保存连接。

安装

  1. 从最新的 Tilefinch 发布版下载 PSP 安装 .zip。
  2. 解压它,并将整个 TILEFINCH 文件夹复制到记忆棒上的 PSP/GAME/。启动器最终应位于 PSP/GAME/TILEFINCH/EBOOT.PBP,旁边有 slot-a、slot-b、data 和 NOTICES。
  3. 安全断开 PSP,然后从 Game → Memory Stick 启动 Tilefinch。
  4. 如果尚未保存,请在 PSP 的网络设置中保存一个 Wi-Fi 连接。Tilefinch 使用连接配置文件 1,除非你在 Settings → Device & storage 中选择另一个。

发布页面上的 .tfum 和 .tfup 文件用于 Tilefinch 的签名应用内更新器,不用于手动安装。可选的语言、emoji 和语音组件从其设置屏幕安装。

可选的 ARK-4 XMB 重定向

ARK-4 用户可以让 Network → Internet Browser 打开 Tilefinch。这是一个可选的 VSH 插件:它不修改 PSP 固件或 flash0,不在后台轮询任何内容,也不向记忆棒写入任何内容。

  1. 正常将 Tilefinch 安装到 PSP/GAME/TILEFINCH/。
  2. 将安装归档中的 TILEFINCH/OPTIONAL/tilefinch_xmb.prx 复制到 ms0:/SEPLUGINS/tilefinch_xmb.prx。
  3. 在 ARK 的 Custom Launcher 或 Plugin Manager 中,为 VSH (XMB) 运行级别安装或启用该插件。
  4. 重启 VSH 或重启 PSP。

ARK 的 PLUGINS.TXT 中等效的手动行是:

vsh, ms0:/SEPLUGINS/tilefinch_xmb.prx, on

在使用内部存储的 PSP Go 上,两条路径中都使用 ef0:。

  • 打开 Internet Browser 图标时按住 L 可进入索尼的浏览器。由于重定向为此使用了 L,Tilefinch 的上一版本安全启动仅在从 Game → Memory Stick 启动 Tilefinch 时可用。
  • 如果 Tilefinch 缺失或交接失败,Sony 的浏览器会保持打开。
  • 要恢复原始行为,请在 ARK 的 Plugin Manager 中禁用该插件并重启 VSH。

Tilefinch 仍作为普通的自制应用程序运行,而不是 VSH 内部的代码,因此让它保持加载会重新加载 XMB,并可能显示常见的 Sony 或 ARK 启动画面。替换插件文件本身后,请将 PSP 完全关机并冷启动:Restart VSH 可能会在内存中保留之前的 NO_STOP 处理程序。该重定向会启动 Tilefinch 的稳定根启动器,因此签名更新、试用启动和自动回滚都能照常工作。ARK-4 的 插件文档 介绍了其 Plugin Manager 和 PLUGINS.TXT 格式。

可选 H.264 High 解码器

官方发行版不重新分发自定义的 H.264 和 AAC 解码器。兼容的 Baseline/Main MP4 和 HLS(包括直播流)继续使用 PSP 的固件。要添加 240p High-profile 路径,请按照 可选 PSP 软件解码器 从其固定上游源码构建该附加组件,然后将其三个文件复制到 PSP/GAME/TILEFINCH/components/swdec/。

该目录位于两个应用槽之外,因此签名更新会保留该附加组件。更新元数据会记录解码器 ABI:如果未来的更新更改了它,更新屏幕会显示 Decoder rebuild needed。当页面需要该附加组件而它缺失或不兼容时,播放器会指向这些构建说明,而不是报告一般的视频故障。

控制

按钮 操作
方向键 在链接和控件之间移动焦点(按住可重复)
摇杆 移动页面光标;将其按住顶部或底部边缘可滚动(设置可切换为直接滚动)
X 激活聚焦的项目,或在光标下点击
Circle 返回,或取消当前加载
Square 重新加载(当 Experimental Voice 开启时,在文本字段上启动语音输入)
Triangle 显示或隐藏浏览器界面
Start 地址和搜索栏
Select 菜单:Home、Tabs、Page tools、Library、Settings、Help & diagnostics、Exit to XMB
Start + Select(同时按住) 将控制权交给页面的 JavaScript;再次按住可收回
L / R 上一页 / 下一页
启动时按住 L 安全启动:启动上一个版本(在安装更新后)

在地址栏中输入 URL 以前往该地址,或输入其他内容进行搜索。

使用 Tilefinch

用户指南 详细介绍了日常使用:

  • 输入 可使用 PSP 键盘或更快的 Danzeff 布局,并从书签和历史记录中补全。
  • 页面内查找 位于 Menu → Page tools。
  • 阅读器模式、用于脚本失败页面的 Basic view,以及保存的文章和视频下载的 离线库。
  • 游戏和页面控制:将按钮交给页面的 Gamepad API、全屏、游戏音频和直接多人游戏。
  • 截图、Tilefinch 在 页面无法加载时 提供的功能,以及针对 JavaScript、广告拦截、Cookie 通知和存储的 按站点控制。

语言支持

浏览器菜单

打开 Settings → Appearance → Language & emoji → Interface language。 用左/右键选择,按 X 安装,然后重启 Tilefinch 以应用。 英语是内置的;可下载的翻译包括西班牙语、 法语、德语、日语、俄语、乌克兰语、简体中文、韩语、 印地语和阿拉伯语。选择一种语言还会下载其所需的字形包 (如果尚未安装)。尚未翻译的高级消息仍保留 英文,如果下载失败,英文仍然可用。

这会更改 Tilefinch 的菜单——而不是网站、游戏或字幕的文本。 首选视频、音频和字幕语言是单独的设置。

页面文本和表情符号

内置字体覆盖拉丁文本,并为部分中文、 日文、韩文和表情符号字符提供紧凑的备用字体。Settings → Appearance → Language & emoji 提供额外的页面文本包:日语、简体中文、 繁体中文、韩语、西里尔文(包括俄语和乌克兰语)、 扩展拉丁文、阿拉伯语、希伯来语和天城文(印地语),以及一个彩色表情符号包。 使用缺失包的页面还可以在您浏览时提供安装该包的选项。

确认相应的包下载并重启以使用它。方块键可移除 已安装的包。包增加字形覆盖范围;它们不会翻译页面文本。 阿拉伯语和希伯来语支持从右到左的布局。印地语覆盖常见 音节和界面组合;不常见的连字可能仍使用备用 字形。

翻译和签名包托管在 tilefinch-models 中,其中列出了 可用的下载。Tilefinch 在安装前会验证它们,并将 已安装的下载保存在记忆棒上以供离线使用。有关安装、移除和缺失文本通知,请参阅 语言包指南。

更新

从 Settings → Updates 检查更新。可选的背景检查 最多每周查找一次新版本信息,并且可以关闭; 除非您要求,Tilefinch 绝不会下载或安装更新。

  • 稳定版和测试版发布均经过加密签名并在安装前 验证。开发者通道(您必须明确选择)未签名,并信任您配置的端点。
  • 新版本会安装到第二个槽位,并作为试用版启动。如果它 无法正常启动,启动器会返回到之前可用的版本, 并且在启动时按住 L 键始终会启动上一个版本。
  • 在稳定版上,在更新页面按方块键可选择较旧的已签名 版本。它会安装到非活动槽位,并且必须通过相同的试用 启动。

docs/SECURE_UPDATES.md 和 SECURITY.md 中有详细信息。

隐私

  • 无遥测、分析或账户。Tilefinch 不会将关于您或 您浏览的任何信息发送到任何地方。对 YouTube 的请求会携带配置的视频 语言(默认为 PSP 的语言),以便结果和音轨可以 本地化。
  • 浏览器保留的所有内容都留在 PSP 上。Cookie 仅存在于内存中, 关机后即消失;历史记录(默认关闭)、缓存、保存的页面 和视频、截图以及设置都在您的记忆棒上。 Settings → Device & storage → Site data & storage 列出了持有数据的 站点,并可以清除其中一个站点,或清除所有站点的 HTTP 缓存、Cookie、本地 存储和会话存储。
  • 站点存储(localStorage、sessionStorage 以及源私有文件系统)驻留在 RAM 中,除非你选择,否则不会写入 Memory Stick。当站点超出 RAM 容量时,Tilefinch 会先询问是否将该站点的数据保留在 Memory Stick 上——仅本次会话或始终保留——并显示所需空间大小。Permissions & controls → Site storage 按站点设置该选择,而 Site data & storage 则为任何已列出的站点设置。
  • 为了更快地重新连接,Tilefinch 通常会将服务器签发的短期 TLS 恢复票据保存在 data/tls-sessions.bin 中。它们相当于凭据,因此会留在你的 Memory Stick 上,只会发送回签发它们的站点,并可通过 Site data & storage → Clear HTTP caches 清除。Settings → Privacy & security → TLS ticket saving 可停止在启动之间保留它们,同时不会禁用会话内的连接重用。
  • 如果启用,后台更新检查每周最多联系一次 GitHub releases API。它比较版本号,除普通 HTTPS 请求外不发送任何可识别信息,并且可以关闭。你请求的下载——包括更新、语言包和界面翻译——也会联系其公布的下载主机。
  • Help & diagnostics → Check Wi-Fi sign-in 会向 connectivitycheck.gstatic.com 发出一次无 cookie 的 HTTP 请求,仅在你要求或接受登录建议时进行。检测到的登录页面会使用临时 cookie 和存储打开,关闭时即被删除。
  • 在起始页上,将光标停留在内置 YouTube 磁贴上约三分之一秒,会在后台打开与 YouTube 的连接,这样当你按下 X 时该站点已准备就绪。这仅针对该内置磁贴,绝不会针对书签或页面提供的地址。它发送一个无正文请求,不带 cookie、凭据或 referrer,并且在你打开该站点之前不获取任何内容。此类连接最多存在一个,一旦你移开或 PSP 挂起就会立即关闭。
  • 语音搜索完全在 PSP 上运行;音频绝不会离开设备。

安全

安全模型记录了 Tilefinch 的安全默认值、兼容性控制、威胁模型和已知隔离限制。

已知限制

  • 许多站点渲染不完美,一些重型站点完全无法加载;Tilefinch 尚未实现所有 Web 标准或 API。超出内存预算的页面会降级或停止加载,而不是崩溃。
  • 重型 JavaScript 应用在 333 MHz CPU 上运行缓慢。在 PSP-3000 上,chatgpt.com 大约需要 40 秒才能开始输入,发送后简短回复又需要大约同样长的时间(根据录制会话测量;实时网络时间会使两者都增加)。
  • YouTube 支持取决于 YouTube 不变;它偶尔会失效,更新会修复。Tilefinch 不生成 YouTube Proof-of-Origin (PO) 令牌,因此即使浏览和搜索可用,需要该令牌的视频也可能无法观看。
  • 语音搜索是实验性的:速度慢、经常出错,且仅支持英语。
  • 标签页为每个页面的历史、URL、焦点和滚动位置保留有界记录,而不是五个完整页面,因此切换标签页会通过共享缓存重新加载页面。切换器为每个标签页保留一个 60×34 的预览(总共约 20 KiB),取自已经渲染过的帧。可选的 Hibernate tab 默认关闭,会将一个非活动标签页的快照(而非其页面内存)移至 Memory Stick 并标记为 [Z]。
  • 受 Cloudflare 托管挑战保护的站点无法使用。
  • WebGL 是 PSP 的 GE 在常规顶点颜色和纹理着色器方面的有界子集,而不是完整的可编程 GPU。复杂着色器、透明绘制缓冲区、离屏帧缓冲区和大型场景会温和失败,而不是消耗无界的内存或帧时间。
  • 没有桌面级进程沙箱,也没有完整的 CSP。Tilefinch 强制执行响应头 CSP、资源和框架策略的有界子集,对脚本和样式表实施子资源完整性,并限制 iframe 沙箱和源边界(参见安全模型),但它不会在独立进程中隔离源。请勿将其用于敏感账户或交易。

报告问题

如果出现问题,请先查看 TROUBLESHOOTING.md。有用的错误报告包括:

  • PSP 型号和自定义固件(例如“PSP-3000, ARK-4”);
  • 来自 Help & diagnostics → Version & system 的 Tilefinch 版本;
  • 网站或 URL,以及你按了什么;
  • 崩溃后,来自 Memory Stick 的 PSP/GAME/TILEFINCH/data/tilefinch-crash.txt(512 字节的全零文件表示未记录到崩溃)。

如果无法方便地访问 Memory Stick,Help & diagnostics → Diagnostic QR 会以可拍照的 QR 页面显示相同的有限日志。对于疑似安全问题,SECURITY.md 说明了该项目保护什么以及如何报告。

从源代码构建

桌面实验室在你的计算机上以 PSP 屏幕尺寸和内存配置构建并测试同一引擎。首次配置会下载哈希固定的依赖项;主机构建需要 libcurl 开发头文件和 zlib。

cmake --preset release
cmake --build build-preset-release
ctest --test-dir build-preset-release

docs/DEVELOPMENT.md 包含完整工作流程;在发送更改之前,请阅读 CONTRIBUTING.md。

工作原理

一个引擎到处运行。解析、样式、布局、脚本和基于瓦片的渲染都是有界的,并计入内存预算,其设计使得被拒绝的分配、格式错误的页面或取消都是正常事件,而不是崩溃。docs/ARCHITECTURE.md 包含系统图、内存契约和生命周期边界,docs/README.md 映射了所有文档,包括 docs/engineering/ 中的工程手册。

正在评估工程实现?请按以下顺序阅读:

  1. ARCHITECTURE:系统及其所有权规则。
  2. SECURITY_MODEL:哪些会安全失败,以及哪些保证不存在。
  3. 两个设备生命周期契约,分别针对媒体和网络。
  4. 设备资格策略:主机、模拟器和硬件各自能证明哪些声明。
  5. RELEASE_PROCESS:门禁、棘轮和离线签名仪式。

贡献

欢迎提交问题和拉取请求。Tilefinch 是一个业余项目,因此回复和审查可能需要一段时间。CONTRIBUTING.md 描述了构建和测试的期望。

许可证与独立性

Tilefinch 采用 MIT 许可证;参见 LICENSE。第三方组件保留自己的许可证和声明,列在 THIRD_PARTY_NOTICES.md 中。安全策略和漏洞报告见 SECURITY.md。

浏览器下载不包含声学模型或语音词典。如果你在应用中请求可选的语音组件,其签名包会在模型旁边附带 Alpha Cephei 和 CMUdict 许可证文件;浏览器捆绑包本身则附带其链接解码器所需的 PocketSphinx 许可证。

可选的日语、中文、韩语、西里尔字母、扩展拉丁字母、阿拉伯语、希伯来语、天城文(印地语)和彩色表情符号包同样不包含在下载内容中。它们由 Noto 字体生成,附带完整的 SIL Open Font License 声明和源字体摘要,仅在你主动请求时才会获取。Tilefinch 不读取 PSP 的专有固件字体。

Tilefinch 是一个独立、非官方的自制软件项目。它与 Sony Interactive Entertainment 无关联,未获其赞助或认可。PlayStation、PSP 及相关标志归各自所有者所有。本项目不包含任何索尼专有 SDK 材料、固件、美术资源或品牌标识。

维基百科截图展示的是英文条目“PlayStation Portable”。维基百科文本采用CC BY-SA 4.0许可。Wikipedia 及其标志是 Wikimedia Foundation 的商标,此处仅用于说明浏览器兼容性;Tilefinch 与 Wikimedia Foundation 无关联。

视频截图展示的是 Big Buck Bunny 中的一帧,版权 2008 Blender Foundation,采用CC BY 3.0许可。该影片及其演职员名单可从Blender 开源电影项目获取。

来源:Hacker News · github.com