commit a51810982a29174922f6445e07f37dee4a825028 Author: kang Date: Mon Apr 13 16:45:55 2026 +0800 WebToApp 源码解析: apkbuilder 字节级分析 + docs 站 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eef5288 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +source/ diff --git a/.memory/source-analysis.md b/.memory/source-analysis.md new file mode 100644 index 0000000..a16c164 --- /dev/null +++ b/.memory/source-analysis.md @@ -0,0 +1,255 @@ +# WebToApp 源码深度解析 + +> **仓库**:https://github.com/shiahonb777/web-to-app +> **Clone 路径**:`source/`(gitignored) +> **分析日期**:2026-04-13 +> **分析方法**:随机采样 + 关键文件逐行精读 + grep 证据链 + +--- + +## 一、项目元数据 + +| 指标 | 值 | +|------|-----| +| 创建时间 | 2025-11-26(5 个月) | +| 最后推送 | 2026-04-12 | +| Stars / Forks | 2465 / 353 | +| 仓库大小 | 19.6 MB(Kotlin 源码 33MB) | +| 提交数 | **仅 14 次**(典型代码 dump,非社区开发) | +| 文件数 | 522 个 .kt 文件,约 10 万行 | +| 技术栈 | Kotlin 1.9 + Jetpack Compose + Room + KSP + Coroutines + Flow | +| versionCode | 32(v1.9.5)| +| 模块数 | `core/` 下 43+ 个子模块 | + +**一句话定位**:这是某个商业产品(`shiaho.sbs` 品牌)的**阉割版开源引流版**,核心代码开源但服务端+激活码+订阅闭源。 + +--- + +## 二、核心发现(按评分排序) + +### ⭐⭐⭐⭐⭐ 1. APK 构建引擎 —— 真功夫,全项目最高价值 + +**位置**:`app/src/main/java/com/webtoapp/core/apkbuilder/`(480KB 源码) + +**关键实锤**: + +1. **自实现 AXML 二进制编辑器** —— `AxmlEditor.kt:26-248` + - UTF-8 / UTF-16LE 双编码支持 + - 字节对齐替换(修改字符串池必须保持字节长度) + - 支持清除 `android:testOnly`、权限修复、组件类名恢复 + +2. **自实现 ARSC 资源表编辑器** —— `ArscEditor.kt:32-79` + - 第 10-128 行有详细注释,说明作者深入理解 APK 字节格式 + - 可修改 `resources.arsc` 中的字符串(如应用名称本地化) + +3. **集成 Google 官方 apksig 库** + - `build.gradle.kts:210` → `com.android.tools.build:apksig:8.3.0` + - `JarSigner.kt:8` 导入 `com.android.apksig.ApkSigner` + - 支持 v1/v2/v3 签名,SHA-256withRSA 2048bit RSA + - 支持 Android KeyStore 和 PKCS12 证书切换 + +4. **真·流式 ZIP 写入** —— `ZipUtils.kt:92-122` + - 10MB+ 文件用 STORED 模式(先算 CRC32 再流式写)避免 OOM + - `ApkBuilder.kt:1022` 注释写明:Node 二进制 ~40MB 走 streaming write + +5. **Zip 4 字节对齐** —— `ZipAligner.kt:23-156` + - 自己实现对齐(Java `ZipOutputStream` 不暴露流位置,官方 API 无法做到) + +**评价**:**国内罕见的字节级 APK 操作实现**。不是调 `Android Gradle Plugin`,不是调 AAPT,而是完全手搓。这块单拎出来就是一个独立项目的价值。 + +--- + +### ⭐⭐⭐⭐ 2. 浏览器引擎抽象 —— 真集成 GeckoView + +**位置**:`core/engine/` + +- `BrowserEngine.kt:11-122` 定义统一接口(`loadUrl`、`evaluateJavascript`、`getShields`...) +- `GeckoViewEngine.kt:30-80` 真·导入 `org.mozilla.geckoview.*` + - `GeckoRuntime.create(context, settings)` 运行时单例(第 63 行) + - 反追踪、SafeBrowsing、Cookie 隔离配置(第 52-61 行) +- **Gecko 原生库不内置**:`build.gradle.kts:137-142` 明确排除 `libxul.so`,由 `GeckoEngineDownloader.kt` 按需下载(减小主 APK 体积) +- `SystemWebViewEngine.kt` 提供备选路径 + +**评价**:真的把 Firefox 内核塞进了 Android 壳应用,不是字符串常量。 + +--- + +### ⭐⭐⭐⭐ 3. 多运行时 —— 真打包真跑 + +| 运行时 | 实现 | 真假 | +|------|------|------| +| **Node.js** | `NodeRuntime.kt` + JNI 桥 `NodeBridge.kt` | 真:调用 `node::Start()` 进程内跑,但 `NodeRuntime.kt:18-26` 注释说 libnode.so 是共享库,**单进程只能启动一次**(nodejs-mobile 限制) | +| **PHP** | `PhpAppRuntime.kt` + ProcessBuilder | 真:`build.gradle.kts:250-284` 有 `downloadPhpBinary` gradle task,从 `pmmp/PHP-Binaries` 下载 PHP 8.4;`PhpAppRuntime.kt:70-72` 优先从 `nativeLibraryDir` 加载(绕 SELinux `execute_no_trans`) | +| **Python** | `PythonRuntime.kt` + ProcessBuilder | 真:下载 CPython,支持 Flask/Django/FastAPI | +| **Go** | `GoRuntime.kt` + ProcessBuilder | 轻度:只支持预编译的 Go 程序 | +| **"Linux"** | `PerformanceOptimizer.kt`(2809 行)| 名不副实:其实是纯 Kotlin 做的图片压缩/JS/CSS minify | + +**评价**:真打包了二进制,但通过下载策略(而非内置)控制主 APK 体积。设计合理。 + +--- + +### ⭐⭐⭐⭐⭐ 4. 商业化模块 —— 阉割版铁证 + +**铁证 1:硬编码云服务端** —— `CloudApiClient.kt:30` +```kotlin +const val BASE_URL = "https://api.shiaho.sbs" +``` +- `/api/v1/activation/redeem`(第 50 行):激活码兑换 +- `/api/v1/activation/preview`(第 80 行):激活码预览 +- 完整的云备份 / 通知 / 分析后端 + +**铁证 2:激活码系统** —— `ActivationManager.kt:20-507` +- 4 种激活码类型:`PERMANENT` / `TIME_LIMITED` / `USAGE_LIMITED` / `DEVICE_BOUND` +- 常量时间比较防时序攻击(第 441-448 行) +- 时限/用途持久化到 DataStore(第 281-305 行) + +**铁证 3:Google Play 订阅** —— `BillingManager.kt:15-25` +- 6 个 SKU:`pro_monthly/quarterly/yearly`、`ultra_monthly/quarterly/yearly` +- 集成 `com.android.billingclient:billing-ktx:7.0.0` +- 订阅检查:第 300-328 行 + +**评价**:开源的是引流版,真正的商业版有闭源后端。作者的变现逻辑是清晰的。 + +--- + +### ⭐⭐⭐⭐ 5. 加密与加固 —— 教科书级 + +**crypto/(15 文件,4459 行)**: +- `AesCryptoEngine.kt`:AES-GCM + PBKDF2 派生 +- `KeyManager.kt:48-95`:按包名+签名派生,每个 APK 独立密钥 +- `AssetEncryptor.kt` + `SecureAssetLoader.kt`:资源加密加载 + +**disguise/(5 文件,2773 行)** —— 浏览器指纹伪装: +- `BrowserDisguiseEngine.kt:39-80` 三层架构: + - Level 1:BrowserKernel(HTTP 头 + 基础 JS) + - Level 2-5:22 个指纹向量(Canvas / WebGL / Audio / Screen / Timezone...) + - OAuth 专用层:`OAuthCompatEngine` +- `BrowserDisguiseJsGenerator.kt`:动态生成伪装 JS +- 明确针对 Google/Facebook/Microsoft OAuth 反检测 + +**blacktech/(`BlackTechConfig.kt` 203 行)** —— ⚠️ 可疑: +- "核弹模式""隐身模式""摩斯电码""SOS 求救" +- `forceMaxPerformance` / `forceBlockPowerKey` / `forceAirplaneMode` 需要系统权限 +- 用户应用层 APK 根本拿不到这些权限 → **可能是设计文档 / PPT 功能** + +**评价**:加密真功夫,指纹伪装真功夫,"黑科技"模块水分大。 + +--- + +### ⭐⭐⭐⭐ 6. Chrome 扩展兼容层 —— 真做到了 + +**extension/(31 文件,22661 行,单模块最大)** + +- `ChromeExtensionParser.kt:77-243`:真的解析 `manifest.json` + - 支持 `content_scripts`、`permissions`、`background` 等 + - 生成虚拟 `chrome-extension://` URL scheme +- `ChromeExtensionPolyfill.kt:1409`:实现 `chrome.runtime.sendMessage()` +- `DeclarativeNetRequestEngine.kt`:声明式网络请求规则(Manifest V3) +- `ExtensionFileManager.kt:399-407`:扫描嵌套目录找 manifest.json + +**评价**:可以原生运行简单 Chrome 扩展。国内少见的完整实现。 + +--- + +### ⭐⭐⭐⭐ 7. AI 模块 —— 多家 LLM 适配 + +**ai/(14 文件,10850 行)** + +- `AiApiClient.kt:30` 支持 Claude / Gemini / OpenAI / OpenRouter +- Anthropic header:`anthropic-version: 2023-06-01` +- 资源文件 `litellm_model_prices.json`(39KB)包含 100+ 模型即时价格 +- **无硬编码 API Key**(grep 未命中 sk-/claude-/AIza)—— 用户自带凭证,设计正确 + +**评价**:不是噱头,真做了多提供商抽象。价格表的存在说明考虑了成本优化。 + +--- + +## 三、体积与依赖 + +``` +core/ 模块体积 Top: + i18n/ 1.4M ← 翻译资源(可能机器生成,体积 20%+ 水分) + extension/ 916K ← Chrome 扩展系统 + apkbuilder/ 480K ← ★ APK 构建 + webview/ 480K + ai/ 468K + cloud/ 328K + crypto/ 172K + linux/ 108K + +assets/: + litellm_model_prices.json (39KB) + php_router_server.php (24KB) + sample_projects/ (40+ 示例) + +jniLibs/: libxul.so 被排除,运行时下载 +``` + +**APK 体积控制策略**:所有大二进制(GeckoView/Node/PHP/Python/Go)均通过 gradle task 下载 + 运行时下载,不直接打包。 + +--- + +## 四、技术评分矩阵 + +| 模块 | 评分 | 类型 | 备注 | +|------|------|------|------| +| APK 构建引擎 | 9/10 | 真功夫 | **全项目最高价值**,字节级 APK 操作 | +| 加密体系 | 8/10 | 真功夫 | PBKDF2+AES-GCM,按包名派生 | +| 浏览器引擎 | 8/10 | 真集成 | GeckoView 真接入 | +| Chrome 扩展 | 8/10 | 真功夫 | 完整 Polyfill | +| AI 多模型 | 7/10 | 真功夫 | 无硬编码 Key | +| 运行时集成 | 7/10 | 真集成 | 下载而非内置策略 | +| 指纹伪装 | 7/10 | 部分真 | Canvas/WebGL/Audio 真做 | +| 激活/订阅 | 6/10 | 调包 | 商业化模板 | +| "黑科技" BlackTech | 3/10 | 空壳 | 系统权限拿不到 | + +--- + +## 五、用处与立项判断 + +### 能用来干什么 + +1. **给自己的网站套 Android 壳并上架** —— 能做,但要小心商业版激活码锁 +2. **学习 APK 字节格式 / 打包原理** —— ⭐强烈推荐,`apkbuilder/` 就是教材 +3. **学习 Android 加密最佳实践** —— ⭐推荐,`crypto/` 很扎实 +4. **学习 Android 里跑多语言运行时** —— PHP/Node/Python 的集成套路可抄 +5. **Chrome 扩展移动化** —— 稀缺参考 +6. **做商业 SaaS 应用** —— ❌ 不推荐,别用别人的引流版 + +### 适合的人 + +- ✅ Android 开发者想学 APK 底层 +- ✅ Web 开发者想给自己站点套壳自用 +- ✅ 研究 Android 加密 / 反爬 / 扩展系统的人 +- ❌ 追求严肃商业落地的团队(用 Capacitor / Tauri Mobile) +- ❌ 想要社区生态的(单人项目 + 商业背景,风险大) + +### 抄代码优先级 + +1. **`core/apkbuilder/` 整块** —— 字节级 APK 操作,无替代品 +2. **`core/crypto/KeyManager.kt`** —— 按包名派生密钥的设计 +3. **`core/engine/BrowserEngine.kt` + `GeckoViewEngine.kt`** —— GeckoView 集成套路 +4. **`core/extension/ChromeExtensionParser.kt`** —— manifest.json 解析 +5. **`core/ai/AiApiClient.kt`** —— 多 LLM 适配 + +--- + +## 六、关键风险提示 + +1. **商业背景**:`https://api.shiaho.sbs` 硬编码,上游可能随时改协议 +2. **代码 dump 风格**:14 次提交 = 社区贡献几乎不可能,作者跑路就死 +3. **i18n 1.4MB 水分**:翻译疑似机器生成,不是真本地化投入 +4. **BlackTech 模块噱头**:核弹模式等系统级功能权限拿不到 +5. **GeckoView 按需下载**:首次启动有网络依赖,离线场景会报错 + +--- + +## 七、最终定论 + +**"是不是噱头"**:不是。APK 构建引擎这一块是真家伙,单独拎出来都够发一篇技术文章。 + +**"是不是纯开源神器"**:不是。是商业产品的引流版。 + +**"值不值得看"**:**非常值得**。作为 Android 底层学习材料,是近年来质量最高的开源项目之一。 + +**"该不该用在自己项目里"**:抄技术细节,别抄整个方案。尤其不要依赖 `https://api.shiaho.sbs` 和激活码系统。 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..048eb58 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM nginx:alpine +COPY site/ /usr/share/nginx/html/ +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..4c6fa7f --- /dev/null +++ b/nginx.conf @@ -0,0 +1,19 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + gzip on; + gzip_types text/plain text/css application/javascript application/json text/html; + gzip_min_length 1000; + + location / { + try_files $uri $uri/ /index.html; + } + + location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { + expires 7d; + add_header Cache-Control "public, no-transform"; + } +} diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..7a6783c --- /dev/null +++ b/site/index.html @@ -0,0 +1,497 @@ + + + + + +WebToApp 源码解析 · 把网站打包成 APK 的那把"神器"到底是不是真功夫 + + + + + + +
+ + + +
+

📦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

+
    +
  • AndroidManifest.xml 在 APK 里是二进制 XML(AXML),格式没有公开文档,只能逆 Android 源码 frameworks/base/tools/aapt/
  • +
  • 支持 UTF-8 和 UTF-16LE 双编码(旧 APK 常为 UTF-16,新 APK 多为 UTF-8)
  • +
  • 修改字符串必须保持字节长度——因为字符串池偏移表不可改,否则 AXML 解析会崩溃。作者在注释里明确写了这点
  • +
  • 支持清除 android:testOnly="true" 标志(让 Play Protect 不弹"应用未完全发布"警告)
  • +
  • 支持权限修复、组件 android:name 相对路径恢复为绝对类名
  • +
+ +
+ 为什么重要 —— 国内能自己写 AXML 编辑器的项目少到屈指可数(AXMLPrinter / Apktool 之外,几乎没有 Kotlin/纯 JVM 的现代实现)。这一块单拎出来就能发技术文章。 +
+ +

ARSC 字符串池编辑

+

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

+
    +
  • resources.arsc 是 Android 的编译后资源表,包含所有字符串、数值、布局引用
  • +
  • 作者在前 100 多行注释里详细写了 ARSC 二进制格式(Type Chunk / String Pool / Package Chunk / Config Chunk)——说明是真的啃过 frameworks/base/libs/androidfw/ResourceTypes.cpp
  • +
  • 实现"保长度替换":修改字符串时对齐到原字节长度,不动 offset 表
  • +
  • 这样才能在不重算整个资源表的前提下修改应用名称、默认文案
  • +
+ +

流式 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. +
  3. APK 要求 4 字节对齐——但 Java 的 ZipOutputStream 不暴露内部流位置,无法在线对齐
  4. +
+ +

方案:

+
    +
  • ZipUtils.kt:92-122:10MB 以上的 entry 强制走 STORED(无压缩)模式,先扫一遍文件算 CRC32,再流式写入——避免把整个文件读到内存。ApkBuilder.kt:1022 注释明确:"Node binary ~40MB, use streaming write"
  • +
  • ZipAligner.kt:23-156:自己实现一个"后对齐"写入器——边写边手动维护字节游标,在每个 entry 头前补 Extra Field 填充到 4 字节边界。这是绕 Java API 限制的正确姿势
  • +
+ +

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 官方 apksig 库——不是自己手搓的 RSA-SHA256(那种山寨实现很容易被 Play 拒绝)
  • +
  • 支持 v1 + v2 + v3 三种签名方案(Android 7+ 强制 v2,Android 11+ 用 v3)
  • +
  • 支持 Android KeyStorePKCS12 证书两种密钥源切换,不强制用户把私钥明文放本地
  • +
+ +
+ 工程质量 —— 签名这一步没有造轮子,调 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
+
+
    +
  • 真·依赖 org.mozilla.geckoview 包,不是字符串常量
  • +
  • 配置了反追踪 / SafeBrowsing / Cookie 隔离(第 52-61 行)
  • +
  • libxul.so 不内置——build.gradle.kts:137-142 明确 exclude,由 GeckoEngineDownloader.kt 首次启动按需下载(~150MB,太大不能内置)
  • +
+ +

System WebView · 备选路径

+

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

+ +

§4多运行时集成

+

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
运行时实现评价
Node.jscore/nodejs/NodeRuntime.kt + JNI 桥 NodeBridge.kt
调用 node::Start() 进程内跑
真 · 但单进程仅能启动一次(nodejs-mobile 限制,18-26 行注释写明)
PHPcore/php/PhpAppRuntime.kt:70-72nativeLibraryDir 加载
build.gradle.kts:250-284 downloadPhpBinary task 从 pmmp/PHP-Binaries 下载 PHP 8.4
真 · 绕 SELinux execute_no_trans 正确姿势
PythonPythonRuntime.kt + ProcessBuilder
下载 CPython,支持 Flask / Django / FastAPI
GoGoRuntime.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

+
    +
  • AesCryptoEngine.kt:AES-256-GCM + PBKDF2 派生密钥
  • +
  • core/crypto/KeyManager.kt:48-95:按包名 + 签名证书派生,每个打出去的 APK 拿到的密钥都不一样——防止一个 APK 的密钥被泄露后影响其他用户
  • +
  • AssetEncryptor.kt + SecureAssetLoader.kt:资源文件 AES 加密存储,加载时透明解密
  • +
+ +

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

+

core/disguise/BrowserDisguiseEngine.kt:39-80

+
    +
  • Level 1:BrowserKernel——改 HTTP headers + 注入基础 JS
  • +
  • Level 2-5:BrowserDisguise——22 个向量指纹伪装:Canvas / WebGL / Audio / Screen / Timezone / Fonts / Battery / Plugins...
  • +
  • OAuth 专用层:OAuthCompatEngine 针对 Google / Facebook / Microsoft 的登录反检测
  • +
  • 动态 JS 生成:BrowserDisguiseJsGenerator.kt 每次启动生成新的伪装脚本,防指纹收敛
  • +
+ +

blacktech/ · 这块是 PPT 功能

+

core/blacktech/BlackTechConfig.kt(203 行)

+
    +
  • "核弹模式""隐身模式""摩斯电码 SOS"——听起来很酷
  • +
  • 实际字段 forceMaxPerformance / forceBlockPowerKey / forceAirplaneMode需要系统级权限,用户态 APK 根本拿不到
  • +
  • 判断:这部分是给商业版 Pro/Ultra 宣传页用的噱头配置,真实效果不及一半
  • +
+ +

§6扩展系统 + AI 集成

+ +

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

+
    +
  • core/extension/ChromeExtensionParser.kt:77-243:真的解析 manifest.json,支持 content_scripts / permissions / background 标准字段
  • +
  • core/extension/ChromeExtensionPolyfill.kt:1409:实现 chrome.runtime.sendMessage() 等核心 API
  • +
  • DeclarativeNetRequestEngine.kt:Manifest V3 的声明式网络请求引擎
  • +
  • core/extension/ExtensionFileManager.kt:399-407:扫描嵌套目录查找 manifest.json
  • +
+
+ 可以原生运行简单的 Chrome 扩展 —— 广告拦截、暗色模式、脚本注入这类 content script 扩展,基本都能跑起来。国内少见的完整移动端 Polyfill。 +
+ +

AI 多模型适配

+

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

+
    +
  • Anthropic header:anthropic-version: 2023-06-01(正确的最新版本)
  • +
  • 资源文件 litellm_model_prices.json(39KB)包含 100+ 模型的即时价格——说明作者考虑了成本
  • +
  • 无硬编码 API Key:grep -r "sk-\|claude-\|AIza" 零命中,用户自带凭证。正确的设计
  • +
+ +

§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

+
    +
  • 支持 4 种类型:PERMANENT / TIME_LIMITED / USAGE_LIMITED / DEVICE_BOUND
  • +
  • 第 441-448 行用常量时间比较防时序攻击——写得很认真,说明作者是真的想把激活系统做稳
  • +
  • 时限/用途限制持久化到 DataStore(第 281-305 行)
  • +
  • 但开源代码里看不到"如果未激活则禁用 Pro 功能"的判断——那部分可能在私有仓库,或者用代码混淆隐藏了
  • +
+ +

证据 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"),
+}
+
    +
  • 6 档订阅 SKU,Pro / Ultra 两个级别 × 月/季/年
  • +
  • 依赖 com.android.billingclient:billing-ktx:7.0.0
  • +
  • 订阅状态检查:第 300-328 行
  • +
+ +
+ 结论 —— 激活码 + 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. 是不是纯开源神器? 不是。是商业产品的引流版,有闭源后端 + 订阅 + 激活码。
  4. +
  5. 值不值得看? 非常值得。作为 Android 底层学习材料,是近年来质量最高的开源项目之一。
  6. +
+ +

抄代码优先级

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

谁适合用它

+
    +
  • ✅ Android 开发者想学 APK 字节结构和打包原理
  • +
  • ✅ Web 开发者想给自己的站点快速套壳自用(别上架商业应用)
  • +
  • ✅ 研究 Android 加密 / 反爬 / 扩展系统的人
  • +
  • ❌ 追求严肃商业落地的团队 —— 用 Capacitor / Tauri Mobile
  • +
  • ❌ 想要活跃社区生态的 —— 14 次提交 + 单人维护,作者跑路就死
  • +
+ +

一句话总结

+
+ "技术优先"的商业应用 —— 作者没在代码里埋 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 验证。若后续提交改变了实现,请以上游为准。 +

+ +
+
+ +