WebToApp Shell模板构建流程:webview_shell.apk 如何从 :shell 模块生成并同步

发布时间:2026/9/16 14:44:53
WebToApp Shell模板构建流程:webview_shell.apk 如何从 :shell 模块生成并同步 WebToApp Shell模板构建流程webview_shell.apk 如何从 :shell 模块生成并同步【免费下载链接】web-to-appThe most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone项目地址: https://gitcode.com/GitHub_Trending/web/web-to-appWebToApp 是一款在手机上运行完整 APK 工坊的 Web 转 App 工具其导出功能的核心正是Shell 模板——一个名为webview_shell.apk的运行时外壳 APK。本文完整梳理这个模板如何从:shell模块构建、又如何自动同步到宿主应用的 assets 目录帮你理解预览正常、导出却失效这类问题的根源。一个仓库三个 Gradle 模块WebToApp 的构建由 settings.gradle.kts 定义了三个模块各自分工明确模块角色:app完整宿主编辑器界面、导出管线、各运行时预览:shellShell 模板模块构建出webview_shell.apk:clone-hostAPK 克隆/身份重塑支持库关键规则只有一条共享运行时代码写在app/里而不是shell/里。shell/目录本身非常薄只有 shell/src/main/AndroidManifest.xml 和 shell/src/main/java-overrides/ 下的少量覆写文件如WebToAppApplication.kt、自动启动接收器其余全部靠同步任务注入。源码同步syncShellRuntimeSources 任务shell/build.gradle.kts 定义了两个核心同步任务syncShellRuntimeSources一个Sync任务按 include/exclude 名单从../app/src/main/java挑选运行时源码输出到shell/build/generated/shellRuntimeSrc。包含清单覆盖ui/shell、ui/theme、core/webview、core/engine、core/extension、各语言运行时core/nodejs、core/python、core/php、core/golang等排除清单则剔除了宿主专用文件如WebToAppApplication.kt、EncryptedApkBuilder.kt、FaviconFetcher.kt等。syncShellRuntimeAssets一个Copy任务把app/src/main/assets中的php_router_server.php与web_extensions/**镜像到 shell 的资源目录——这些是 Gecko 引擎安装内置桥接扩展所必需的资产。两个任务都通过preBuild依赖挂入编译链见 shell/build.gradle.kts保证生成源码永远先于编译存在且只落在build/目录Git 工作区保持干净。模板生成一条命令的完整链路构建 Shell 模板只需一条命令./gradlew :shell:assembleRelease :app:syncShellTemplateApk --no-configuration-cache它背后串联起三步:shell:assembleRelease—— 编译 shell 模块的 release 变体。注意它的特殊配置targetSdk 28forkexec 运行时的硬性前提不可随意提升、开启 R8 混淆与资源压缩、通过 shell/proguard-rules.pro 控制裁剪、并用packaging规则剔除omni.ja、Gecko 大体积 so、libcronet*.so等宿主专用二进制。产出shell/build/outputs/apk/release/shell-release.apk—— 这就是模板的原始形态。:app:syncShellTemplateApk—— app/build.gradle.kts 中注册的Copy任务把上述 APK 复制到app/src/main/assets/template/并重命名为webview_shell.apk。自动同步机制preBuild 钩子与跳过开关更巧妙的是模板同步并不需要开发者手动触发// app/build.gradle.kts tasks.matching { it.name preBuild }.configureEach { if (!skipShellTemplateSync.get()) { dependsOn(syncShellTemplateApk) } }本地构建每次构建:app前都会自动重建并同步模板永远使用最新代码CI 场景可用-PskipShellTemplateSynctrue跳过同步加快流水线不入库webview_shell.apk被.gitignore*.apk规则排除新克隆仓库后首次构建即自动重新生成。关于模板目录的权威说明见 app/src/main/assets/template/README.md开发者文档 docs/developer/shell-sync.md 也完整记录了同步规则。模板生成后如何被使用模板就位后导出管线 ApkBuilder 会以它为唯一基础做二进制级补丁从 assets 提取模板缺失时才降级为宿主自身 APK正常流程不应触达注入assets/app_config.json配置运行时由 ShellModeManager.kt 经 Gson 反序列化改写包名、应用名、图标AXML/ARSC 补丁按应用类型嵌入运行时资源经apksig完成 V1/V2/V3 签名即最终可安装的 APK。生成的 APK 启动后走固定路径WebToAppApplication→ShellModeManager.isShellMode()检测app_config.json→ 解析ShellConfig→ 启动 WebView 与各运行时服务。关键约束与常见问题清单⚠️ 以下约束来自 AGENTS.md 与模板 README是维护模板时最容易踩的坑唯一模板禁止引入第二个模板 APK不要回喂已签名/已改名的导出产物不能当作模板重新投入构建链改完要重建修改 shell 成员关系include/exclude 清单或打包逻辑后务必重跑完整:shell:assembleRelease 模板同步——CI 的 check 任务只编译 debug 变体不覆盖 R8 与模板管线陈旧模板是高频故障源预览正常、导出坏掉多半是模板未重建或配置字段名在ApkConfigJSON 与ShellModeManager的SerializedName之间漂移可用scripts/check_config_field_drift.py做门禁检查。关注点对应位置什么代码进入 shellshell/build.gradle.kts 的 include/exclude模板构建入口:shell:assembleRelease:app:syncShellTemplateApk模板输出位置app/src/main/assets/template/webview_shell.apkShell 清单组件shell/src/main/AndroidManifest.xml配置漂移门禁scripts/check_config_field_drift.py总结WebToApp 的 Shell 模板机制可以概括为一句话源码在app/构建在:shell产物落回app/的 assets。syncShellRuntimeSources保证运行时代码单一源头syncShellTemplateApk保证模板常新preBuild钩子保证一切自动发生。理解这条app → shell → app的闭环链路你就掌握了 WebToApp 导出体系的地基。【免费下载链接】web-to-appThe most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone项目地址: https://gitcode.com/GitHub_Trending/web/web-to-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考