Как устроен NagramXF и почему форки Telegram продолжают жить
Если вы хоть раз открывали исходники официального клиента Telegram для Android, то наверняка помните это чувство легкого оцепенения. Огромная кодовая база TMessagesProj, смесь Java и C++, тонны кастомных View и самописный рендеринг интерфейса. Несмотря на всю сложность архитектуры, вокруг клиента Telegram выросла целая экосистема форков. Разработчики постоянно пытаются переделать приложение под себя: одни добавляют скрытый режим чтения, другие вырезают рекламу или прикручивают новые темы оформления.
Недавно на GitHub мне попался репозиторий NagramXF. Это форк популярного клиента Nagram X, автор которого решил не ограничиваться одной веткой и собрал под капотом наработки сразу из нескольких известных проектов: AyuGram, exteraGram, Cherrygram и OctoGram.
Давайте разберем, что представляет собой этот проект, как он устроен внутри и как собрать собственный APK из исходников.
Франкенштейн из лучших фич сторонних клиентов
История альтернативных Telegram-клиентов на Android напоминает конструктор. Сначала появился форк Nekogram, затем Nagram, позже Nagram X, и теперь мы дошли до NagramXF. Автор проекта Keeperorowner задался простой целью: взять базовую стабильность Nagram X и перенести в нее полезные доработки из других закрытых и открытых форков.
Что именно попало в сборку:
- Доработки из AyuGram: сохранение истории отредактированных и удаленных сообщений прямо на устройстве, гибкая настройка отправки статуса «печатает» и скрытое чтение диалогов.
- Функции кастомизации из exteraGram и Cherrygram: тонкая настройка шрифтов, стилей иконок, кастомные разделители чатов и расширенное меню пересылки сообщений без автора.
- Мелкие твики интерфейса из OctoGram: быстрое копирование ссылок, упрощенный просмотр профилей и оптимизация анимаций в списках.
Интересная деталь: в описании репозитория автор честно предупреждает, что часть функций получена путем реверс-инжиниринга закрытых сборок. В коде сохранены ссылки на оригинальных авторов тех или иных патчей, что для open-source форков такого плана скорее приятная редкость.
Под капотом и особенности структуры
Репозиторий весит солидно, около 800 мегабайт без учета submodules. Внутри лежит классический проект TMessagesProj, но с заметными изменениями в модулях и хелперах.
Если заглянуть в пакет tw.nekomimi.nekogram.helpers, сразу видна преемственность от Nekogram. Например, удаленное управление метаданными и конфигурацией клиента завязано на класс BaseRemoteHelper, который считывает параметры из специального сервисного канала.
Архитектура форка держится на трех вещах:
- Базовый код Telegram Android, периодически подтягиваемый из апстрима официального репозитория
DrKLO/Telegram. - Слой перехвата событий: входящие сообщения кешируются в локальную базу SQLite до того, как сервер пришлет команду на их удаление или редактирование (так работает функционал AyuGram).
- Патчи UI: оверлей над стандартными Activity и контроллерами Telegram, добавляющий переключатели в меню настроек.
Как собрать проект локально
Сборка форков Telegram всегда была отдельным квестом, но у NagramXF инструкция довольно прямолинейная. Если вам захочется покопаться в коде или собрать чистый билд под свои ключи, понадобится Android Studio, пара ключей из консоли разработчика Telegram и около 15 минут свободного времени.
Сначала клонируем репозиторий вместе со всеми подмодулями:
git clone --recursive --shallow-submodules https://github.com/Keeperorowner/NagramXF.git NagramXF
Если забыли флаг --recursive при первом клонировании, достаточно подтянуть сабмодули вручную:
git submodule update --init --recursive --depth=1
Дальше идем на my.telegram.org, логинимся и создаем новое приложение, чтобы получить TELEGRAM_APP_ID и TELEGRAM_APP_HASH. Без них клиент просто не сможет авторизоваться на серверах Telegram.
В корне проекта создаем файл local.properties и прописываем полученные данные:
TELEGRAM_APP_ID=1234567
TELEGRAM_APP_HASH=0123456789abcdef0123456789abcdef
Если собираете релизный APK для постоянного использования, туда же стоит добавить параметры вашего keystore:
KEYSTORE_PASS=your_keystore_password
ALIAS_NAME=your_alias_name
ALIAS_PASS=your_alias_password
Остается настроить пару системных параметров в коде:
- В
TMessagesProj/src/main/AndroidManifest.xmlуказываем Google Maps API key (если хотите, чтобы корректно работала отправка геопозиции). - В файле
BaseRemoteHelper.javaуказываем ID канала с метаданными. - Закидываем
google-services.jsonвTMessagesProj/, если вам нужны push-уведомления через Google FCM.
После этого проект открывается в Android Studio и собирается стандартным таском assembleRelease или assembleDebug.
Кому может пригодиться проект
Клиенты вроде NagramXF интересны в двух случаях.
Во-первых, разработчикам под Android. Если вы хотите посмотреть, как на практике внедряются перехватчики сообщений, локальные хранилища и патчи поверх гигантского легаси-монолита Telegram, NagramXF наглядно это показывает. Тут можно подсмотреть реализацию кастомных меню, переопределение сетевых событий и работу с NDK.
Во-вторых, тем, кому базовая версия Telegram кажется слишком скудной по настройкам. NagramXF объединяет фичи, ради которых раньше приходилось выбирать между AyuGram и exteraGram. Здесь все собрано в одном месте.
Конечно, нужно учитывать риски: использование сторонних клиентов с закрытыми патчами требует доверия к автору форка. Но если вам нужен кастомизируемый клиент с открытым процессом сборки, NagramXF выглядит любопытным экспериментом.
