
- Главная
- Каталог
- Интернет технологии
- Мобильная разработка #1
Мобильная разработка #1
Разработка мобильных приложений (app) под Android, iOS.
Подборки с полезной информацией, книги, статьи.
Статистика канала
try {
api.buyPremium()
} catch (e: Exception) {
// TODO: обработать ошибку потом
print(e.message)
}
{}
❌ Подход Джуна: Поймать ошибку, чтобы приложение не скрашилось, вывести её в консоль (print или Log.e) и забыть. Но секрет в том, что консоль на телефоне реального пользователя никто не читает! Ошибка исчезает в пустоте.
✅ Подход Мидла (Fail gracefully, log loudly):
Приложение должно мягко обработать ошибку для пользователя (показать красивый Снекбар «Упс, что-то пошло не так»), но при этом громко заорать об этом разработчикам.
🛠 Инструменты (Что должно быть в каждом проекте):
🔥 Firebase Crashlytics / Sentry:
Это не только для фатальных крашей! У них есть суперсила - Non-Fatal Exceptions (Нефатальные ошибки).
Вместо пустого print, вы пишете:
FirebaseCrashlytics.getInstance().recordException(e)
Теперь каждое такое «тихое» падение сети или парсинга JSON прилетит вам на дашборд с аналитикой: у скольких пользователей это случилось, на каких моделях телефонов и версиях ОС.
🍞 Хлебные крошки (Breadcrumbs):
Представьте, что к вам прилетел краш: NullPointerException на строке 42. Как его воспроизвести?
Сеньоры добавляют логирование действий до ошибки:
Crashlytics.log("User opened Cart") -> Crashlytics.log("Clicked Checkout") -> Crash!
Теперь вместе с краш-репортом вы получаете историю шагов пользователя. Баг фиксится за 5 минут вместо 5 часов гадания на кофейной гуще.
💡 Правило хорошего тона:
В Debug-сборке приложение должно падать с треском при любой неконсистентности данных (чтобы тестировщик или вы сразу это заметили). А в Release-сборке - пытаться выжить, но молча отправлять отчет вам на сервер.
Признавайтесь, много у вас в проекте забытых TODO внутри catch? 👇
#crashlytics #firebase #sentry #debugging #errors #android #ios #middle
👉 @developer_mobilabuild.gradle у сеньоров всегда написано:
buildTypes {
release {
minifyEnabled true // Включает обфускацию и удаление мертвого кода
shrinkResources true // Удаляет неиспользуемые картинки и XML
}
}
{}
Что это делает?
1. Shrinking: R8 анализирует ваш код. Если вы импортировали огромную библиотеку, но используете из нее один метод - R8 просто вырежет остальные 99% библиотеки из финального APK.
2. Obfuscation (Обфускация): R8 переименовывает ваши красивые классы NetworkUserRepository в a.b.c. Это не только уменьшает вес файла, но и усложняет жизнь хакерам (Reverse Engineering).
💥 Обряд посвящения:
Каждый разработчик хоть раз в жизни ловил краш на Релизе, потому что R8 переименовал классы для работы с сетью (JSON модели), и парсер сошел с ума. Решение: аннотация @Keep над data-классами.
🍏 iOS (App Thinning & Dead Code Stripping):
Apple делает много магии под капотом:
1. Dead Code Stripping: Компилятор LLVM автоматически вырезает функции и классы, которые нигде не вызываются (включается в Build Settings).
2. App Slicing: Когда пользователь скачивает приложение, App Store отдает ему не весь ваш бинарник со всеми картинками мира, а только те ресурсы, которые нужны для его конкретного устройства (например, только картинки @3x для iPhone 15 Pro, вырезая старые @2x). Главное - хранить всё в Assets.xcassets.
💡 Золотое правило:
Прогоняйте все растровые картинки через сервисы сжатия (TinyPNG), а лучше - переходите на вектор (SVG / PDF / ImageVectors). Вектор весит килобайты и идеально скейлится на любые экраны.
#appsize #optimization #proguard #r8 #android #ios #middle #performance
👉 @developer_mobilamockk<Activity>() может занимать больше 1 секунды из-за генерации байт-кода на лету. Второго такого «золотого» вызова нет (кешируется), но...
2. Gradle и изоляция. Gradle запускает тесты каждого модуля в отдельном JVM-процессе. Итог: кеш байт-кода не шерится, и в каждом модуле мы снова и снова тратим секунды на тяжелые моки.
3. Утечки в MockK. Метод clearAllMocks() со временем работает всё медленнее из-за раздувания внутренней карты объектов.
Что сделали:
✅ Отказались от стандартного распараллеливания Gradle по модулям. Вместо этого написали кастомную таску, которая собирает все тесты в единый classpath.
✅ Ручное дробление. Все тесты разбили на 10 чанков (по количеству ядер/воркеров) и запустили их в 10 долгоживущих JVM-процессах.
✅ Чистка рефлексией. Пофиксили деградацию MockK, принудительно очищая внутренние мапы библиотеки через рефлексию.
Результат:
Время прогона упало с 180 минут до 12 минут. На пулл-реквестах с учетом импакт-анализа тесты теперь пролетают вообще за минуту.
Минусы подхода:
Снижается изоляция. Если кто-то забыл сделать unmockkStatic, это может «отстрелить» в совершенно другом тесте, который попал в тот же процесс.
Подробный разбор с примерами кода и ссылкой на черновики Gradle-плагина читайте в статье: https://habr.com/ru/companies/alfa/articles/993352/
#Android #Gradle #Testing #Performance #Architecture
👉 @developer_mobila-> Показ лоадера на весь экран -> Ошибка тайм-аута -> Пустой белый экран.
А если пользователь случайно повернет телефон (сменит ориентацию) - лоадер появится снова, потому что Activity пересоздалась и запрос полетел заново. Это боль.
✅ Подход Мидла (Single Source of Truth - SSOT):
Открыл приложение -> Мгновенно увидел вчерашние данные из кэша -> В фоне пошел незаметный запрос в сеть -> Лента плавно обновилась свежими данными.
Как это работает (Паттерн SSOT):
Запомните золотое правило: UI никогда не должен получать данные напрямую из сети!
Единственным источником «правды» для экрана должна быть ваша локальная База Данных (БД).
1. Ваш ViewModel / Presenter просто подписывается на изменения в БД.
2. Когда нужно обновить данные, Repository идет в сеть.
3. Скачанные из сети данные сохраняются в Базу Данных.
4. База данных отправляет сигнал в UI: "Эй, у меня новые данные, перерисуйся!".
🛠 Чем пользуются профи:
🤖 Android:
Связка Room + Flow (или LiveData).
Вы пишете в DAO: fun getNews(): Flow<List<News>>. UI начинает слушать этот Flow. Как только метод из сети сделает insert(newItems) в базу, Room сам протолкнет новые данные в Flow, и UI обновится. Магия!
🍏 iOS:
Современный SwiftData (или старая добрая CoreData) + макрос @Query (в SwiftUI) или Combine.
Принцип тот же: UI биндится к хранилищу. Вы просто обновляете контекст базы, а списки на экране разъезжаются и анимируются сами.
💡 Совет:
Такой подход не только спасает от отсутствия интернета, но и решает проблему пагинации, поиска и шаринга данных между разными экранами (ведь все они смотрят в одну базу).
#architecture #offlinefirst #ssot #android #ios #middle #caching
👉 @developer_mobilagit push или сливаете Pull Request в ветку develop. ВСЁ. Ваша работа закончена.
Дальше начинается магия:
1. В облаке просыпается виртуальный сервер.
2. Он скачивает свежий код.
3. Запускает линтеры и Unit-тесты (о которых мы говорили раньше). Если они упали - сборка отменяется, а вам в Slack/Telegram прилетает по шапке.
4. Если всё зелено — сервер сам увеличивает номер версии, собирает приложение и подписывает его нужным ключом.
5. Готовый файл (APK/IPA) автоматически улетает в Firebase App Distribution, TestFlight или прямо в чатик QA.
🛠 Что нужно знать мобильному разработчику (Инструменты):
• Fastlane: Это абсолютный мастхэв индустрии (работает и для iOS, и для Android). Это инструмент, который превращает клики мышкой по настройкам в простой код. Он умеет всё: от сборки до автоматического создания скриншотов для App Store / Google Play.
• GitHub Actions / GitLab CI / Bitrise: Это те самые «облачные серверы» (Runner'ы), которые будут выполнять ваши команды из Fastlane каждый раз, когда вы пушите код.
💡 Правило чистой среды:
Главный плюс CI/CD - код собирается на «чистой» машине. Это навсегда убивает отмазку -А у меня локально всё собирается и работает!". Если код не собрался на CI - значит, он сломан.
#cicd #automation #fastlane #android #ios #middle #githubactions
👉 @developer_mobilaОтзывы канала
всего 10 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Мобильная разработка #1 — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 3.9K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 5.2, количество отзывов – 10, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 1678.32 ₽, а за 49 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий