Skip to content

常见问题

按主题组织的实用问答。要看完整细节,点链接。

基础

WebToApp 免费吗?

是的。WebToApp 以 The Unlicense 开源。

需要什么 Android 版本?

Android 6.0(API 23)或更高。

构建应用需要电脑吗?

不需要。整个构建 —— 二进制打补丁、签名、AAB 导出 —— 都在设备上完成。只有当你想从源码构建 WebToApp 本身时才需要电脑。

这和网址套壳应用有什么不同?

网址套壳只是在 WebView 里打开网站。WebToApp 额外在设备上运行真实的服务运行时(Node.js、PHP、Python、Go、WordPress,经 fork+exec)、搭载加固网络栈(DoH、TLS 指纹、ECH)、在二进制层面修改并签名 APK,并支持模块/油猴脚本/MV3 扩展 —— 全程无需电脑或远程构建服务器。

能创建哪些应用类型?

12 种:网页、多站点、HTML、离线包、前端、PHP、WordPress、Node.js、Python、Go、媒体和画廊。见创建应用

创建与编辑

编辑核心配置和编辑通用配置有什么区别?

  • 编辑核心配置 —— 类型专属的来源/运行时设置(每种应用类型都不同)。见编辑核心配置
  • 编辑通用配置 —— 每个应用都有的共享选项(外观、网络、隐私、扩展、导出)。见编辑通用配置

网页应用没有这两项,而是单一的合并 编辑 入口。

预览和导出有什么区别?

预览 走宿主路径(一切都在构建器的 classpath 上)。导出 构建一个独立 APK,运行 shell 运行时,从嵌入的 app_config.json 读取你的配置。见快速开始

构建与导出

构建模式(FULL / CONTENT_OVERLAY / REUSE_UNSIGNED)是什么?

重建是增量且内容寻址的:

  • FULL —— 从模板重建(加密构建恒用)。
  • CONTENT_OVERLAY —— 仅应用内容变化。
  • REUSE_UNSIGNED —— 对先前构建的未签名 APK 重新签名。

构建 APK

APK 导出和 AAB 导出有什么区别?

构建 APK 产生一个可安装的已签名 APK。AAB 导出(从 Google Play)产生 Play 级打包,并把 targetSdk 重写到 Play 要求的级别。见 APK导出配置

我的应用能上架 Google Play 吗?

通常可以。Web、多网站、HTML、离线包、Frontend、媒体和图库应用都能导出 Play 级 AAB。两类不行:Node.js / PHP / Python / Go / WordPress 应用,以及任何开启资源加密的构建。见 Google Play

为什么生成的应用 targetSdk 是 28?

较低的 targetSdk 是刻意为之:它让生成的应用能从应用存储 fork+exec 原生运行时(Node.js、PHP、Python、Go、WordPress)。这只是 APK 打包层面的细节 —— AAB 导出器会把 targetSdk 重写到 Play 要求的级别,这个低值不会带到 Play。

如何用自己的密钥签名?

创建或导入密钥库(PKCS12/PFX/JKS/BKS),并在 APK导出配置中选择签名方案(V1/V2/V3)。

构建产物存在哪里?

文件管理中 —— APK 构建、AAB 导出、应用克隆和构建日志。

运行时

为什么我的 Node/PHP/Python/Go 应用首次使用要下载东西?

为了让基础应用保持小巧,运行时二进制不打包进去;它们在首次使用时下载一次并缓存。在运行时管理Linux 环境中管理。

我的 Node.js 应用报 loadNode / loadJniBridge 错误,为什么?

导出的 APK 必须嵌入 libnode_bridge.solibnode.so(16KB 对齐)和 libc++_shared.so。缺少原生库会导致此失败。见 Node.js 的导出要求。

端口如何管理?冲突了怎么办?

运行时应用通过端口管理以冲突策略分配端口:REASSIGN(选另一个端口)、AUTO_KILL(停止冲突服务)或 ALERT(通知)。

为什么我的运行时应用需要 DNS 桥?

打包的原生二进制(基于 musl)不一定能触达系统 DNS 解析器,因此一个本地 DNS 桥代理提供 DNS 解析和出站 HTTP。这是自动接好的。

功能与配置

如何让应用全屏或隐藏状态栏?

全屏模式—— 它控制沉浸式模式以及状态栏/导航栏是否保持可见。

导出的应用里去广告如何工作?

宿主去广告器服务预览,编译后的规则集随导出的 APK 一起发布。在广告拦截中按应用配置规则/订阅;在 Hosts 拦截中管理列表。

如何使用自定义 DNS 或 DNS-over-HTTPS?

自定义DNS—— 选择 DoH 提供商(Cloudflare、Google、AdGuard、NextDNS、CleanBrowsing、Quad9、Mullvad)或自定义端点。

扩展

模块、油猴脚本和 MV3 扩展有什么区别?

  • JS/CSS 模块 —— WebToApp 的原生格式,带配置 UI 和面板。见 JS 模块
  • 油猴脚本 —— Tampermonkey/Greasemonkey 风格的 .user.js,带 GM_* API。见油猴脚本
  • MV3 扩展 —— Chrome Manifest V3 扩展,带 chrome.* API。见 Chrome MV3

油猴脚本的 GM_* 函数按 @grant 门控吗?

不。@grant 声明会被解析并列入 GM_info,但所有 GM_* 函数都无条件暴露。为了与真正的 Tampermonkey/Greasemonkey 保持可移植性,仍应声明 grant。见 API 参考

MV3 扩展运行在真正隔离的 world 中吗?

不。Android WebView 只有单一 JavaScript 上下文;ISOLATEDMAIN world 是模拟的(每个扩展覆盖 globalThis.chrome)。见 Chrome MV3

如何把模块发布到市场?

modules/ 下添加一个文件夹,更新 registry.json,然后开一个 pull request。见发布到市场

故障排除

某功能预览正常,导出后失效,为什么?

通常是某个配置字段没有贯通导出链路(模型 → ApkConfig JSON → shell 配置 → 运行时)。诊断清单见配置字段漂移

构建失败了,去哪里看?

构建对话框会显示一份诊断报告(失败阶段、原因和构建日志尾部),可复制。构建日志也可在文件管理中查看。

我导出的应用连不上网,该检查什么?

检查应用的自定义DNS高级设置中的代理设置。对于运行时应用,本地 DNS 桥会自动处理解析。

数据与帮助

如何备份或迁移我的应用?

使用关于中的 数据备份 / 恢复,或通过导出把单个应用导出为可复用模板。

去哪里获取帮助?

Released under the Unlicense.