Как написать собственный мессенджер и сохранить рассудок
Где-то с полгода назад, когда началась эта история с блокировками и замедлением, я задался вопросом: "Ведь скоро заблокировано будет чуть более, чем всё. А как мне, собственно, при этом всём общаться с семьей и друзьями, когда я живу заграницей, а они в России?". Я вышел в интернет с таким вопросом, и начал поиски удобного надежного мессенджера, чтоб чисто писать, звонить и скидывать мемы. Несколько вариантов нашлись довольно быстро, какие-то заработали у родителей, какие-то нет, парочка отвалилась в процессе тестирования, в общем, это не особо важно, уже даже на Пикабу встречал несколько обсуждений, так что обойдемся без подробностей.
Во время всего этого священнодействия, меня не отпускала одна мысль. А чего бы не сделать свой мессенджер? Опыт есть, в прошлом я плотно занимался разработкой под Андроид по работе, да и своих личных приложений опубликовал с десяток. Тем более, у меня уже есть свое родное приложение для видеоконференций, peer-to-peer: прямое соединение от устройства до устройства, никаких лишних серверов, одна красота. Ну разве что надо будет заменить конференции на звонки, прикрутить к нему список контактов, чаты, профили, криптографию, аутентификацию, цифровые подписи, подтверждения и удаления контактов, базу данных, индексы, миграции, транзакции, пейджинг, навигацию, передачу сообщений, файлов, уведомления, настройки, поиск, блэклист, потом интегрировать все это великолепие со службами телеком Андроида, добавить просмотр картинок и видео, тесты, ботов, шэринг, перевести на основные мировые языки. Что может быть проще?
За 5 месяцев работы по вечерам и выходным (ну, конечно, не каждый день), 543 коммита и примерно 40000 строк кода, получилось что-то более-менее удобоваримое и стабильное.
Так как человек я бедный экономный, и не планирую поддерживать дорогую серверную инфраструктуру, даже чаты в моем приложении работают через p2p - прямое соединение между телефонами. Это, кстати, редкость среди публично доступных мессенджеров, подавляющее большинство используют сервис пуш-уведомлений Гугла или Эппл для доставки сообщений. В моем случае, сначала оба устройства устанавливают прямое соединение друг с другом, и только в случае успеха начинают обмениваться шифрованными мемами со страшной силой без промежуточного сервера. Если соединиться прямо сейчас не удалось, все будет локально сохранено и доставлено автоматом при первой же возможности. Кое-какой обмен с сервером для установления прямого соединения все равно необходим - телефоны должны обменяться информацией о своем подключении и IP-адресах, но как только соединение установлено - сервер можно даже выключить - общению это не помешает.
И в этом заключается как огромное преимущество, так и некоторые недостатки: переписки и звонки мало того что закодированы сквозным шифрованием, так еще и никогда даже не попадают на сервер - это чертовки приватно и секьюрно и не надо сильно беспокоиться об утечках - невозможно слить то, чего нет. С другой стороны, теперь конечные устройства ответственны за доставку текстовых сообщение и пакетов данных - сам телефон должен организовать повторную доставку, если что пошло не так, для всех переписок. Это не проблема вовсе для частных контактов, небольшая трудность для групповых чатов на 50-100 человек, но огромная головная боль для публичных каналов на миллионную аудиторию. Публичных каналов, поэтому, нет. Групповых чатов, впрочем, тоже пока нет.
Чтобы добавить кого-то в свой список контактов нужно просканировать QR-код с временным криптоключём, или добавить по идентификатору и ждать, пока тот вручную подтвердит добавление и клиенты обменяются цифровыми подписями.
Эта девстори не была бы полной, если бы я не упомянул о самом трудоемком (да и самом интересном). Я ж ниибаца профессионал, на работе я делаю софт, которым пользуются миллионы, весь такой safety-critical С++ покрытый на 100% тестами и анализаторами по самую макушку. Нельзя же просто взять и сделать Ардроид приложение, это слишком просто, надо извернуться и с самого начала создать целый фреймворк для мессенджеров.
Я разработал С++ ядро, единое для всех поатформ, а приложение Андроид должно по задумке быть только тонким клитентом вокруг этого ядра. Забегая вперед, скажу что задумка удалась почти полностью. Конечное приложение действительно работает как оболочка вокруг единого производительного и набитого тестами ядра, и если я захочу сделать приложение, например, для Эппл, мне нужно будет только скопировать пользовательский интерфейс, биндинги на ядро и интеграцию с родными службами айфона. Вся логика, настройки, все модели, хранилище, шифрование и вообще всё-всё - уже в ядре. Это здорово, но насколько же все усложнилось, кто бы знал. Тем не менее, оно работает, и в общем, работает весьма неплохо, потребление приложением батареи за день на фоне всего остального вообще не заметно. Есть еще поле для оптимизации хранения в базе данных, да и ядро можно порефакторить во имя вечного и недостижимого приближения к идеалу, но в целом и так хорошо.
Итого, получилось довольно неплохое приложение для общения. Уже больше недели я с семьей и друзьями используем его для ежедневных переписок и пока все всех устраивает и, более того, нравится. Настолько, что я решил выложить мессенджер в Google Play, а мою девстори прямо сюда. Для желающих скачать и потрогать, ссылка вот https://play.google.com/store/apps/details?id=hela.eillance, там нет рекламы, нет подписок и платного контента. И вряд ли когда-либо будет, добавлять рекламу или подписку в мессенджер, когда вокруг столько бесплатных альтернатив (как, например, поддерживаемый на государственном уровне, MAX/sarcasm), это просто приговор.
Кстати, не переименовать ли мне его в Sarcasm Chat?





