Анатомия клиента Telegram на Compose Multiplatform: матрешки TDLib 1.8, стеганография словами и грабли первой альфы
vdggrtff 20 минут назад Объяснить с Анатомия клиента Telegram на Compose Multiplatform: матрешки TDLib 1.8, стеганография словами и грабли первой альфы Средний 5 мин 347 Android * Разработка мобильных приложений *...
Will Anthropic have the best AI model at the end of October 2026?
В сфере искусственного интеллекта произошло заметное событие. vdggrtff 20 минут назад Объяснить с Анатомия клиента Telegram на Compose Multiplatform: матрешки TDLib 1. 8, стеганография словами и грабли первой альфы Средний 5 мин 347 Android * Разработка мобильных приложений * Kotlin * Open source * Мессенджеры * Кейс Из песочницы Решил написать свой Telegram на KMP за 30 дней. Что может TDLib и с чем у меня возникли проблемыПока искал работу, решил ради инженерного эксперимента написать альтернативный клиент Telegram на Kotlin Multiplatform (Android + Desktop)(Мог бы ещё на Ios но у меня нету ни мак бука, ни денег на него).
Уделял проекту по 2–3 часа под ночь. Думал, что TDLib возьмет на себя всю грязную работу, но вместо этого ловил бесконечные рекомпозиции, падения от нехватки памяти (OOM) и загадочные ошибки файловой системы. В итоге всё‑таки допилил клиент со встроенным ИИ, Anti‑Revoke и антиспамом.
Технические детали
В статье разбираю, какие были трудности, баги и т. д, как я их чинил, ну и оставляю ссылку на готовый APK. СтекЯзык и UI: Kotlin 2.
4, KMP&CMP (Android + Linux Desktop). Ядро мессенджера: TDLib 1. База данных: Room KMP (SQLite).
Архитектура: MVI + Clean Architecture, Koin. ИИ: Google Gemini API (с поддержкой своего ключа — BYOK). Запуск TDLib и первые проблемыНачиналось всё оптимистично.
Отраслевые последствия
Подключил C++ ядро TDLib. На ПК всё запустилось быстро, но как только я скомпилировал билд под Android — приложение упало с FileNotFoundException / EROFS (Read‑only file system). Оказалось, что TDLib по привычке пытался писать логи и сессию прямо в корень рабочей папки.
На Linux это прокатывало, а Android с его песочницей мгновенно падал. Пришлось писать свой платформенный AppStorageConfig, который через Koin скармливает ядру путь к context. filesDir на телефоне и ~/.
ghostgram на компе:data class AppStorageConfig(val basePath: String)в init koin в модуле нужно было прописать: ,и дальше при вызове init koin нужно было прописывать appStoragePath вот пример: initKoin(appStoragePath = this@GhostGramApp. absolutePath) { androidContext(this@GhostGramApp)}initKoin(appStoragePath = this@GhostGramApp. absolutePath) { androidContext(this@GhostGramApp) }Ад с отправкой медиа файловКогда я доделал до ± адекватного уровня отправку сообщений, я решил сделать отправку фотографий и видео.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.



