Как устроен WaEnhancer X и зачем переписывать хуки WhatsApp на чистую Java
Пользоваться официальным клиентом 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-анимаций. Когда вы удаляете статус или сообщение, стандартный клиент запускает цепочку анимаций и диалогов. Модуль обходит этот слой и обращается напрямую к локальной базе данных
messageSQLite и файловому хранилищу через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 дает несколько преимуществ:
- Предсказуемый байткод. Отсутствие компиляторной магии Kotlin (inline-функций, synthetic-методов и генерации метаданных) упрощает отладку хуков.
- Нулевой overhead. В процесс WhatsApp не подгружается Kotlin Standard Library, что снижает риск конфликтов версий, если сам WhatsApp использует другие версии библиотек.
- Стабильность при обновлениях. Метод перехвата вызовов меньше ломается, когда структура классов WhatsApp меняется с новым релизом.
Экран настроек модуля не стали делать на Jetpack Compose. Разработчик применил стандартный PreferenceFragmentCompat, встроив меню модуля прямо в настройки самого WhatsApp. Оно выглядит как родной раздел приложения, а для удобства навигации написан класс FeatureCatalog, который индексирует тумблеры и ищет нужную фичу по локализованным строкам.
Как попробовать модуль на устройстве
Для запуска WaEnhancer X потребуется подготовленный смартфон:
- На устройстве должен быть получен Root и установлен LSPosed (версии Zygisk или Riru).
- Скачиваем готовый APK с GitHub-репозитория и устанавливаем его.
- Открываем приложение LSPosed Manager и активируем модуль WaEnhancer X.
- В списке приложений (Scope) отмечаем WhatsApp.
- Останавливаем WhatsApp через системное меню («Остановить» / Force Stop) и запускаем мессенджер снова.
После этого в настройках WhatsApp появится новый пункт с опциями модуля.
Зачем следить за проектом
WaEnhancer X — наглядный пример того, как грамотное разделение на модули помогает обойти ограничения лицензий при создании надстроек для Android. Проект будет полезен разработчикам, которые изучают рефлексию, устройство хуков LSPosed и работу с инъекциями кода в сторонние приложения.
Код базовой части открыт, избавлен от внешних трекеров и наглядно показывает, как изменять поведение закрытого мессенджера без создания сомнительных сторонних сборок.
