
WebToApp App Modifier 深度指南重打包已安装应用实现快捷方式伪装与完整克隆【免费下载链接】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-appApp Modifier应用修改器是 WebToApp 提供的重打包已安装应用工具它不依赖任何模板直接以设备上已安装的 APK 为原料要么生成一个指向原应用的新快捷方式入口要么在二进制层面修改清单与资源后重签名产出一个拥有全新身份、可独立安装的克隆 APK。读完本文你将掌握两种模式的区别与适用场景、完整的界面操作流程、克隆背后的 AXML/ARSC 二进制补丁与注入原理以及启动页 激活 公告三类增强能力是如何被注入到克隆包中的。App Modifier 是什么App Modifier 位于主界面⋮更多菜单中入口文档见 docs/guide/main-screen/more.md。它的定位与项目核心的Web 转应用web-to-app管线互补后者从零构建 APK而 App Modifier 负责改造已经安装的应用。从源码结构看该功能由以下模块支撑模块路径职责AppClonerapp/src/main/java/com/webtoapp/core/appmodifier/AppCloner.kt两种模式的核心执行器创建快捷方式 / 克隆并安装AppListProviderapp/src/main/java/com/webtoapp/core/appmodifier/AppListProvider.kt枚举可启动应用提供过滤、搜索、统计InstalledAppInfoapp/src/main/java/com/webtoapp/core/appmodifier/InstalledAppInfo.kt已安装应用的信息模型与结果类型定义AppModifyPayload / CloneConfigBuilderAppModifyPayload.kt、CloneConfigBuilder.kt增强配置的载体与clone_config.json生成CloneManifestRewriterapp/src/main/java/com/webtoapp/core/appmodifier/CloneManifestRewriter.kt二进制 AXML 清单重写器CloneLauncherActivityclone-host/src/main/java/com/webtoapp/clone/CloneLauncherActivity.kt注入到克隆包中的宿主启动器界面app/src/main/java/com/webtoapp/ui/screens/AppModifierScreen.kt应用库、身份编辑、输出模式、预览等全部 UI两种工作模式Shortcut Disguise 与 CloneApp Modifier 提供两种本质不同的输出方式理解其差异是正确选型的前提快捷方式伪装Shortcut disguise为已存在的应用创建一个伪装快捷方式入口。快捷方式使用你设定的新名称与新图标点击后通过Intent启动目标应用。它不复制 APK、不产生新安装包体积开销几乎为零适合换个名字换个图标的轻量需求。克隆Clone对已安装应用做真正的二进制克隆——修改 AndroidManifest.xml 与 resources.arsc、替换图标、注入宿主 DEX 与配置、再重新签名产出一个拥有新身份新包名的可安装 APK。适合图标/名称/包名实验与重打包研究。快捷方式模式的实现原理在 AppCloner.kt 的createModifiedShortcut中流程如下准备图标优先使用用户选择的图片否则回退到原应用图标最后兜底生成纯色默认图标prepareIcon见 AppCloner.kt构造启动 Intent若开启了启动页/激活/公告等增强AppModifyPayload.needsLauncher()判定则指向项目内的SplashLauncherActivity并携带 JSON 载荷否则直接使用getLaunchIntentForPackage获取原应用启动 Intent见 AppCloner.kt调用ShortcutManagerCompat.requestPinShortcut请求桌面固定快捷方式若当前启动器不支持则返回错误AppCloner.kt。快捷方式的短标签截取新名称前 10 字符长标签截取前 25 字符这一限制由ShortcutInfoCompat.Builder的 setShortLabel/setLongLabel 体现AppCloner.kt。克隆模式的完整执行链cloneAndInstallAppCloner.kt按阶段推进界面上的进度条即对应这些阶段校验源 APK读取InstalledAppInfo.apkPath文件不存在则报错生成新包名基于原包名加时间戳/随机数生成形如c.uniqueId的新包名generateClonePackageNameAppCloner.kt注入判断若启用了启动页/激活/公告增强则需要从 assets 加载clone_host/clone_host.dex缺失时给出明确错误AppCloner.kt二进制修补modifyApk遍历原 APK 的 ZIP 条目逐个处理详见下一节重签名调用JarSigner.sign对未签名包签名安装通过 FileProvider 以application/vnd.android.package-archive触发系统安装器AppCloner.kt。克隆成功后AppCloner 还会用PackageManager.getPackageArchiveInfo解析产物并打印包名、版本、Activity/Service/Provider 数量及 debuggable/testOnly 标志用于自检debugApkStructureAppCloner.kt。应用库浏览、过滤与搜索App Modifier 的第一步是从应用库选择目标应用。AppListProvider.getInstalledAppsAppListProvider.kt的实现要点枚举范围通过Intent.ACTION_MAIN CATEGORY_LAUNCHER查询可启动应用getLaunchablePackageNamesAppListProvider.kt保证列出的都是带桌面入口的应用应用信息每个条目包含包名、应用名、版本名/版本号、图标、APK 路径、是否系统应用、安装/更新时间、APK 大小InstalledAppInfoInstalledAppInfo.kt其中isSystemApp通过ApplicationInfo.FLAG_SYSTEM判定过滤AppFilterType枚举ALL / USER / SYSTEM控制过滤界面以三个 Chip 展示并附带计数用户应用、系统应用、全部搜索同时匹配应用名与包名忽略大小写排序按名称、大小APK 字节数或更新时间三种方式对应界面上的排序 Chip见 AppModifierScreen.kt 与 AppModifierScreen.kt。系统应用同样可被选择因此系统/用户过滤在克隆系统预装应用时尤其有用。身份设置新名称与新图标选定应用后进入编辑页AppModifyContentAppModifierScreen.kt身份设置包含两项新名称即桌面显示名与克隆包的应用名新图标支持从系统相册/文件选择ActivityResultContracts.GetContent也支持从内置图标库选取IconPickerWithLibrary组件。编辑状态由AppModifierEditState统一管理AppModifierEditState.kt最终通过toConfig转成AppModifyConfig交给 AppCloner。在克隆模式下图标替换并非简单覆盖AppCloner.replaceIconEntryAppCloner.kt会针对不同图标条目标识出round、foreground、background等变体分别处理——圆形图标用 DST_IN 蒙版裁圆自适应图标前景按 72/108 安全区等比缩放背景层则从图标主色推导纯色createSolidBackgroundIconApkTemplate.kt避免启动器合成时图片被绘制两次。输出模式与预览编辑页底部提供输出模式卡片OutputModeCard在 Shortcut 与 Clone 之间切换AppModifierScreen.kt。需要特别注意的是克隆模式的可用性约束cloneBlockedReasonAppModifierScreen.kt克隆需要原始图标如果设置了自定义图标克隆会被禁用原因见下一节注意事项克隆默认不携带增强开启启动页/激活/公告中的任何一项时克隆同样被禁用只能走快捷方式模式。当不满足克隆条件时输出模式会自动回退为快捷方式。预览IdentityPreviewCardAppModifierScreen.kt在构建前以原应用 → 新应用的并排形式展示修改结果左侧为原始名称/包名/图标右侧为修改后的名称与图标中间用箭头连接确认无误后再点底部按钮执行。执行期间底部栏会展示实时进度百分比与阶段文案。克隆的二进制修补AXML 与 ARSC克隆的核心在modifyApkAppCloner.kt它逐条重写原 APK 的 ZIP 内容剥离旧签名跳过META-INF/*.SF、*.RSA、*.DSA及MANIFEST.MF为后续重签名腾出空间重写 AndroidManifest.xml启用增强注入时使用CloneManifestRewriter.rewriteCloneManifestRewriter.kt目标为本项目自身时用轻量AxmlEditor其他应用走AxmlRebuilder.expandAndModify全量展开重写重写 resources.arscArscEditor将字符串池中的应用名替换为新名称并把图标路径统一修正为 PNG 格式替换图标条目命中ic_launcher*.png/mipmap*/drawable*规则时替换为按密度缩放的位图48/72/96/144/192 等注入增强内容追加新 DEX编号取现有 classesN.dex 最大值 1、写入assets/clone_config.json、写入assets/splash_media.png或.mp4。CloneManifestRewriter二进制级清单重写CloneManifestRewriter.kt 不依赖 aapt直接在二进制 AXML 层面工作解析 AXML 头、字符串池、资源映射与元素 chunk支持 UTF-8/UTF-16 两种字符串池编码将清单中所有相对类名.开头或裸类名展开为原包名的全限定名防止包名替换时误伤组件类替换包名字符串跳过疑似类名的段找到原启动 Activity含 MAIN LAUNCHER 的 intent-filter移除原启动 intent-filter避免克隆包出现两个桌面入口在/application前注入com.webtoapp.clone.CloneLauncherActivity带 MAIN/LAUNCHER intent-filter、exportedtrue重建字符串池与资源映射输出新的 AXML 字节流。重写后得到的原始启动 Activity 名会被写回clone_config.json的originalLauncherActivity字段供宿主启动器直接跳转原界面见 AppCloner.kt。注入的宿主CloneLauncherActivityCloneLauncherActivity.kt 是注入进克隆包的入口 Activity运行时读取assets/clone_config.json按序完成激活校验本地激活码匹配支持去除-/空格的归一化、SHA-256 哈希比对、常量时间比较防时序攻击或远程激活https://POST 校验支持ALLOW/ALLOW_CACHED/ 拒绝三种离线策略公告展示支持纯文本或 HTML 内容、可选跳转链接按钮启动页图片启动页CENTER_CROP/FIT_CENTER 倒计时或视频启动页MediaPlayer 起止时间裁剪 可静音跳转原应用优先用originalLauncherActivity直启克隆包内原 Activity失败则回退getLaunchIntentForPackageCloneLauncherActivity.kt。CloneConfigBuilder.buildJsonCloneConfigBuilder.kt负责把界面配置序列化为该 JSON字段包括splashEnabled、splashType、splashDuration、splashClickToSkip、splashOrientation、splashFillScreen、splashEnableAudio、splashVideoStartMs/EndMs以及激活相关的activationCodes、activationRequireEveryTime、activationDialog、remoteActivationEnabled、remoteVerifyUrl、remoteOfflinePolicy和公告相关的announcementTitle/Content/ContentIsHtml/LinkUrl/LinkText。重签名JarSigner 自生成密钥克隆包必须重签名才能安装。JarSignerapp/src/main/java/com/webtoapp/core/apkbuilder/JarSigner.kt使用SHA256withRSA算法密钥对在首次使用时通过 Android Keystore 或纯 RSA 生成器自举创建并持久化为 PKCS#12webtoapp_keystore.p12见 JarSigner.kt。签名入口sign(inputApk, outputApk)JarSigner.kt会做输入校验、失败自动重建密钥并带重试。由于签名密钥是本地自生成的克隆包与原应用签名不同因而可与之共存安装这也正是克隆能形成独立新身份的根基。注意事项与使用边界原文档明确列出以下几点源码也给出了对应印证克隆模式可能需要原始图标界面层在设置了自定义图标时直接禁用克隆Strings.appModifierCloneNeedsOriginalIcon因为图标替换涉及 AXML/ARSC 中引用关系的联动重写原始图标路径是重写资源表时的稳定锚点默认不应用任何增强开启启动页/激活/公告后克隆不可用Strings.appModifierCloneNoEnhancements必须依赖注入clone_host.dex才能工作缺少该资源时会明确报错产物是二进制级修补并重签名的 APKclone 输出位于应用外部存储目录的cloned_apks/文件名形如新名称_clone.APK文件名经过清洗与截断AppCloner.kt合法使用该功能定位是图标/名称/包名实验与重打包技术研究仅应在拥有相应权利的应用上使用。请遵守目标应用的许可协议与当地法律法规切勿用于绕过授权或盗版分发。小结App Modifier 为 WebToApp 补齐了改造既有应用的能力闭环快捷方式模式以极低代价实现桌面入口伪装克隆模式则在纯 Android 端完成 AXML/ARSC 二进制修补、DEX 注入与 RSA 重签名产出拥有全新包名的可安装 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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考