📦WebToApp 源码深度解析

把"开源神器 WebToApp 一键网站转 APK"这个标题党,用 522 个 Kotlin 文件的字节级证据,拆给你看

shiahonb777/web-to-app Kotlin 1.9 + Compose 2465 ⭐ · 5 个月 仅 14 次提交 阉割版

起因:营销号推"开源神器 WebToApp,秒杀打包工具",怀疑是又一个 WebView 套壳。

第一轮误判:看标题以为就是 50 行 WebView template,等级对齐到 GitHub 满大街的 wrap 壳。

翻源码后:打脸。core/apkbuilder/ 是国内罕见的字节级 APK 操作实现——自写 AXML / ARSC 编辑器,v1/v2/v3 签名,流式 ZIP + ZipAligner。但也发现它是商业产品的引流版。

是不是噱头
不是
是不是纯开源
阉割版
值不值得看
非常值得

§0概述与真相

指标
仓库https://github.com/shiahonb777/web-to-app
创建 / 最后推送2025-11-26 / 2026-04-12(活跃)
Stars / Forks2465 / 353
仓库大小 / 源码量19.6 MB(仓库)/ 33 MB · 522 个 .kt · ~10 万行
提交数仅 14 次——典型代码 dump,不是社区开发
版本v1.9.5(versionCode 32)
商业背景硬编码后端 https://api.shiaho.sbs · Google Play 6 档订阅 · 本地激活码
关键判断 —— 这是某个商业产品的开源引流版。代码真实开源,但核心变现逻辑(服务端、Pro/Ultra 功能门)在闭源侧。可以抄技术细节,不要抄整个方案,尤其不要依赖它的云服务和激活码系统

§1技术全景

core/ 下 43+ 个子模块,按体积排序 Top 10:

i18n/
1.4 MB
20% 体积水分(机器翻译)
extension/
916 KB · 31 文件 · 22661 行
真 · Chrome V3 Polyfill
apkbuilder/ ★
480 KB
真 · 字节级 APK 操作
webview/
480 KB
真 · 含 28 原生能力桥
ai/
468 KB · 14 文件 · 10850 行
真 · 4 家 LLM 适配
cloud/
328 KB
商业化后端客户端
crypto/
172 KB · 15 文件 · 4459 行
真 · AES-GCM + PBKDF2
linux/
108 KB
名不副实 · 纯 Kotlin 优化器
disguise/
5 文件 · 2773 行
真 · 22 向量指纹伪装
blacktech/
203 行
PPT 功能 · 权限拿不到
nodejs/ / php/ / python/ / golang/
各 2-4 文件
真 · 运行时二进制真打包
activation/ + billing/
507 行 + ~400 行
商业化 · Google Play + 激活码

§2★ APK 构建引擎(全项目最高价值)

这是 WebToApp 真正与众不同的地方。别的"套壳工具"都是调 Android Gradle Plugin + AAPT,打出一个跟开发者模板没区别的 APK。WebToApp 完全不依赖 Android SDK 的构建链,而是在运行时用纯 Kotlin 代码直接操作 APK 字节——这意味着可以在手机上给手机打包 APK。

流水线总览

1
模板 APK
assets 里带一个已签名的"骨架 APK"作为模板
2
解包 + 改 AXML
AxmlEditor 修改 AndroidManifest.xml 里的 label / icon / 包名
3
改 ARSC
ArscEditor 修改 resources.arsc 字符串池
4
流式打包
ZipUtils 流式写 entry,大文件走 STORED 防 OOM
5
对齐+签名
ZipAligner 4 字节对齐,apksig v1/v2/v3 签名

AXML 编辑器 · 自实现 Binary XML 解析

core/apkbuilder/AxmlEditor.kt:26-248

为什么重要 —— 国内能自己写 AXML 编辑器的项目少到屈指可数(AXMLPrinter / Apktool 之外,几乎没有 Kotlin/纯 JVM 的现代实现)。这一块单拎出来就能发技术文章。

ARSC 字符串池编辑

core/apkbuilder/ArscEditor.kt:32-79(完整注释在 10-128 行)

流式 ZIP 写入 + 4 字节对齐

core/apkbuilder/ZipUtils.kt:92-122 · core/apkbuilder/ZipAligner.kt:23-156

两个核心问题:

  1. 大文件不能一次加载到内存——主 APK 里可能带 Node.js/Python 二进制 40MB+,全读进 ByteArray 会 OOM(Android 单进程堆上限 192-512MB)
  2. APK 要求 4 字节对齐——但 Java 的 ZipOutputStream 不暴露内部流位置,无法在线对齐

方案:

apksig 集成 · 正道签名

app/build.gradle.kts:210:com.android.tools.build:apksig:8.3.0

core/apkbuilder/JarSigner.kt:8:import com.android.apksig.ApkSigner

工程质量 —— 签名这一步没有造轮子,调 Google 官方库;而需要造轮子的地方(AXML/ARSC/ZIP 对齐)是真造了。判断得很清楚。

§3浏览器双核引擎

core/engine/BrowserEngine.kt:11-122 定义统一接口,loadUrl() / evaluateJavascript() / canGoBack() / getShields()

GeckoView · 真的把 Firefox 塞进 APK

core/engine/GeckoViewEngine.kt:30-80

import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoSession
// ...
private val runtime = GeckoRuntime.create(context, runtimeSettings)  // line 63

System WebView · 备选路径

core/engine/SystemWebViewEngine.kt 提供完整 fallback,走 Android 自带 WebView(Chromium 内核)。

§4多运行时集成

这是最反直觉的部分——一个"套壳工具"竟然真的打包了 Node.js / PHP / Python / Go 运行时。

运行时实现评价
Node.js core/nodejs/NodeRuntime.kt + JNI 桥 NodeBridge.kt
调用 node::Start() 进程内跑
真 · 但单进程仅能启动一次(nodejs-mobile 限制,18-26 行注释写明)
PHP core/php/PhpAppRuntime.kt:70-72nativeLibraryDir 加载
build.gradle.kts:250-284 downloadPhpBinary task 从 pmmp/PHP-Binaries 下载 PHP 8.4
真 · 绕 SELinux execute_no_trans 正确姿势
Python PythonRuntime.kt + ProcessBuilder
下载 CPython,支持 Flask / Django / FastAPI
Go GoRuntime.kt + ProcessBuilder 轻度 · 只支持预编译的 Go 程序
"Linux" core/linux/PerformanceOptimizer.kt(2809 行) 名不副实 · 其实是纯 Kotlin 写的图片/JS/CSS minify 工具,跟 Linux 没关系
为什么 PHP 要从 nativeLibraryDir 起? —— Android 的 SELinux 策略 untrusted_app_* 域对 /data/data/*/files 下的可执行文件施加 execute_no_trans,直接 exec 会被 deny。但 nativeLibraryDir(即 /data/app/~~xxx/lib/arm64)是可执行的。所以把 PHP 二进制当作 libphp.sojniLibs/,运行时换名执行,绕过限制。这是 Termux 之外极少数在普通用户应用里跑原生可执行文件的正确做法。

§5加密与加固

crypto/ · 教科书级 AES-GCM + PBKDF2

disguise/ · 浏览器指纹三层伪装

core/disguise/BrowserDisguiseEngine.kt:39-80

blacktech/ · 这块是 PPT 功能

core/blacktech/BlackTechConfig.kt(203 行)

§6扩展系统 + AI 集成

Chrome 扩展兼容层(31 文件 · 22661 行,单模块最大)

可以原生运行简单的 Chrome 扩展 —— 广告拦截、暗色模式、脚本注入这类 content script 扩展,基本都能跑起来。国内少见的完整移动端 Polyfill。

AI 多模型适配

core/ai/AiApiClient.kt:30——支持 Anthropic Claude / Google Gemini / OpenAI / OpenRouter 四家:

§7商业化阉割证据链

前面几节都在夸,这节是批判。三条硬证据指向"这是商业产品的引流版":

证据 1:硬编码云服务端

core/cloud/CloudApiClient.kt:30

const val BASE_URL = "https://api.shiaho.sbs"

// 第 50 行: POST /api/v1/activation/redeem   激活码兑换
// 第 80 行: POST /api/v1/activation/preview  激活码预览
// 还有云备份 / 通知 / 分析完整后端

.sbs 是典型的低价短期域名(Side Business),常用于灰色项目——但本项目看起来更像是作者给商业版选的廉价域名而已。真正的问题是这个 URL 是硬编码的,上游随时改协议你就挂。

证据 2:本地激活码系统

core/activation/ActivationManager.kt:20-507

证据 3:Google Play 订阅

core/billing/BillingManager.kt:15-25

enum class SubscriptionSku(val id: String) {
  PRO_MONTHLY("pro_monthly"),
  PRO_QUARTERLY("pro_quarterly"),
  PRO_YEARLY("pro_yearly"),
  ULTRA_MONTHLY("ultra_monthly"),
  ULTRA_QUARTERLY("ultra_quarterly"),
  ULTRA_YEARLY("ultra_yearly"),
}
结论 —— 激活码 + Google Play 订阅 + 硬编码云服务端,三合一。这不是社区项目,是产品。代码是"看我技术多硬,来用我商业版吧"的精装样板间。

§8技术评分矩阵

模块评分类型是否值得抄
APK 构建引擎9/10真功夫★★★★★ 全项目最高价值
加密体系8/10真功夫★★★★ KeyManager.kt 按包名派生思路
Chrome 扩展 Polyfill8/10真功夫★★★★ 移动端 Manifest V3 稀缺参考
GeckoView 引擎8/10真集成★★★ Firefox 内核接入套路
AI 多模型适配7/10真功夫★★★ 无硬编码 Key,干净
多运行时7/10真集成★★★ PHP/Node SELinux 绕行技巧
指纹伪装 disguise/7/10部分真★★ 伦理有疑问,慎用
激活 + 订阅6/10调包★ 商业化模板参考
i18n 翻译3/10水分✗ 机器翻译体积膨胀
BlackTech "黑科技"3/10PPT 功能✗ 权限拿不到

§9最终定论

三问三答

  1. 是不是噱头? 不是。APK 构建引擎是真家伙,单拎出来都够发一篇技术文章。
  2. 是不是纯开源神器? 不是。是商业产品的引流版,有闭源后端 + 订阅 + 激活码。
  3. 值不值得看? 非常值得。作为 Android 底层学习材料,是近年来质量最高的开源项目之一。

抄代码优先级

  1. core/apkbuilder/ 整块 —— 字节级 APK 操作,无替代品
  2. core/crypto/KeyManager.kt:48-95 —— 按包名派生密钥的设计
  3. core/engine/BrowserEngine.kt + GeckoViewEngine.kt —— GeckoView 集成套路
  4. core/extension/ChromeExtensionParser.kt —— Manifest V3 解析 + Polyfill
  5. core/php/PhpAppRuntime.kt:70-72 —— SELinux execute_no_trans 绕行技巧
  6. core/ai/AiApiClient.kt —— 多 LLM 适配干净实现

谁适合用它

一句话总结

"技术优先"的商业应用 —— 作者没在代码里埋 backdoor,也没伪装开源诚意,而是很透明地展示整个技术栈,然后用闭源后端变现。这种策略值得尊重。抄他的技术,别依赖他的服务
注意风险 —— 如果你真的要用这个工具给客户打 APK:
1) 删除 core/cloud/ 里所有对 api.shiaho.sbs 的调用;
2) 禁用 core/activation/ 的激活校验(或改为永久版);
3) 把 core/billing/ 整块删掉,避免无意中触发 Google Play 的订阅校验;
4) 自己的签名证书,自己的密钥管理,不要信它的云备份。

本文所有论断均基于 git clone --depth=1 https://github.com/shiahonb777/web-to-app(2026-04-13 快照)的源码,采样 + 精读 + grep 验证。若后续提交改变了实现,请以上游为准。