WaEnhancer X 的工作原理及为何要用纯 Java 重写 WhatsApp Hook
使用官方 WhatsApp 客户端是一种独特的体验。这款通讯应用不断堆积侵入性的 Meta AI,丢失便捷的设置,或者限制媒体查看。以前,爱好者们通过第三方修改版(如 WhatsApp Plus)来解决这些问题,但 Meta 会迅速封禁运行修改版 APK 文件的账号。在 Android 上,还有另一条路:通过 LSPosed 框架直接在内存中修改应用行为。
在 GitHub 上,我发现了 WaEnhancer X 仓库。它是原始 WaEnhancer 项目的分叉,选择了一条有趣的工程路线。当原始模块的作者开始用 Kotlin 重写代码并将设置移到外部屏幕时,WaEnhancer X 的开发者退了一步,选择了纯 Java 并直接集成到 WhatsApp 界面中。
内部实现:从屏蔽 AI 到直接操作 SQLite
该模块的主要任务是在原始 WhatsApp 客户端内部拦截方法调用并修改其逻辑。以下是从技术角度实现的几个示例:
- 销毁侵入性 UI。 WhatsApp 不断尝试通过服务器标志推送 Meta AI 横幅。WaEnhancer X 拦截这些 UI 元素的创建,并在屏幕渲染前强制将状态设置为
View.GONE。 - 直接 SQL 查询而非等待 UI 动画。 当你删除状态或消息时,标准客户端会运行一系列动画和对话框。该模块绕过这一层,直接通过
MediaProvider访问本地 SQLite 数据库message和文件存储,即时执行操作。 - 绕过时间限制。 一次性媒体文件(阅后即焚)阻止截图和重播查看。应用代码中的一个 Hook 替换了访问标志,使查看永久化,并允许将文件保存到相册。
- Tasker 集成。 该模块可以从第三方自动化工具接收 Android Intents,实现基于位置或时间表的隐私模式自动化。
架构技巧:如何结合 GPL 和专有代码
该仓库最有趣的部分隐藏在模块结构和许可中。项目被严格划分为三个独立组件:
+-------------------------------------------------------+
| Helper Plugin APK |
| (Закрытый код / Дополнительные фичи) |
+-------------------------------------------------------+
|
v (Compile-Time Dependency)
+-------------------------------------------------------+
| :api Module |
| Лицензия Apache-2.0 / Интерфейсы и DTO |
+-------------------------------------------------------+
^
| (Shared API Dependency)
+-------------------------------------------------------+
| :app Module |
| Лицензия GPL-3.0 / Основной фреймворк |
+-------------------------------------------------------+
为什么需要这样的复杂性?为了避免违反 GNU GPL v3 条款。主 Hook 模块(:app)以 GPL-3.0 分发。如果与闭源组件一起编译,将导致许可违规。
作者将所有交互接口移到一个单独的模块 :api 中,采用宽松的 Apache-2.0 许可。在运行时,开放的主程序通过 ContentProvider 检测辅助 APK,并通过自己的 ClassLoader 动态加载它。结果是,闭源插件通过接口 :api 在 WhatsApp 进程内执行,而与 GPL 许可的主程序代码没有直接的二进制依赖关系。
为什么选择 100% Java 而非 Kotlin
现代 Android 开发几乎已完全转向 Kotlin,但对于 Xposed 模块,Java 仍有其优势。在持续处理低级反射(FeatureLoader)时,纯 Java 提供以下好处:
- 可预测的字节码。 没有 Kotlin 编译器的魔法(内联函数、合成方法和元数据生成),简化了 Hook 调试。
- 零开销。 Kotlin 标准库不会加载到 WhatsApp 进程中,这减少了如果 WhatsApp 本身使用不同版本库时的版本冲突风险。
- 更新后更稳定。 当 WhatsApp 的类结构在新版本中发生变化时,方法拦截方法的破坏性更小。
该模块的设置界面也没有使用 Jetpack Compose。开发者使用了标准的 PreferenceFragmentCompat,将模块菜单直接嵌入到 WhatsApp 自己的设置中。它看起来像原生应用部分,为了方便导航,编写了一个类 FeatureCatalog 来索引开关并使用本地化字符串搜索所需功能。
如何在设备上试用该模块
运行 WaEnhancer X 需要一台准备好的智能手机:
- 设备必须拥有 Root 权限并安装了 LSPosed(Zygisk 或 Riru 版本)。
- 从 GitHub 仓库下载现成的 APK 并安装。
- 打开 LSPosed Manager 应用并激活 WaEnhancer X 模块。
- 在应用程序列表(作用域)中选择 WhatsApp。
- 通过系统菜单停止 WhatsApp("停止" / 强制停止)并重新启动通讯应用。
之后,WhatsApp 设置中会出现一个新的模块选项区域。
为什么要关注这个项目
WaEnhancer X 清晰地展示了如何通过适当的模块分离来规避许可限制,从而创建 Android 附加组件。该项目对学习反射、LSPosed Hook 架构和向第三方应用注入代码的开发者很有帮助。
代码的基础部分是开放的,没有外部追踪器,清晰地展示了如何在不创建可疑的第三方构建版本的情况下修改封闭通讯应用的行为。
相关项目