WebToApp 导出(Export)功能全解:将 Web 应用导出为可跨设备复用的项目模板

发布时间:2026/9/17 14:46:56
WebToApp 导出(Export)功能全解:将 Web 应用导出为可跨设备复用的项目模板 WebToApp 导出Export功能全解将 Web 应用导出为可跨设备复用的项目模板【免费下载链接】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导读WebToApp 的Export导出功能可以把一个已创建的 Web 应用从运行中的配置打包成可在另一台设备上重新导入的项目模板project template实现应用定义配置与内容的跨设备迁移。本文以docs/guide/app-actions/export-apk.md为骨架结合app/src/main/java/com/webtoapp/core/export/AppExporter.kt的源码实现完整讲解导出入口、两种导出形态、模板目录结构与生成参数并厘清 Export / Build / Share 三种动作的差异帮助你正确选择搬家还是分发。一、Export 是什么导出的是可复用的项目模板与直觉不同WebToApp 中的Export并不产出 APK 安装包而是把应用的配置以及内容打包成一个便携模板portable template。文档的原始定义如下Exports the app as areusable project templateyou can import on another device. Tap ⋮ on an app card, thenExport.也就是说导出物一份可以在另一台设备上再次导入、继续编辑或重新构建的应用定义入口应用卡片右上角的⋮更多菜单 →Export产出位置成功后界面Snackbar会直接报告导出文件的输出路径ExportResult.Success(path)中的path。从源码看导出功能由 AppExporter.kt 承担对外暴露两类导出方法AppExporter.kt方法产出用途exportAsTemplate(webApp)完整 Gradle Android 工程目录拿到源码工程可在任意设备/电脑上重新编译exportConfig(webApp)单个配置 JSON 文件仅迁移应用定义体积最小、最轻量二、两种导出形态完整工程模板 vs 配置 JSON原文档仅笼统描述打包配置和内容为便携模板而源码揭示了两种截然不同的导出粒度这也是理解 Export 能力的关键。1. 形态 AexportAsTemplate—— 生成完整 Gradle 工程这是卡片菜单上Export按钮HomeScreen.kt 的onExport回调实际调用的方法。它会在导出目录下创建一个以**应用名已清洗**命名的子目录写入一整套可以直接用 Android Studio 打开的工程导出目录/应用名/ ├── build.gradle.kts # 根构建脚本AGP 8.2.0 Kotlin 1.9.20 ├── settings.gradle.kts # rootProject.name 清洗后的应用名 ├── README.md # 自动生成的工程说明与编译步骤 └── app/ ├── build.gradle.kts # 应用构建脚本含 applicationId、签名、依赖 └── src/main/ ├── AndroidManifest.xml ├── java/com/webtoapp/generated/AppConfig.kt # 核心配置常量类 └── res/ ├── values/strings.xml # app_name ├── xml/network_security_config.xml # 网络信任配置 ├── raw/*.cer # 自定义 CA 证书如有 └── mipmap-xxxhdpi/ic_launcher.png # 应用图标192px 及以上目录结构依据 AppExporter.kt 的createTemplateProject生成逻辑整理生成的 Gradle 参数generateAppBuildGradle参数值说明namespace/applicationIdcom.webtoapp.清洗后的应用名由应用名转换而来见下文命名规则compileSdk/targetSdk34模板固定采用minSdk24覆盖 Android 7.0 及以上versionCode/versionName1/1.0.0首次生成默认值release.isMinifyEnabledtrue开启 R8 混淆使用 proguard-android-optimizeJava / Kotlin 目标17需要 JDK 17依赖androidx.core:core-ktx:1.12.0、androidx.appcompat:appcompat:1.6.1、androidx.webkit:webkit:1.9.0模板自带的最小 WebView 应用依赖集核心配置类AppConfig.kt的字段映射generateAppConfig——它把应用编辑器中设置的开关与规则直接编译为 Kotlin 常量让模板脱离 WebToApp 也能独立运行常量来源字段说明APP_NAME/TARGET_URLname/url应用名与目标网址ACTIVATION_ENABLED/ACTIVATION_CODESactivationEnabled/ 激活码列表激活验证开关与授权码AD_BLOCK_ENABLED/AD_BLOCK_RULESadBlockEnabled/adBlockRules广告拦截开关与规则列表ANNOUNCEMENT_*announcement公告弹窗的启用、标题、内容、链接与仅显示一次JAVASCRIPT_ENABLED/DOM_STORAGE_ENABLED/ZOOM_ENABLED/DESKTOP_MODEwebViewConfigWebView 行为开关此外模板还会同步生成network_security_config.xml由NetworkSecurityConfigBuilder构建当开启**防截屏antiCapture**时模板会自动把trustUserCa置为false并同步复制用户配置的自定义 CA 证书到res/raw/AppExporter.kt。命名清洗规则sanitizeFileName / sanitizePackageName目录名仅保留a-z、A-Z、0-9、_、-及中文字符其余替换为_包名小写化后仅保留a-z0-9最长截取 20 字符若结果为空则回退为app。模板自带 README.md记录了标准编译流程generateReadme使用Android Studio Hedgehog 或更高版本、JDK 17同步 Gradle 后执行Build Build Bundle(s) / APK(s) Build APK(s)产物位于app/build/outputs/apk/。这意味着一张卡片导出的是一份完整的可编译源码工程而不仅是配置文件。2. 形态 BexportConfig—— 生成配置 JSONexportConfigAppExporter.kt仅导出应用定义本身输出一个文件名为应用名_config_时间戳.json的单文件外层结构为{ version: 1, exportTime: 1720000000000, app: { id: 1, name: MyApp, url: https://example.com, activationEnabled: true, activationCodeList: [], adBlockEnabled: false, adBlockRules: [], announcementEnabled: false, announcement: null, webViewConfig: { } } }其中version 1是导出格式的版本号exportTime为导出时间戳app字段集合由WebApp.toExportFormat()决定AppExporter.ktJSON 通过GsonBuilder().setPrettyPrinting()美化输出。配置 JSON 适合在仅需迁移设置、体积最小时使用——例如通过 Agent 的ExportApp工具按需生成。三、导出路径与文件名规则导出目录由 getExportDirectory 决定并且随系统版本分叉Android 10API 29及以上context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)/WebToApp应用专属目录无需存储权限Android 10 以下Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS)/WebToApp公共 Documents 目录。时间戳采用yyyyMMdd_HHmmss格式dateFormat保证同应用重复导出时文件不会互相覆盖。导出成功后ExportResult.Success(path)中的绝对路径会通过 Snackbar 反馈给用户HomeScreen.kt界面文案来自 Strings.kt 的projectExportedTo。四、Export vs Build vs Share三种动作的本质区别原文档用一张对比表区分三种动作这里结合源码再深化一层动作产出代码路径适用场景Export可复用项目模板 / 配置 JSON可再次导入AppExporter.kt 的exportAsTemplate/exportConfig把应用定义迁往另一台设备或交给开发者在电脑上继续编译Build APK可安装、已签名的 APKApkBuilder.kt组装 签名V1/V2/V3本地产出安装包直接安装Share APK通过系统分享面板发送的已构建 APKHomeScreen.kt中apkBuilder.buildApk(...)后唤起系统分享把安装包发给他人安装简言之Export 移动应用的定义definition产物是给人/给 IDE 用的工程或 JSONBuild/Share 分发可安装的 APK产物是给设备安装的二进制。这也是原文档 Notes 中用 Export 在设备间搬运定义、用 Build/Share 分发安装包的最佳实践。需要提醒的是导出的是模板工程而非 WebToApp 的完整构建管线。WebToApp 本身在手机上完成一键构建签名 APK的能力由 export-pipeline.md 描述的core/apkbuilder/约 24 个文件支撑——包括ApkConfig主配置结构、ApkConfigJsonFactory序列化、AXML/ARSC 二进制补丁、JarSigner签名与 16KB 对齐等而 Export 产出的模板则是把配置翻译成标准 Android 工程交由 Android Studio/Gradle 构建。两者定位互补。五、在 Agent 中触发导出ExportApp 工具除卡片菜单外内置 Agent 也可以通过ExportApp工具程序化触发导出AppLifecycleTools.kt。其参数 schema 为参数类型必填说明appIdinteger是目标应用 idformatenum(template|config)否导出格式默认template实现上有两个值得注意的工程细节未知值直接报错format只接受template或config其余值返回ExportApp: unknown format ...错误防止拼写错误导致误触发重量级的工程导出结果透传路径成功后返回Exported to: 绝对路径与 UI 层 Snackbar 展示的路径同源均来自ExportResult.Success.path。该工具同时被注册进 Agent 的工具注册表ToolRegistryFactory.kt意味着用户可以用自然语言让 Agent 完成把这个应用导出成工程模板这类操作。六、注意事项与最佳实践按迁移粒度选择形态只想带走设置 → 导出配置 JSON单文件、体积最小想要源码级工程、便于二次开发或离线编译 → 导出工程模板。模板是独立工程导出的 Gradle 工程包含自己的applicationId、签名配置与依赖声明编译环境需满足Android Studio Hedgehog 与 JDK 17首次编译需联网拉取依赖模板 README 已注明。防截屏联动开启防截屏的应用导出后其网络安全配置会自动禁用用户 CA 信任这是安全策略在模板中的延续改回前请注意影响面。命名会经过清洗应用名中的特殊字符会在目录/包名中被替换或截断包名最长 20 字符若发现导出目录名与原始应用名略有出入属于预期行为。Export 不等于 Share导出模板用于迁移定义若目标是让最终用户直接安装请走 Build APK / Share APK构建与分享管线见 export-pipeline.md。重复导出不覆盖配置 JSON 文件名带yyyyMMdd_HHmmss时间戳多次导出会各自保留而工程模板目录会先删除同名旧目录再重建确保产出始终是最新配置。参考与延伸阅读功能入口与 UI 回调HomeScreen.kt导出核心实现AppExporter.ktAgent 工具层AppLifecycleTools.ktAPK 构建/签名管线与 Export 互补docs/developer/export-pipeline.md界面文案定义Strings.kt【免费下载链接】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),仅供参考