
WebToApp APK 导出配置完全指南打包、签名、权限与构建选项详解【免费下载链接】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 开源项目的APK Export ConfigAPK 导出配置展开。它是 Edit Common Config 编辑器中的导出抽屉面板由ApkExportConfig数据类支撑集中管理生成 APK 的打包与身份设置。读完本文你将掌握包名/版本号/引擎类型等身份配置、Keystore 签名与 V1/V2/V3 签名方案、基于功能的运行时权限裁剪、mTLS 客户端证书认证以及资源加密、隔离、后台运行、通知、强制全量重建等构建期选项的完整用法与底层原理。一、APK Export Config 是什么在 WebToApp 中每个应用Web 站点、HTML、PHP、Python、Node.js、Go、WordPress 等类型都可以被一键打包成独立的 Android APK。打包产物涉及两类截然不同的设置静态导出配置Export Drawer在 Edit Common Config 编辑器中的APK export config抽屉里设置对应数据类ApkExportConfig持久化在每个应用的配置中长期有效。构建期选项Build Dialog每次执行构建 APK 时在独立的构建对话框中临时选择对应界面实现位于 BuildApkScreen.kt。ApkExportConfig的完整字段定义位于 WebApp.kt包括customPackageName、customVersionName、customVersionCode、architecture、runtimePermissions、networkTrustConfig、encryptionConfig、isolationConfig、backgroundRunEnabled、backgroundRunConfig、engineType、notificationEnabled、notificationConfig、loggingEnabled、targetSdk等。UI 入口在 CreateAppApkSection.kt 的ApkExportSection组件中。二、Identity应用身份配置2.1 自定义包名Custom Package Name包名即 APK 的 application id是应用在设备与市场上的唯一标识。WebToApp 允许为生成的 APK 指定自定义包名并按包名模式正则进行实时校验。在 CreateAppApkSection.kt 中输入框会使用AppConstants.PACKAGE_NAME_REGEX校验包名非空时若不匹配正则界面会显示错误提示packageNameInvalidFormat并阻止保存。如果不填自定义包名构建器会自动推导。在 ApkBuilder.kt 中fun resolvePackageName(webApp: WebApp): String { val custom webApp.apkExportConfig?.customPackageName?.takeIf { it.isNotBlank() it.matches(PACKAGE_NAME_REGEX) } return custom ?: generatePackageName(webApp.name) }自动生成规则为取应用名hashCode()的 36 进制前 4 位规范化为合法 Java 包段后拼接为com.w2a.segment。注意resolvePackageName的推导逻辑同时被构建器与导出界面复用保证界面上显示的包名与最终产物一致。2.2 版本号 / 版本名Version Code / Version Name版本配置包含两个字段见 CreateAppApkSection.ktVersion Code整数输入框限定为纯数字KeyboardType.Number用于系统判断升级。Version Name字符串面向用户展示的版本标识。智能版本建议如果目标包名已经安装在当前设备上构建器会自动建议下一个版本号。Android 要求新 APK 的 versionCode严格大于已安装版本才能覆盖安装因此在 ApkBuilder.kt 中fun suggestedVersionForInstall(context: Context, webApp: WebApp): PairInt, String? { val installed findInstalledVersionCode(context, resolvePackageName(webApp)) ?: return null val config webApp.apkExportConfig val configured config?.customVersionCode ?: 1 if (configured installed) return null // 用户已显式设置更高版本则不动 val bumpedCode (installed 1).coerceAtMost(Int.MAX_VALUE.toLong()).toInt() val currentName config?.customVersionName?.takeIf { it.isNotBlank() } ?: DEFAULT_VERSION_NAME return bumpedCode to bumpVersionName(currentName) }bumpVersionName只递增版本名末尾的数字段如1.0.0 → 1.0.1、v2.1 → v2.2对以非数字结尾的版本名如1.0.0-beta保持原样避免生成用户不期望的版本号。在构建对话框中该建议值会被展示出来并自动写回customVersionCode/customVersionName见 BuildApkScreen.kt。2.3 引擎类型Engine Type导出应用可以选择两种渲染内核System WebView系统 WebView默认值SYSTEM_WEBVIEW。GeckoViewMozilla GeckoView 内核。引擎类型仅对 Web 类应用展示见 BuildApkScreen.kt。选择 GeckoView 时构建器会通过EngineFileManager检查对应版本的 Gecko 引擎是否已下载GeckoEngineDownloader.DEFAULT_VERSION未下载则在构建前自动补齐。三、Signing签名配置3.1 Keystore 管理签名是 APK 的身份印章。WebToApp 内置了完整的 Keystore 生命周期管理实现在 CreateAppApkSection.kt 的CustomSigningSection支持创建在应用内生成新的自定义签名密钥signer.createCustomKeystore(spec)。导入通过系统文件选择器导入已有 Keystore需输入存储密码Store Password与可选密钥密码Key Password底层由JarSigner.importKeystore完成并区分返回StorePasswordRejected、KeyPasswordRejected、NoKeyEntry、UnsupportedFormat等错误类型。导出将当前签名导出为webtoapp_signing.p12PKCS#12 格式用于在其他设备或 CI 中复用同一签名。查看指纹展示证书指纹getCertificateFingerprints()便于在第三方平台如地图、登录 SDK登记签名 SHA-1/SHA-256。移除自定义密钥回到自动生成签名。支持的 Keystore 格式包括PKCS12 / PFX / JKS / BKS。签名状态分为三种PKCS12_CUSTOM自定义导入、PKCS12_AUTO自动生成、ANDROID_KEYSTOREAndroid KeyStore 系统级密钥。3.2 签名方案Signature Schemes导出配置支持V1 / V2 / V3三种签名方案独立开关并具备Legacy 自动回退当设备系统版本不支持新版签名时自动回退到旧方案保证兼容性。自定义 V1 签名器文件名可指定 V1JAR 签名使用的签名器文件名用于规避部分市场或系统对默认META-INF/CERT.RSA的检测。四、Runtime Permissions基于功能的权限裁剪权限不是手动堆积的而是功能驱动feature-driven派生的。WebToApp 会根据用户启用的功能自动推导所需运行时权限并在构建时从未使用权限的模板 manifest 中裁剪掉多余项避免权限过度声明。推导逻辑集中在 RuntimePermissionSync.kt 的featureRequiredRuntimePermissions函数中例如开启后台运行backgroundRunEnabled→ 自动启用foregroundService、wakeLock、notifications、requestIgnoreBatteryOptimizations开启通知notificationEnabled→ 自动启用notifications、foregroundService开启开机自启bootStartEnabled→ 自动启用bootCompleted开启悬浮窗→ 自动启用systemAlertWindow、foregroundService开启原生桥接的通知能力→ 自动启用notifications。ApkRuntimePermissions完整定义了相机、麦克风、定位、通知、存储、蓝牙、NFC、传感器、通讯录、日历、短信、通话记录、前台服务、唤醒锁、忽略电池优化、开机广播、安装/卸载应用、悬浮窗等 30 项权限开关见 WebApp.kt。同时提供manualBeyond(auto)方法用户在功能自动启用之外手动添加的权限会被保留而关闭某功能后对应的自动权限会被同步清除修复了自动权限无法关闭的问题。注权限裁剪依赖构建时的模板 manifest 处理Web 类等不涉及服务端运行时的应用类型不声明多余权限。五、Network Trust网络信任与 mTLS5.1 信任体系NetworkTrustConfig见 WebApp.kt控制导出的 APK 对服务端证书的信任策略信任系统 CAtrustSystemCa默认开启信任用户 CAtrustUserCa默认关闭自定义 CA 证书列表customCaCertificates可从系统文件选择器导入 PEM / X.509 / 任意二进制格式证书导入时校验并记录 SHA-256 指纹与显示名见 CreateAppApkSection.kt 的NetworkTrustStorage.importCertificates允许明文流量cleartextTrafficPermitted默认开启。该面板还支持将整套网络信任配置保存为预设ConfigPresetStorage.saveNetworkTrust并在多个应用间复用。5.2 客户端证书认证mTLS客户端证书认证与信任服务端 CA是两回事前者是服务器要求客户端出示身份证书mTLS 双向认证后者是客户端验证服务器的证书。当服务器请求客户端证书时生成的 APK 会打开Android 系统证书选择器让用户选择设备上已安装的身份证书identity此后对该服务器的后续连接会自动复用所选身份无需重复选择。六、构建期选项Build Dialog以下选项在构建 APK 时选择界面见 BuildApkScreen.kt它们属于每次构建独立决策的配置不持久化为应用长期设置。6.1 资源加密PBKDF2 AES-256-GCMApkEncryptionConfig见 WebApp.kt控制资源加密算法PBKDF2 密钥派生 AES-256-GCM认证加密加密配置在toEncryptionConfig()中映射为EncryptionConfig.MAXIMUM。自定义密码可选填填入后使用该密码派生密钥不填则使用密钥模式绑定密钥。密钥模式keyModeSIGNATURE默认密钥与签名绑定应用一旦被重新签名则无法解密EMBEDDED构建时生成随机密钥并以混淆方式内嵌进 APK使加密在Play 应用签名 / 任何重新签名后依然可用。威胁响应threatResponse检测到篡改/调试等威胁时的处置策略枚举值包括LOG_ONLY仅记录、SILENT_EXIT静默退出、CRASH_RANDOM随机崩溃、DATA_WIPE擦除数据、FAKE_DATA返回伪造数据。6.2 隔离Isolation按应用隔离 WebView 的敏感能力对应IsolationConfigIsolationConfig.kt覆盖存储、WebRTC、Canvas、Audio、WebGL、字体、Headers、IP八个维度另含指纹随机化、时区/语言/屏幕伪装等选项。提供三档预设DISABLED关闭隔离BASIC隔离存储、WebRTC保护 CanvasSTANDARD在 BASIC 基础上随机化指纹、启用请求头策略、保护 Audio/WebGLMAXIMUM全维度启用含指纹启动时重生成、请求头按请求随机化、IP 伪装、时区/语言/屏幕伪装。6.3 后台运行Background Run保持一个前台服务存活使应用在后台继续工作。配置项BackgroundRunExportConfig见 WebApp.ktnotificationTitle/notificationContent前台服务通知的标题与内容showNotification是否显示常驻通知keepCpuAwake是否保持 CPU 唤醒。开启后台运行会自动派生foregroundService、wakeLock、notifications、requestIgnoreBatteryOptimizations四项权限。6.4 通知Notifications定时/持久通知与轮询对应NotificationExportConfig见 WebApp.kt通知类型NotificationType包括类型key说明NONEnone不启用WEB_APIweb_apiWeb Notification API 桥接POLLINGpollingHTTP 轮询pollUrl、pollIntervalMinutes默认 15 分钟、pollMethod默认 GET、pollHeaders、clickUrlWEBSOCKETwebsocketWebSocket 推送wsUrl、wsHeadersFCMfcmFirebase Cloud MessagingregisterUrl、authToken、fcmProjectId、fcmApplicationId、fcmApiKey、fcmSenderId、fcmGoogleServicesJson6.5 强制全量重建Force Full Rebuild默认构建使用增量缓存ApkBuildCache加速重复构建勾选强制全量重建则跳过增量缓存从零构建。构建对话框同时提供清空增量缓存按钮apkBuilder.clearIncrementalCache用于排查缓存导致的异常产物。6.6 构建流程中的其他环节构建并非点了就跑。在 BuildApkScreen.kt 的launchBuild中实际顺序为运行时依赖检查ExportRuntimeEnsure.ensure按应用类型Python / Node.js / PHP / WordPress及 HTTP/3、ECH 需求、ABI 过滤器下载并准备运行时Go 等 forkexec 型运行时的 ABI 由ApkArchitecture的abiFilters决定见 WebApp.ktUNIVERSAL含 armeabi-v7a/arm64-v8a/x86/x86_64ARM64与ARM32为精简子集构建预检ApkExportPreflight.check检查包名、签名、运行时等条件有错误即中止执行构建buildApk带进度回调产物分析ApkAnalyzer.AnalysisReport展示 APK 大小、各资源分类占比条形图与版本信息安装或导出 AAB构建成功后可直接安装或转入 Google Play 的 AAB 导出流程。七、注意事项与 Play Store 分发Play Store 分发请导出 AAB从 Google Play 导出 AAB 时构建器会把targetSdk重写为 Play 要求的级别。这一设计是有原因的——见 WebApp.kt 中targetSdk字段的注释shell 模板默认targetSdk 28因为forkexec 服务端运行时Node/PHP/Python/Go/WordPress需要 W^X 不被强制执行targetSdk ≥ 29 会在应用可写数据目录上强制 W^X从而阻止 execve 内嵌二进制。因此需要服务端运行时的应用类型忽略targetSdk覆盖始终保持在 28纯 WebView 应用类型不依赖该能力可以提升targetSdk以满足 Play 商店合规要求界面中的TargetSdkOverrideSection仅在这类应用上显示。八、延伸阅读Edit Common Config 总览所有能力卡片的入口列表导出 AAB / Google Play 分发Play 商店上架流程导出 APK 操作指南端到端导出步骤源码参考WebApp.kt、IsolationConfig.kt、RuntimePermissionSync.kt、ApkBuilder.kt、CreateAppApkSection.kt、BuildApkScreen.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),仅供参考