Android | Михаил Белый
309 subscribers
272 photos
32 videos
127 links
Авторская песочница о карьере в IT в роли Mobile Dev (Android, Kotlin, Multiplatform) и разных вещах, которые мне интересны.

Посты каждый день в 5 вечера.

Автор: @michaelbel

Забустить: t.me/boost/foundout

Задонатить: boosty.to/michaelbel
Download Telegram
Технический скрининг

Как-то раз, когда я был джун и глуп и не видал больших цифр в офферах, звонит мне рекрутер и спрашивает:
– Михаил, можем ли мы извне получить доступ к приватной переменной класса?
– Конечно можем!
– Эмм… нет не можем.
– Можем через рефлексию!
– Кажется, нам пора закругляться, до свидания!


class Bank {
private val money = "$300"
}

fun main() = runBlocking {
val money = Bank::class
.memberProperties
.first { it.name == "money" }
.apply { isAccessible = true }
.get(Bank()) as String
println(money)
}

Пальцем щелк и деньги в банк

Зачем нужен скрининг?
Техсобес – событие энергозатратное. Чтобы каждый залетный птиц с наскока туда не проскочил бизнес придумал фильтровать таких смелых и умелых еще на дальних подступах. Время и ресурсы сокращаются, флоу найма улучшается. Чтобы добраться до технической секции и показать, что мурку могешь, нужно сначала созвониться с эйчаром, послушать рассказ о компании/вакансии, позадавать свои вопросы. И иногда пройти технический скрининг – первичную проверку на харды в сжатом тайминге.

Какие вопросы задают?
Не суть важно, если уже подготовился к техсобесу. Будут вопросы базового уровня сложности, на которые есть очевидные и быстрые правильные ответы. Ответы должны показать подходишь ли ты на открытую позицию или нет. Совсем неготовые дисквалифицируются из воронки найма, остальные двигаются дальше.

Примеры:
🐗 Модификаторы доступа в котлине
🐗 Типы исключений в котлине
🐗 Parcelable vs Serializable
🐗 Hot Flow vs Cold Flow
🐗 FlatMap vs ConcatMap

Как правильно действовать?
Перейти с автомата на ручной режим. Выключить синдром отличника. Помнить что у тебя и рекрутера одна цель – пристроить тебя на рабочее место. Не теряться если попался незнакомый вопрос. Профессионально и дружелюбно объяснять сложные концепции простыми словами. В слишком объемных ответах нет смысла, не развивать тему и не офтопить. Если совсем все плохо – записать вопросы, узнать ответы и идти на следующий собес.
Please open Telegram to view this post
VIEW IN TELEGRAM
62211
Примеры open-source проектов

Нет лучшего способа преисполниться в андроид-разработке, чем покопаться в чужих исходниках. Всегда полезно посмотреть как пишут код взрослые дяди и утащить себе проверенные методики. Здесь не будет примеров, которые давно не обновлялись и соответственно не запустятся после клонирования.

🐗 github.com/android/nowinandroid
Полнофункциональное приложение от гугла. Создано с использованием Kotlin, Compose и Material3. Постоянно обновляется и представляет собой агрегатор новостей об андроид-разработке разложенных по топикам. Про организацию модулей в проекте рассказано здесь. Используется рекомендуемая архитектура с UDF, о ней подробнее здесь. Код покрыт unit и ui тестами, производительность мониторится с помощью бенчмарков.

🐗 github.com/android/sunflower
Еще одно приложение от корпорации добра. Справочник для садоводства. Иллюстрирует лучшие практики по переезду с Android View (Material2) на Jetpack Compose (Material3). О миграции рассказано здесь. Код полностью покрыт тестами, есть бенчмарки, показано как работать с ассетами и предварительно заполнять Room.

🐗 github.com/chrisbanes/tivi
Приложение для отслеживания сериалов от бывшего разработчика из гугла. В проект тащятся новейшие версии библиотек, сейчас в процессе переезда на KMP. Показано как управлять зависимостями с помощью buildSrc. Полностью на Kotlin, Compose, Coroutines, Room, Lifecycle, Navigation и Hilt.

🐗 github.com/RetroMusicPlayer/RetroMusicPlayer
Руководство как скрафтить музыкальный плеер в системе View с дизайном Materia3. Под капотом продвинутая стилизация, синхронизация текстов песен, анимации, виджеты, плейлисты, поддержка Chromecast и Android Auto.

🐗 github.com/libre-tube/LibreTube
Альтернативный клиент YouTube с кучей настроек. Никакого Compose - UI на activities и fragments.

🐗 github.com/JunkFood02/Seal
Стильный и простой в использовании аудио/видео загрузчик. Есть настройка палитры Material3 из приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
7221
🐗 github.com/andrikeev/Flow
Неофициальный клиент рутрекера. Сделан по красоте – чистая архитектура, код разложен по core и feature модулям, реализации отделены от интерфейсов.

🐗 github.com/T8RIN/ImageToolbox
Продвинутый пикча-эдитор. Покажет, что можно и нельзя делать с изображениями.

🐗 github.com/JetBrains/compose-multiplatform
Сэмплы от JetBrains для погружения в KMP. Есть, например, приложение для просмотра изображений и приложение для обмена сообщениями. Для UI используется Compose Multiplatform, показано как его встраивать в интерфейс SwiftUI. Работающие аппки для Android, iOS, Desktop и Web.

🐗 github.com/joreilly/PeopleInSpace
Вываливает список людей, которые сейчас в космосе. А также положение МКС. Демонстрация множества различных платформ, на которых работает Kotlin Multiplatform. Включает клиенты на SwiftUI (iOS, watchOS, macOS), Compose (Android + Tablets, Wear OS, Desktop, Wasm, iOS) и серверную часть на Ktor. Есть виджеты для iOS и Android. Проект специально сделан минималистичным, чтобы помочь тебе быстрее вкатиться в KMP.

🐗 github.com/msasikanth/twine
Мультиплатформенное приложение для чтения RSS-лент. Внутри стандартно Kotlin Multiplatform, Coroutines, Compose Multiplatform, Ktor, SQLDelight, Decompose и Kotlin-inject. Нужны JDK 20 и канареечная студия для запуска.

🐗 github.com/JoelKanyi/FocusBloom
Приложение для продуктивности и управления временем. Юзеры могут планировать задачи и получать отчеты об их выполнении. Мультиплатформа – есть реализации для Android/iOS/Desktop.

🐗 github.com/xxfast/NYTimes-KMP
Мультиплатформенная версия приложения New York Times на Compose. Позволяет юзеру просматривать статьи. Для Android/Wear/iOS/Desktop/Web.

🐗 github.com/TheChance101/beep-beep
BeepBeep – платформа для доставки еды и заказа такси, призванная продемонстрировать возможности Kotlin. Включает мобильные приложение для пользователей, приложения для управления рестораном, приложения для водителей, для доставщиков – все это для iOS и Android на Compose Multiplatform. Есть приложение с дашбордами для Mac/Linux/Windows, приложение для поддержки. Есть несколько микросервисов на Kotlin с Ktor для поддержки всего этого. Можешь забацать свой Uber!

🔤🔤
🐗 github.com/DrKLO/Telegram
Не рекомендуется как ориентир. Но будет полезно посмотреть какой радикальной бывает разработка продукта, когда он претендует на звание лучшего в нише. Анимации, работа с памятью и с видео, минимум внешних зависимостей, все кастомное и самописное, создание ui из кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
8221
Потоптал берег Балтийского моря на косе, название которой не выговорю.

Морской ветер ебошит с такой силой, что уши закладывает. Ничего не слышно кроме шума волн, еще и песком по лицу хлещет. Ощущения прекрасные! Сразу забываешь о своих работах и заботах. Плюс поорать можно. Рекомендую.
8322
🐗🐗 КАРЬЕРНАЯ КАРТА

➡️➡️➡️

Привет! Сделал роадмап для подготовки к собесам на Senior Android Developer. Все это добро хостится в Notion и пока включает следующие разделы:

Job Interview: Вопросы с собесов, что отвечать, что спрашивать, ссылки на моки, System Design, как проектировать, алгоритмы и задачки из бигтехов, примеры задач на лайв-кодинг, софты, все что надо знать про HashMap.

Kotlin: все про язык, разобраны все ключевые слова и операторы, вопросы с собесов, коллекции, дженерики, корутины, мультиплатформа, 50 примеров использования операторов Flow.

Java: GC, Thread, Concurrent, RxJava.

Compose: аннотации, функции компоновки, сайд-эффекты, примеры кода, кейсы использования.

Android Platform: SDK, Сервисы, Concurrent, Android-коллекции, класс View, Activity, Intent, что нового в релизах, Network, UI и дизайн, архитектура и паттерны проектирования, сборка и Gradle-скрипты, Layouts, DI, тестирование.

Android Jetpack: Hilt, ViewModel, Room, WorkManager, LiveData, ViewBinding.

Android Studio: как настроить, какие хоткеи использовать.

Git: команды, кейсы, Github actions, управление репозиторием.

Samples: фреймворки которые надо затащить, примеры open-sourcе библиотек.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
144331
Android | Михаил Белый pinned a photo
🐗 Kotlin 2.0

Перетащил свой проект на Kotlin 2.0.0 и компилятор K2. Также пришлось переехать на новый плагин Compose от JetBrains. Прошло гладко, гайд по миграции здесь.

Все библиотечки совместились и нормально работают. Отвалился только мультиплатформенный Coil3, потому что его не обновляют с февраля. Какой прирост по скоростям, стало ли быстрее собираться – я хз. Меня это перестало заботить, когда я с камней intel перешел на arm. Могу только сказать, что люблю все новое. Так что ждем новую версию котлина, обещают что-то интересное!
Please open Telegram to view this post
VIEW IN TELEGRAM
7221
Как меня развели мошенники с авито на 40 000₽

Интернет переполнен историями как бабка-пенсионерка на десятом десятке лет по звонку мошенников перевела им все свои похоронные мильены. Все мы дружно с таких историй кекаем, делая поправку на возраст. С молодыми нами такого бы не произошло. Зумеры не курят, потому что боятся поднять трубку.

В далеком 2k19 моей основной мобилой был какой-то самсунг. В один день, меня не спросясь, он упал в лужу, когда я шел домой с пьянки. Высушить его в рисе не получилось. Было принято решение покупать Google Pixel 4 – лучший на свете смартфон на андроиде. К тому же я – андроид-разраб. Будет на чем с кайфом приложеньки тестить.

Для контекста, тогда пиксели официально в рф не продавались (как и сейчас). Купить его можно было только у разных инициативных граждан на авито и может быть через какие-то стремные сервисы доставок из сша. Сегодня ими завален весь маркет с озоном, доставят к завтраку за 15 минут.

Я, родившийся и выросший в интернете, с технологиями на ты, на незнакомые номера не отвечающий, по подворотням не шатающийся, открываю авито. Внимательнейшим образом, по отзывам и прочим тоглам выбираю подходящий девайс. Начинается чат с продавцом. Так мол и так, есть в наличии, готовы отправить через боксберри, оплата авито-доставкой. Удобненько, думаю я. Да и боксберри для меня не пустые звуки, уже юзал их неделей ранее, соглашаюсь.

Стартует процесс оплаты. Продавец кидает в чат скриншот (как потом оказалось фейк), что на стороне авито-доставки какие-то траблы и нужно оплатить прямо в боксберри. Я уже капаю слюнями на свой новый девайс и перехожу по ссылке на поддельный, но такой знакомый интерфейс боксберри. Недолго думая или скорее вообще не думая вбиваю данные карты, подтверждаю смс и оплачиваю. Обычно далее тебя перенаправляет в личный кабинет боксберри, где видно статус заказа. Ничего подобного не происходит.

В этот момент приходит осознание: заскамили. В голове начинают перебираться варианты как сделать undo. Первое – написал в поддержку банка, отменить перевод. Банки в этом плане абсолютно беспомощные, перевод был авторизован, чего ты от нас хочешь? Продавец с авито на радостях кидает вторую ссылку, говорит платеж не прошел, вбей-ка данные карты еще раз, чтобы вернуть деньги. Второе – пишу в поддержку авито. Авито еще беспомощнее банка, разводят руками и советуют обратиться в полицию. Решил уже ничего не придумывать и полностью снять с себя ответственность – написал заяву в МВД с теми данными что были у меня и авито: профиль продавца, куски каких-то реквизитов по адресу в екб, поддельный сайт.

Следующие полгода мне на почту регулярно падали пдфки как мое дело кочевало от одного следователя к другому. Пока в какой-то момент оно не утонуло навсегда в пыльных архивах.

40k остаются самой крупной суммой, которую я терял в моменте. Половина зп на тот момент. Пришлось купить сяоми (топ за свои деньги). И хотя бывают в жизни огорчения, я принял решение – ни секунды не буду переживать. И успешно не вспоминал об этом до текущего поста. Потом я вовсе перешел на айфон, а пиксель уже седьмой, мне подарили на др. Довольный как минипиг гоняю цвет кнопочек туда-сюда. Это и правда лучший андроид-смартфон.

Какие выводы:

🐗 Все, что касается денег не должно сопровождаться спешкой. Все, кто торопят тебя принять решение в моменте и быстрее с ними расстаться – мошенники. За продуктами не ходи голодным – накупишь херни. И тому подобное.
🐗 Надо обложиться гарантиями со всех сторон. Не стоит отправлять видеокарту авито-доставкой покупателю в село под архангельском. Получишь обратно кирпич в коробке. Стоит покупать товары на озоне с возможностью возврата в течении 60 дней. Я так вернул 4 скамьи подряд, потому что каждый раз привозили паль.
🐗 Не парься. Как пишут в пабликах ВК: масштаб личности определяется величиной проблемы которая может вывести тебя из себя. Не плоди проблемы. У тебя ровно одна забота в жизни – обеспечить приток бабок в карман. Все остальное – развлечения и расходы.

Удачных покупочек!
Please open Telegram to view this post
VIEW IN TELEGRAM
11221
Хоткеи, без которых невозможно работать

🐗 В Android Studio.

Double Shift

Поиск по всем названиям классов и файлов в проекте.

Command + Shift + F

Поиск по коду внутри классов и файлов.

Command + Shift + K

Открыть окно пушинга коммитов в удаленный репозиторий.

Command + Shift + Minus

Свернуть класс.

Command + Shift + Plus

Развернуть класс.

Command + Option + L

Форматировать отступы по табуляции (спасение от юзающих 2 пробела вместо 4).

Command + Shift + /

Закомментить/разкомментить выделенный кусок кода.

Command + D

Дублировать строку.

Fn + Control + Space

Вывалить список доступных операторов.

Fn + F2

Перенести курсор на следующую ошибку в файле.

Fn + F4

Открыть выделенный файл из вкладки Commit в редакторе (если просто 2 раза тапнуть мышью – откроется commit diff).

Fn + Shift + F6

Переименовать выделенное название сигнатуры везде.

Option + Enter

Импортировать сигнатуру на которой сейчас курсор (чтобы не светилась красненьким).

Option + I

Имплементировать методы в текущий класс (например указали интерфейс – теперь нужно переопределить его методы).

Option + O

Переопределить методы в класс.

Option + →

Перенести курсор к следующему слову в строке.

Option + Cursor

Активировать мультикурсор (чтобы редактировать сразу несколько строк).

Пожалуй и хватит. Для всего остального можно использовать мыша.
Please open Telegram to view this post
VIEW IN TELEGRAM
10321
Недавно сбылась моя мечта – посмотрел на диких кабанчиков. Первого хрюнделя увидел в минском зоопарке (кстати топ, такая эко-деревня на окраине города). Второго, более дикого – в Беловежской пуще. Там они тусуют в огромных вольерах посреди леса. Кабан подошел близко и начал активно копать грунт.

Следующая мечта – попасть на пиг-айленд. Я знаю, что такие острова есть в Таиланде и на Карибах. Одичавшие свиньи там совершенно не боятся людей.
922
🐗 Custom Emoji

Наформашлёпил собственный эмодзи-пак для этого канала. Всегда любил векторную графику, если бы не зияющая творческая дыра внутри меня – попробовал бы себя в дизайне.

Чтобы иконки не плясали как кривой забор, было решено сделать их одноразмерными. Вписал SVG-логотипы в квадрат 100х100px (ограничение телеги) со скруглением 24px.

Оказалось, делать свои статические иконки проще, чем искать нужные на просторах телеграма. Все что требуется – экспортировать иконки из фигмы и загрузить их в бота @Stickers. Принимаются форматы .png и .webp.

Можно добавлять новые эмодзи, удалять или заменять старые, менять их порядок, смотреть статистику. Доступно юзерам с премиум подпиской.

Я пока не раскурил как повысить качество иконок. В тексте незаметно, но если приближать, то немного шакалит. Покопаться в исходниках и вдохновиться можно в 🐗 Figma.

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
50821
На что в Android-разработке кладется болт

🐗 Landscape. Про сохранение состояния в бандл спрашивают на каждом собесе. При этом альбомной ориентации нет примерно ни у кого. Хардкодим флаг в манифесте и забываем про этот геморрой навсегда. Почему? Потому что дорого и долго. Плюс пол дня на разработку каждого экрана. Еще и дизайнер напрягается. Сюда же поддержка планшетов, складных устройств и мультиокон.

🐗 Animations. Анимации радуют глаз, но как же нелегко их делать в системе View. В этом плане переход на Compose внушает оптимизм.

🐗 Accessibility. У людей с ограниченными возможностями отсутствует мощное лобби их интересов. Поэтому делаем везде content_description = null. Адаптивные цвета и шрифты также в топку. Хотя вся инфраструктура давно готова.

🐗 UI-Tests. Иногда (довольно часто) в приложениях полностью отсутствуют Unit-тесты, что уж говорить про тестирование пользовательского интерфейса. Проще и понятнее вложиться в команду тестировщиков и написание тест-кейсов. UI так частно меняется, что тесты за ним не поспевают. Они начинают сыпаться и закономерно отключаются.

🐗 AAB. App Bundle – прекрасная штука. Но не очень полезная, когда интернет безлимитный, а выкладываться приходится не в один Google Play, а в сто разных маркетов. К тому же не все компании готовы аутсорсить свои ключи гуглу.

🐗 Notification Channels. Потенциальная киллер-фича Android, если бы все разработчики использовали ее правильно. Но тогда половину бизнесов пришлось бы закрывать из-за невозможности слать юзерам рекламу и рекомендации в пушах.

🐗 Widgets. А также AppShortcuts и бабблы для бесед. Во-первых, не каждому приложению это вообще нужно. А во-вторых, долго делать, сложно поддерживать, особо не разгуляться по функционалу.

🐗 Deep Links. Можно так настроить диплинки, что будет открываться нужный экран на любую ссылку и подсылку. Можно с сайта гнать юзера в стор, после установки сразу гнать на нужный экран. Но можно и без этого спокойно прожить.

🐗 Optimize battery. В идеальном мире пользователь включает экономию батареи и все приложения послушно перестают кушать зарядку в фоне. Как оно в реальной жизни объяснять не нужно. Гугл даже сделал флаг в манифесте для особо прожорливых приложений, и все дружно себе его включили, чтоб не обделили. Про задохликов на Android Go, по-моему, вообще никто не слышал, нечего и упарываться.

Вот и получился списочек того, что можно не изучать в первую очередь.
Please open Telegram to view this post
VIEW IN TELEGRAM
9211
Media is too big
VIEW IN TELEGRAM
Отсылки к Игре престолов

5 лет назад закончилась Игра престолов – главный сериал 2010-х. На стримингах крутят второй сезон Дома дракона, в производстве еще несколько приквелов. Доить фанбазу планируется долго. Так как сериал стал культурным феноменом, его мемный потенциал довольно высок. Сегодня хотелось бы пройтись по отсылкам, которые мелькают по соцсетям, но могут быть непонятны людям вне эхо-камеры.

🐗 Милое летнее дитя

«‎...‎Мое милое, летнее дитя. Что ты знаешь о страхе?.. Страх приходит зимой, когда дома по крышу завалены снегом. Страх приходит долгими ночами, когда солнце прячет свой лик на годы, а дети рождаются, живут и умирают во тьме...»‎

Из сказки Старой Нэн, няни дома Старков. Нежный сарказм по отношению к тем, кто наивен, не получил достаточно жизненного опыта и живет в противофазе с реальностью. Типичный портрет: чайлдфри-чечик пытается учить бывалого отца семейства, как по его мнению правильно воспитывать детей, чтоб не орали. Или под рекламным постом в блоге видим умника с сентенцией: «‎зачем рекламу постишь уважаемый? лучше просто делай контент и читатели будут тебе донатить»‎. Oh, sweet summer child.

🐗 Пушок на яйцах не вырос

«... — Не пытайтесь меня запугать! Ваш муж в подземелье, а у вашего сына еще пушок на яйцах не вырос...»

Пригрозил старый Уолдер Фрей, лорд Переправы. Примерная аналогия знакомого нам «молоко на губах не обсохло». Здесь речь о совсем уж молодых и неопытных юнцах. Им указывается на их место в социальной иерархии и что все перспективы у них еще впереди.

🐗 Королева андалов, ройнаров и Первых Людей, Кхалиси великого травяного моря, Разбивающая Оковы, Матерь Драконов...

«... — Женщина? — усмехнулась Дени. — Это сказано, чтобы оскорбить меня? Я вернула бы тебе пощечину, будь ты мужчиной. — Она смотрела наемнику прямо в глаза. — Я Дейенерис Бурерожденная из дома Таргариенов, Неопалимая Матерь Драконов, кхалиси всадников Дрого и королева Семи Королевств Вестероса...»

Боюсь мне тут не хватит поста для изложения полного титула этой персонессы. Вывод простой – будь краток. Особенно, когда просят рассказать о себе. Не надо этой кавалькады регалий в стиле матери драконов.

🐗 Что мы говорим богу смерти? Не сегодня

«... — Идем со мной, бежим!
— Первый меч Браавоса не убегает. Что мы говорим богу смерти?
— Не сегодня...»


Слова Сирио Фореля, фехтовальщика Арьи Старк. Он учил ее говорить богу смерти «‎не сегодня», однако сам последовать своему девизу не смог.‎ Что мы говорим богу сна? Еще одну серию и спать. А богу трезвости?

🐗 Валар моргулис - Валар дохаэрис.

«... — Валар моргулис, – поздоровалась Кошка.
— Валар дохаэрис, – отозвался Бруско...»


Пароль и девиз. Валар моргулис переводится с валирийского как «все люди смертны». Это выражение приветствия. Ответ на него: валар дохаэрис («все люди должны служить»). В основном встречается на разном мерче и заменяет пасхальное приветствие или традиционное арабское приветствие.

🐗 Что мертво, умереть не может

«... — Благослови его солью, благослови его камнем, благослови его сталью. Племянник, ты еще помнишь слова?
— То, что мертво, умереть не может, — припомнил Теон...»


Девиз железнорожденных, наделенный религиозно-сакральным смыслом. Его произносит жрец во время ритуала поклонения Утонувшему богу. Всплывает, когда кто-то всерьез обсуждает перспективы VK как замены заблокированных инсты и фейсбука.

🐗 У девочки нет имени

«... — Если девочка назовёт мне своё имя, я верну девочке зрение.
— У девочки нет имени....»


Арья Старк учится в храме Многоликого бога, её учитель Якен Гхар добивается того, чтобы девочка отреклась от своего имени и личности и стала «никем». Посыл обучения следующий: чтобы стать многоликим, нужно сначала стать никем, то есть безликим, не иметь имени. У девочки в релокации нет ни имени ни национальности. Если девочка назовет свое имя, человек напишет его на стаканчике старбакс.
Please open Telegram to view this post
VIEW IN TELEGRAM
9221
Беспроводная отладка

Еще один шаг в светлое беспроводное будущее – возможность отлаживать приложения на своем устройстве через Wi-Fi. Хоть в студии и прекрасные эмуляторы – их не настолько же удобно использовать и нельзя потыкать пальцами.

Как подключить?
1. Твои пекарня и мобила должны быть подключены к одной Wi-Fi сети.
2. На телефоне перейти на экран Для разработчиковОтладка по Wi-Fi и включить тогл.
3. В Android Studio нажать Running devices Pair Devices Using Wi-Fi и связать устройства с помощью QR-кода или кода сопряжения.

Обычно устройства потупят пару секунд и успешно друг друга найдут. При подключении отобразится пуш-уведомление. Далее отладка будет подключаться автоматически при открытии проекта в студии. Все это работает благодаря инструменту командной строки ADB (Android Debug Bridge). В IDE находится: ToolsADB Idea. Функционал у него богатый: можно не покидая студии удалять, прибивать, запускать, переустанавливать приложения. А также очищать данные.

Ничего не работает. Что делать?
1. Проверить что устройства подключены к одной беспроводной сети. Тут можно попасть в просак, если у тебя многочастотный роутер (например 2.4 ГГц и 5 ГГц). Нужно выбрать одну частоту.
2. Проверить версию OS. Вся эта свистопляска поддерживается только с Android 11 (API 30) и выше. Древние девайсы тоже можно подключить через ADB, но немного костыльными способами.
3. Установлена последняя версия Android Studio.
4. Установлена последняя версия SDK Platform Tools. Проверить: ToolsSDK Manager → выбрать вкладку SDK Tools → проверить что Android SDK Platform-Tools не требует обновления.
5. Включить/выключить Wi-Fi.
6. Перезагрузить телефон (довольно часто помогает).
7. Наконец подключить телефон к ПК напрямую с помощью командной строки:
перейти в папку с adb:

cd platform-tools

проверить, что устройство не подключено:

./adb devices

вбить ip-адрес и номер порта (отображается в настройках разработчика):

./adb ipaddr:port

ввести код сопряжения (там же) и нажать enter.

OS Android будет периодически отзывать беспроводную отладку. Чтобы быстро ее включать без путешествия в настройки – добавим плитку в шторку. Включаем тогл на экране Для разработчиковЭлементы в быстрых настройкахОтладка по Wi-Fi.
911
Channel name was changed to «Android | Михаил Белый»
This media is not supported in your browser
VIEW IN TELEGRAM
Битовые маски в Kotlin

Представим ситуацию – мы пилим соцсеть с юзерами. Перекладываем джейсон в интерфейсный список. Как-то раз нам нужно добавить рядом с именем юзера значок верификации. Бэк напрягается и меняет контракт юзера в API, добавляя новое поле isVerified: Boolean. Теперь в зависимости от полученного значения мы манипулируем отображением галки на фронте.

Проходит время, настает потребность добавить значок олда для наших самых преданных пользователей. Опять меняем контракт и заводим дополнительное поле – isOld: Boolean. Теперь на фронте возможны 3 комбинации отображения бейджей:
1. юзеры с верификацией и олдом.
2. только юзеры с верификацией.
3. только юзеры с олдом.

Вскоре хотим разгуляться и добавить еще штук 5 самых разных бейджей. Менять контракт и добавлять кучу полей уже не кажется хорошей идеей. Здесь нам на помощь спешат битовые маски, а именно оператор сдвига влево – shl.

Про операторы над двоичными представлениями чисел когда-нибудь в другом посте. Сейчас остановимся на практическом примере.

Будет прекрасно каждому нашему значку присвоить уникальное число. На фронт будем отправлять сумму этих чисел (список значков). Таким образом это:

{
"username": "Zak Lewis",
"isVerified": true,
"isOld": false
}


превращается в это:

{
"username": "Zak Lewis",
"badges": 1
27
}


Список значков на фронте будет enum-списком:


enum class BadgeEnum(
val bit: Int
) {
BADGE_EMPTY(0), // 0
BADGE_VERIFIED(1 shl 0), // 1
BADGE_OLD(1 shl 1), // 2
BADGE_NEW(1 shl 2), // 4
BADGE_STAR(1 shl 3), // 8
BADGE_CROWN(1 shl 4), // 16
BADGE_HEART(1 shl 5), // 32
BADGE_RICH(1 shl 6); // 64
}


Для каждого следующего значка двигаем биты на 2 разряда влево, то есть возводим число в степень двойки. Теперь, чтобы сообщить фронту, что юзер – верифицированный олд с короной, достаточно прислать badges: 19 (1 + 2 + 16). Сумма всегда будет уникальной.

Выявлять значок в присланное маске будем сравнивая числа побитно оператором and внутри инфиксной функции hasFlag. Например:


val Int.isVerified: Boolean
get() = this hasFlag BADGE_VERIFIED

val Int.isOld: Boolean
get() = this hasFlag BADGE_OLD


Мы также можем смапить все значки из маски в один список функцией mapEnabled.
Для badges: 19 результат будет:
listOf(
BADGE_VERIFIED,
BADGE_OLD,
BADGE_CROWN
)

Или наоборот, узнать каких значков в маске нет с помощью функции mapNotEnabled.

Пример, экстеншены и тесты в репозитории на гитхабе:
🐗 github.com/michaelbel/EnumBitmask
Please open Telegram to view this post
VIEW IN TELEGRAM
5211
🐗 Обновление эмодзипака

72 новые иконки прибыли!

🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 Добавились разные видеохостинги, так как ютуб на ладан дышит.

🐗 🐗 🐗 🐗 🐗 🐗 Популярные браузеры.

🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 Языки и фреймворки.

🐗 🐗 🐗 🐗 🐗 Порицаемые соцсети компании мета.

🐗 🐗 Продукция адобе.

🐗 🐗 🐗 🐗 🐗 Продукция мелкомягких.

🐗 🐗 Продукция гугла.

🐗 Продукция эпла.

🐗 🐗 Соцсети для дизайнеров.

🐗 🐗 🐗 🐗 Геймдев.

🐗 🐗 Корпоративный софт.

🐗 🐗 Две буквы из фаанга.

🐗 Реддит объемный. Поиграли в плоский дизайн и хватит.

🐗 Айос 18 (выходит скоро).

🐗 Дакдакго (лучший поисковик кста).

🐗 Миджорни.

🐗 Саундклауд.

🐗 Хабр.

🐗 Телеграф.

🐗 Википедия.

🐗 Хуавей.

🐗 Апаче.

🐗 Бинанс.

🐗 Докер

🐗 Дропбокс.

🐗 Линукс.

🐗 Пэйпал.

🐗 Progressive web app.

🐗 Снэпчат.

🐗 Торрент.

🐗 Вайбер.

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
505221
🐗🐗 Обновление карьерного роадмапа

Из визуального:

Новые иконки и сочные обложки для каждой страницы. Единый стиль заголовков. Ссылки на статьи и видосы стали меншенами и теперь сопровождаются датой публикации.

По разделам:

🐗 Job Interview
Список ключевых навыков для резюме.
Вопросы по cultural fit.
Вопросы будущему руководителю.
Больше моков по system design + вопросы/ответы.
Асимптотика алгоритмов сортировки.
Задачи «‎что произойдет»‎ на лайвкодинг.

🐗 Kotlin
Битовые операторы: shl, shr, ushr.
Функции валидации аргументов: require, check, error.
Все варианты применения Object.
Про корутины: supervisorScope, withTimeout, Channel.
Про StateFlow: update, collectAsState, collectAsStateWithLifecycle.
Бестпрактисы по KMP, как пересесть с Java, какие androidx-библиотеки уже переехали.
Инструкция как генерировать мультиплатформенные ресурсы, запускать и паковать WebApp.

🐗 Java
Иерархия исключений.
Примеры лямбд.
Iterator в коллекциях. HashMap vs Hashtable.
Young vs Old Generation в мусорке, подробнее про StrongReference и PhantomReference.
Java Memory Model, Happens Before, стек, куча, мьютекс, монитор, семафор, deadlock, race condition, stop the world и другие страшные вещи.

🐗 Compose
Аннотации Stable и Immutable.
compositionLocalOf vs staticCompositionLocalOf.
nestedScrollConnection.

🐗 Android
Добавились 2 графических роадмапа.
Параметры манифеста.
Вопросы про пермишены и сервисы.
Новые коллекции: ScatterMap, ObjectFloatMap, IntIntPair.
Вопросы и ответы про отрисовку и состояние View.
Про RenderThread и частоту отрисовки UI.
Плюсы/минусы/различия MVP/MVI/MVVM.
Про подключение зависимостей и модулей: implementation, api, compileOnly, runtimeOnly.
DI vs Service locator.
Добавилась страничка для ExoPlayer.

🐗 Jetpack
Подробное описание Hilt: Multibindings, Singleton, Subcomponent, Binds vs Provides, Component vs Module.
Про SavedStateHandle у ViewModel.
Аннотации в Room.

🐗 Studio
Инструкция как выделить под студию больше памяти.

🐗 Git
Ссылка на бесплатный курс по Git.
Инструкция как развернуть свой web-проект на Github Pages.

🐗 Samples
Тип и краткое описание для всех проектов и библиотек.
Добавились новые проекты.

Дальнейшие планы:

• Оптимизации в Compose.
• Внутренности корутин.
• Многопоточность в JVM.
• Алгоритмы и структуры данных.
• Мультиплатформа: iOS, Desktop и Web.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
11631