Как устроен WaEnhancer X и зачем переписывать хуки WhatsApp на чистую Java

02 авг 2026
306
24
6
1 месяц

Пользоваться официальным клиентом WhatsApp — занятие специфическое. Мессенджер то и дело обрастает навязчивым Meta AI, теряет удобные настройки или ограничивает просмотр медиафайлов. Раньше энтузиасты решали такие проблемы сторонними модификациями вроде WhatsApp Plus, но за запуск измененных APK-файлов компания Meta быстро раздает баны аккаунтов. На Android существует другой путь: изменять поведение приложения прямо в оперативной памяти с помощью фреймворка LSPosed.

На GitHub мне попался репозиторий WaEnhancer X. Это форк оригинального проекта WaEnhancer, развивающийся по любопытному инженерному пути. Когда авторы оригинального модуля начали переписывать код на Kotlin и выносить настройки во внешние экраны, разработчик WaEnhancer X сделал шаг назад к чистой Java и нативной интеграции прямо в интерфейс WhatsApp.

Что внутри: от блокировки AI до прямой работы с SQLite

Главная задача модуля — перехватывать вызовы методов внутри оригинального клиента WhatsApp и менять их логику. Вот несколько примеров того, как это сделано с технической точки зрения:

  • Уничтожение навязчивого UI. WhatsApp постоянно versucht протащить плашки Meta AI через серверные флаги. WaEnhancer X перехватывает создание этих элементов интерфейса и принудительно выставляет им статус View.GONE до отрисовки на экране.
  • Прямые SQL-запросы вместо ждущих UI-анимаций. Когда вы удаляете статус или сообщение, стандартный клиент запускает цепочку анимаций и диалогов. Модуль обходит этот слой и обращается напрямую к локальной базе данных message SQLite и файловому хранилищу через MediaProvider, выполняя операцию мгновенно.
  • Обход временных ограничений. Одноразовые медиафайлы (View Once) блокируют снятие скриншотов и повторный просмотр. Хук в коде приложения подменяет флаги доступа, делая просмотр бессрочным и давая возможность сохранить файл в галерею.
  • Интеграция с 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. Основной модуль хуков (:app) распространяется под GPL-3.0. Если скомпилировать его вместе с закрытыми компонентами, получится нарушение лицензии.

Реклама

Автор вынес все интерфейсы взаимодействия в отдельный модуль :api под свободной лицензией Apache-2.0. Во время работы открытый хост обнаруживает вспомогательный APK через ContentProvider и динамически подгружает его через собственный ClassLoader. В итоге закрытый плагин исполняется внутри процесса WhatsApp через интерфейсы :api, не имея прямых бинарных зависимостей с GPL-кодом хоста.

Почему 100% Java вместо Kotlin

Современная Android-разработка практически полностью перешла на Kotlin, но для Xposed-модулей у Java остаются свои плюсы. При постоянной работе с низкоуровневой рефлексией (FeatureLoader) чистая Java дает несколько преимуществ:

  1. Предсказуемый байткод. Отсутствие компиляторной магии Kotlin (inline-функций, synthetic-методов и генерации метаданных) упрощает отладку хуков.
  2. Нулевой overhead. В процесс WhatsApp не подгружается Kotlin Standard Library, что снижает риск конфликтов версий, если сам WhatsApp использует другие версии библиотек.
  3. Стабильность при обновлениях. Метод перехвата вызовов меньше ломается, когда структура классов WhatsApp меняется с новым релизом.

Экран настроек модуля не стали делать на Jetpack Compose. Разработчик применил стандартный PreferenceFragmentCompat, встроив меню модуля прямо в настройки самого WhatsApp. Оно выглядит как родной раздел приложения, а для удобства навигации написан класс FeatureCatalog, который индексирует тумблеры и ищет нужную фичу по локализованным строкам.

Как попробовать модуль на устройстве

Для запуска WaEnhancer X потребуется подготовленный смартфон:

  1. На устройстве должен быть получен Root и установлен LSPosed (версии Zygisk или Riru).
  2. Скачиваем готовый APK с GitHub-репозитория и устанавливаем его.
  3. Открываем приложение LSPosed Manager и активируем модуль WaEnhancer X.
  4. В списке приложений (Scope) отмечаем WhatsApp.
  5. Останавливаем WhatsApp через системное меню («Остановить» / Force Stop) и запускаем мессенджер снова.

После этого в настройках WhatsApp появится новый пункт с опциями модуля.

Зачем следить за проектом

WaEnhancer X — наглядный пример того, как грамотное разделение на модули помогает обойти ограничения лицензий при создании надстроек для Android. Проект будет полезен разработчикам, которые изучают рефлексию, устройство хуков LSPosed и работу с инъекциями кода в сторонние приложения.

Код базовой части открыт, избавлен от внешних трекеров и наглядно показывает, как изменять поведение закрытого мессенджера без создания сомнительных сторонних сборок.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.