Сообщество - Devstory: Истории разработчика

Devstory: Истории разработчика

1 пост 0 подписчиков
10

Как написать собственный мессенджер и сохранить рассудок

Где-то с полгода назад, когда началась эта история с блокировками и замедлением, я задался вопросом: "Ведь скоро заблокировано будет чуть более, чем всё. А как мне, собственно, при этом всём общаться с семьей и друзьями, когда я живу заграницей, а они в России?". Я вышел в интернет с таким вопросом, и начал поиски удобного надежного мессенджера, чтоб чисто писать, звонить и скидывать мемы. Несколько вариантов нашлись довольно быстро, какие-то заработали у родителей, какие-то нет, парочка отвалилась в процессе тестирования, в общем, это не особо важно, уже даже на Пикабу встречал несколько обсуждений, так что обойдемся без подробностей.

Во время всего этого священнодействия, меня не отпускала одна мысль. А чего бы не сделать свой мессенджер? Опыт есть, в прошлом я плотно занимался разработкой под Андроид по работе, да и своих личных приложений опубликовал с десяток. Тем более, у меня уже есть свое родное приложение для видеоконференций, peer-to-peer: прямое соединение от устройства до устройства, никаких лишних серверов, одна красота. Ну разве что надо будет заменить конференции на звонки, прикрутить к нему список контактов, чаты, профили, криптографию, аутентификацию, цифровые подписи, подтверждения и удаления контактов, базу данных, индексы, миграции, транзакции, пейджинг, навигацию, передачу сообщений, файлов, уведомления, настройки, поиск, блэклист, потом интегрировать все это великолепие со службами телеком Андроида, добавить просмотр картинок и видео, тесты, ботов, шэринг, перевести на основные мировые языки. Что может быть проще?

Проще, конечно, не было. Весь процесс занял почти 5 месяцев.

Проще, конечно, не было. Весь процесс занял почти 5 месяцев.

За 5 месяцев работы по вечерам и выходным (ну, конечно, не каждый день), 543 коммита и примерно 40000 строк кода, получилось что-то более-менее удобоваримое и стабильное.

Так как человек я бедный экономный, и не планирую поддерживать дорогую серверную инфраструктуру, даже чаты в моем приложении работают через p2p - прямое соединение между телефонами. Это, кстати, редкость среди публично доступных мессенджеров, подавляющее большинство используют сервис пуш-уведомлений Гугла или Эппл для доставки сообщений. В моем случае, сначала оба устройства устанавливают прямое соединение друг с другом, и только в случае успеха начинают обмениваться шифрованными мемами со страшной силой без промежуточного сервера. Если соединиться прямо сейчас не удалось, все будет локально сохранено и доставлено автоматом при первой же возможности. Кое-какой обмен с сервером для установления прямого соединения все равно необходим - телефоны должны обменяться информацией о своем подключении и IP-адресах, но как только соединение установлено - сервер можно даже выключить - общению это не помешает.

И в этом заключается как огромное преимущество, так и некоторые недостатки: переписки и звонки мало того что закодированы сквозным шифрованием, так еще и никогда даже не попадают на сервер - это чертовки приватно и секьюрно и не надо сильно беспокоиться об утечках - невозможно слить то, чего нет. С другой стороны, теперь конечные устройства ответственны за доставку текстовых сообщение и пакетов данных - сам телефон должен организовать повторную доставку, если что пошло не так, для всех переписок. Это не проблема вовсе для частных контактов, небольшая трудность для групповых чатов на 50-100 человек, но огромная головная боль для публичных каналов на миллионную аудиторию. Публичных каналов, поэтому, нет. Групповых чатов, впрочем, тоже пока нет.

Чтобы добавить кого-то в свой список контактов нужно просканировать QR-код с временным криптоключём, или добавить по идентификатору и ждать, пока тот вручную подтвердит добавление и клиенты обменяются цифровыми подписями.

Чтобы добавить кого-то в свой список контактов нужно просканировать QR-код с временным криптоключём, или добавить по идентификатору и ждать, пока тот вручную подтвердит добавление и клиенты обменяются цифровыми подписями.

Эта девстори не была бы полной, если бы я не упомянул о самом трудоемком (да и самом интересном). Я ж ниибаца профессионал, на работе я делаю софт, которым пользуются миллионы, весь такой safety-critical С++ покрытый на 100% тестами и анализаторами по самую макушку. Нельзя же просто взять и сделать Ардроид приложение, это слишком просто, надо извернуться и с самого начала создать целый фреймворк для мессенджеров.

Я разработал С++ ядро, единое для всех поатформ, а приложение Андроид должно по задумке быть только тонким клитентом вокруг этого ядра. Забегая вперед, скажу что задумка удалась почти полностью. Конечное приложение действительно работает как оболочка вокруг единого производительного и набитого тестами ядра, и если я захочу сделать приложение, например, для Эппл, мне нужно будет только скопировать пользовательский интерфейс, биндинги на ядро и интеграцию с родными службами айфона. Вся логика, настройки, все модели, хранилище, шифрование и вообще всё-всё - уже в ядре. Это здорово, но насколько же все усложнилось, кто бы знал. Тем не менее, оно работает, и в общем, работает весьма неплохо, потребление приложением батареи за день на фоне всего остального вообще не заметно. Есть еще поле для оптимизации хранения в базе данных, да и ядро можно порефакторить во имя вечного и недостижимого приближения к идеалу, но в целом и так хорошо.

Надеюсь, понятно и без перевода. Если кратко - батарею не жрёт.

Надеюсь, понятно и без перевода. Если кратко - батарею не жрёт.

Итого, получилось довольно неплохое приложение для общения. Уже больше недели я с семьей и друзьями используем его для ежедневных переписок и пока все всех устраивает и, более того, нравится. Настолько, что я решил выложить мессенджер в Google Play, а мою девстори прямо сюда. Для желающих скачать и потрогать, ссылка вот https://play.google.com/store/apps/details?id=hela.eillance, там нет рекламы, нет подписок и платного контента. И вряд ли когда-либо будет, добавлять рекламу или подписку в мессенджер, когда вокруг столько бесплатных альтернатив (как, например, поддерживаемый на государственном уровне, MAX/sarcasm), это просто приговор.

Кстати, не переименовать ли мне его в Sarcasm Chat?

Показать полностью 5
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества