Нативна розробка Android застосунків

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 30 з 32Усі 1735 послуг
Розробка іконки додатку (App Icon) під Android
Простий
від 4 годин до 2 днів
Нативна розробка Android-додатку на Kotlin
Складний
від 2 тижнів до 3 місяців
Нативна розробка Android-додатку на Java
Складний
від 2 тижнів до 3 місяців
Міграція Android-додатку з Java на Kotlin
Складний
від 2 тижнів до 3 місяців
Розробка Bottom Navigation Bar Android-додатку
Простий
від 1 дня до 3 днів
Реалізація App Links для Android-додатку
Середній
від 1 дня до 3 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Нативна розробка Android на Kotlin

RecyclerView з DiffUtil.calculateDiff() на main thread, список з 500 елементів, середньостатистичний Android-телефон 2021 року — і користувач отримує 200–400 мс фриз при кожному оновленні даних. Перенеси розрахунок diff у фоновий потік через AsyncListDiffer — проблема зникає. Такі речі не очевидні без профайлера та розуміння threading-моделі Android.

Kotlin + Jetpack Compose + Coroutines — поточний production-стандарт для нативної Android-розробки. XML та View system не зникли, але нові проекти починаються з Compose.

Jetpack Compose: як працює рекомпозиція та чому це важливо

Compose — декларативний UI-фреймворк. Замість TextView.setText() та adapter.notifyItemChanged() — composable функції, які описують UI як функцію стану. При зміні стану Compose перевичисляє тільки затронуті частини дерева. Це називається рекомпозиція.

Проблема: рекомпозиція може бути надто частою. Якщо передати в composable лямбду, створену при кожній рекомпозиції батька — дочірній composable буде рекомпонуватися щоразу, навіть якщо видимі дані не змінились.

// Погано — нова лямбда при кожній рекомпозиції, дочірня компонента
// думає, що параметр змінився
@Composable
fun ParentScreen(viewModel: MyViewModel = hiltViewModel()) {
    val items by viewModel.items.collectAsState()
    ItemList(
        items = items,
        onItemClick = { id -> viewModel.selectItem(id) } // створюється заново кожен раз
    )
}

// Добре — remember стабілізує лямбду
@Composable
fun ParentScreen(viewModel: MyViewModel = hiltViewModel()) {
    val items by viewModel.items.collectAsState()
    val onItemClick = remember { { id: String -> viewModel.selectItem(id) } }
    ItemList(items = items, onItemClick = onItemClick)
}

Stability та @Stable/@Immutable

Compose визначає, чи потрібна рекомпозиція composable, перевіряючи стабільність параметрів. Тип вважається стабільним, якщо Compose може гарантувати: якщо два значення рівні за equals(), їх UI-представлення однакове.

Примітиви, String, data-класи з val-полями стабільних типів — стабільні автоматично. List<T>нестабільний, тому що це інтерфейс. MutableList може змінитися без сповіщення. Рішення — ImmutableList з kotlinx.collections.immutable або @Immutable-анотація на data-класі.

LazyColumn та продуктивність списків

LazyColumn — еквівалент RecyclerView у Compose. key у items { } — обов'язковий параметр для будь-якого списку, де елементи можуть переміщуватися або видалятися. Без key Compose не може розрізнити переміщення елемента від видалення одного та додавання іншого, що ломає анімації та може вислати дивне скидання стану ячейки.

contentType — додаткова оптимізація. При наявності кількох типів ячейок Compose може переиспользовать composition для ячейок одного типу. Це аналог getItemViewType у RecyclerView.

Kotlin Coroutines та архітектура

Coroutines — це не просто «зручний спосіб писати async-код». Це структурована конкурентність з чітким scope та lifecycle.

viewModelScope — coroutine scope, прив'язаний до lifecycle ViewModel. Коли ViewModel очищується (onCleared()), всі coroutines в scope автоматично скасовуються. Це усуває цілий клас утечок, типових для callback-based підходу.

Flow vs LiveData

StateFlow та SharedFlow — рекомендована заміна LiveData на Kotlin-проектах. LiveData lifecycle-aware, але прив'язаний до Android-платформи. Flow — чистий Kotlin, тестується без Android-залежностей.

collectAsState() у Compose підписується на StateFlow та тригерить рекомпозицію при новому значенні. lifecycleScope.launch { flow.collect { } } — для збірки в Fragment або Activity з врахуванням lifecycle через repeatOnLifecycle(Lifecycle.State.STARTED).

repeatOnLifecycle — це важливо. Без нього поток буде збиратися навіть коли програма у фоні, що може приводити до обробки UI-подій, коли вікно неактивне.

Dispatcher та структурована конкурентність

Dispatchers.IO — для сетевих запитів та файлових операцій. Dispatchers.Default — для CPU-intensive задач (парсинг, сортування, шифрування). Dispatchers.Main — для UI.

withContext(Dispatchers.IO) переключає coroutine на потрібний dispatcher без створення нового scope. Це ефективніше, ніж launch(Dispatchers.IO) всередину іншого launch.

Hilt та dependency injection

Hilt — офіційний DI-фреймворк для Android поверх Dagger 2. Усуває boilerplate Dagger: не потрібно писати Component та вручну зв'язувати Module з Component.

@HiltViewModel + @Inject constructor — ViewModel з інжекцією залежностей без фабрик. @Singleton, @ActivityScoped, @ViewModelScoped — правильний lifecycle для залежностей.

Типова помилка: використовувати @Singleton для репозиторію, який держить контекст Activity. Це утечка Activity. Правило: @Singleton тільки для залежностей, яким потрібен Application context або які не зберігають Android-специфічне стан.

WorkManager та фонові задачи

WorkManager — для гарантованих фонових задач, які повинні виконатися навіть після перезапуску програми або пристрою. Синхронізація даних, відправка аналітики, завантаження файлів.

CoroutineWorker — suspend-версія Worker. Працює в Dispatchers.IO за умовчанням.

Android 14 ужесточив вимоги до фонового виконання. FOREGROUND_SERVICE_TYPE став обов'язковим для foreground services. WorkManager правильно обробляє обмеження (мережа, зарядка) та не потребує foreground service для більшості задач.

Інструменти

Android Studio Profiler. CPU profiler з System Trace — видно все: coroutine suspension points, RenderThread, MainThread. Memory profiler — heap dump, allocation tracking. Network profiler — всі HTTP-запити з тілами.

Compose Layout Inspector. Дерево composable з указанням recomposition count. Видно, які composable рекомпонуються надто часто — точніше будь-якого логування.

LeakCanary. Автоматичне виявлення утечок пам'яті в development-сборці. Показує reference chain до утечки. Додається однією залежністю, працює без конфігурації.

Firebase Crashlytics + Performance Monitoring. Crash-free rate за версіями, Network request traces, Custom traces для критичних операцій.

Орієнтири

Складність Орієнтовний період
MVP (6–10 екранів, REST API) 6–10 тижнів
Середня програма (20–30 екранів) 3–5 місяців
Складна (платежі, ML Kit, Compose + custom UI) 5–9 місяців

Вартість розраховується після аналізу вимог та ТЗ.