Size: a a a

Android Live 🤖

2020 November 10
Android Live 🤖
​​История про memory leaks, WeakReferences и ошибки при исправлении
#article

Попалась любопытная статья, где рассказывается о неверном использовании механизма ссылок WeakReference.
В ней описывается пример использования WeakReference как костыля для работы с утечками памяти. Автор решил изучить вопрос, и рассмотрел несколько вариантов борьбы с этой проблемой.

Описываются все плюсы и минусы решений. Тут и EventBus, и LiveData, и RxJava с BehaviorRelay, да и многие другие, менее очевидные решения.

Множество информации можно почерпнуть тут.
источник
2020 November 12
Android Live 🤖
​​Несколько советов по Kotlin для Android разработчиков
#article #kotlin

Ни для кого не секрет, что сегодня Kotlin — это официальный язык для нативной разработки под Android. Он призван уменьшить количество написанного кода и улучшить его качество.
В целом, со своей задачей он справляется, однако не все разработчики используют все фичи этого языка при написании кода, делая всё «по старинке».

Попалась статья, которая даёт 7 советов написания кода «Kotlinic» способом. Вот несколько из них:

🔸используйте функцию `let`, чтобы проверить поле на null. Проверка на null — это очень распространённое действие, несмотря на то, что в Kotlin есть nullable-переменные. Многие забывают, что существует хорошая альтернатива if not null выражению — функция let, в которой код превращается в a?.let { foo(a) }.

🔸используйте функции для создания списков. Очень часто мы для заполнения списков используем цикл for и забываем про средста Kotlin.
Например, заполнить список значениями по умолчанию можно в одну строку:
val list = IntArray(10) { 1 }.asList().
Но подобным образом можно заполнить список разными значениями:
val list = List(5, {it*2}), что даст нам список от 0 до 8 с шагом 2.

🔸используйте `require` и `check` для работы с исключениями. Например, если мы хотим, чтобы наша переменная была больше нуля, то можно вызвать функцию:
require(n >0) { Should be more than zero }.

🔸используйте `apply` и `with`, чтобы уменьшить повторы кода. Эти две функции полезны, если мы хотим сделать несколько действий с нашей переменной. Такое часто бывает при работе сo RecyclerView, которому нужно задать layout manager и несколько других свойств.

🔸используйте методы `partition` и `groupBy` для списков. Эти функции помогают нам сделать несколько списков из одного по заданному условию.
Добавлю сюда ещё функцию groupByTo, в которой мы можем указать то, в какую структуру превратить наш список.

🔸используйте method references вместо lambda expressions для простых действий. Довольно интересный совет, который не так часто видишь в коде.
Например, у нас есть список объектов Person, который мы хотим преобразовать в список имён. Мы можем использовать method references в map, чтобы сделать это более красивым способом:
val names = persons.map(Person::name).

Надеюсь, что вы нашли для себя полезный совет, который будете применять на практике. 🤓
источник
2020 November 13
Android Live 🤖
​​Немного про let
#kotlin #article

Во вчерашнем посте был первый совет с использованием let для проверки переменной на null. @atlantik_hak подкинул годную статью, где описываются примеры, когда не стоит использовать let для этих целей, а когда let — самое лучшее решение для проверки.

Итак, когда лучше не использовать let:

для проверки на null immutable переменной. Хотя и запись a?.let { foo(a) } получается довольно изящной, она генерирует лишнюю переменную в байткоде, в отличии от аналога if not null. Врядли вы заметите огромную разницу, но если можно избежать создания лишней переменной, то почему бы этого не сделать.

если вы хотите использовать переменную только внутри let. Чаще всего мы делаем проверку именно для того, чтобы использовать её внутри блока. Например, мы хотим что-то сделать с webView:
webviewSetting?.let {
   it.javaScriptEnabled = true
   it.databaseEnabled = true
}


вместо этого можно использовать функцию run
webviewSetting?.run {
   javaScriptEnabled = true
   databaseEnabled = true
}

который уберёт лишние it.

если хотите передать переменную дальше по цепочке. Например, если вы хотите указать размер списка, если он не null, а дальше что-то продолжить делать с ним. Альтернативным решением будет использование also, хотя это тоже не идеальное решение.

Когда же тогда использовать let?
🟢 для проверки на null mutable переменной. Тут хорошо подходит let, так как он избавляет нас от дополнительного ? при взаимодействии с переменной.
private var str: String? = null

fun process() {
   str?.let { /*Do something*/ }
}


🟢 если хотите использовать переменную снаружи от let. Например, если вы хотите проициализировать другие переменные тем классом, что был у вас:
var javaScriptEnabled = false
var databaseEnabled = false

webviewSetting?.let {
   javaScriptEnabled = it.javaScriptEnabled
   databaseEnabled = it.databaseEnabled
}


Это удобнее для review кода, чем функция run.

🟢 когда у вас есть проверка из цепочки `?`. Например:
return string?.asIterable()?.distinct()?.sorted()
генерирует больше байткода, чем:
return string?.let {
       it.asIterable().distinct().sorted()
   }


Спасибо подписчикам, которые дают обратную связь по постам ✌️.
И уверен, что теперь вы будете использовать let аккуратнее.
источник
2020 November 16
Android Live 🤖
​​Как сделать компилятор Kotlin умнее
#article #kotlin

Компилятор Kotlin довольно умный и даёт нам подсказки о наших же ошибках.
Одной из самых заметных фич в компиляторе Kotlin является smart casting. Это значит, что компилятор может выполнять приведение типов на основе проверок, выполненных разработчиком.

Однако механизм smart casting не безграничен. Например, компилятор может проверить переменные только в том блоке, где эти проверки были непосредственно выполнены.

Немногие разработчики знают, что можно написать контракты, которые помогут компилятору в его работе. Например, если вы создадите контракт, функция которого возвращает true, в случае если переменная не равна null, компилятор выполнит приведение типа и сделает нашу переменную non-nullable.

Contract DSL выглядит так:
fun foo(): Boolean {
   contract {
       // Effect
   }
   // Function body
}


Можно использовать следующие функции для того, чтобы описать контракт:
🔸returns(value) — описывает ситуацию, когда функция нормально возвращается с указанным значением.
🔸returnsNotNull() — описывает ситуацию, когда функция возвращает non-nullable значение.
🔸implies(booleanExpression) — указывает, что данный наблюдаемый эффект будет истинным при заданном booleanExpression
🔸callsInPlace(lambda, kind) — позволяет указать, как часто будет выполняться данная лямбда.

Краткое описание параметров способно запутать, но можно обратиться к статье, чтобы получить больше информации с примерами. Надеюсь, что в будущем появится ещё больше функций для описания контрактов 🤟.
источник
2020 November 18
Android Live 🤖
​​Новый рубрики
#android_live

Хочется добавить на канал больше социальной активности и пользы для вас, мои подписчики ✌️. Поэтому, хочу анонсировать две новые рубрики на канале:

1) От подписчика. Теперь у каждого из вас есть возможность поделиться чем-то с другими. Это может быть что угодно: начиная от статьи, которая вам понравилась и может понравиться другим и заканчивая уникальным опытом работы в компании, открытия своего стартапа или проекта. А вдруг среди нас есть авторы известных библиотек, и вы хотите ответить на вопросы разработчиков, чтобы сделать своё творение ещё лучше. Всем этим можно поделиться на канале в виде простого поста или целого треда с обсуждениями.

2) Вопрос к эксперту. Также у вас есть возможность узнать ответ на наболевший вопрос у экспертов. Возможно, вы не знаете как правильно решить конфликт у себя в команде, а может у вас нет представления, куда двигаться в карьерном плане. Теперь можно получить ответы на эти и многие другие вопросы здесь – на канале. Эксперты будут подбираться мной в зависимости от специфики вопроса.
Важно, чтобы этот вопрос был интересен не только вам, а также не был таким, ответ на который легко загуглить.

Не стесняйтесь участвовать в этих активностях и пишите мне. А также напоминаю, что обсудить всё, что происходит на канале можно у нас в чате.
источник
2020 November 19
Android Live 🤖
Пост для Android-разработчиков, которые следят за безопасностью своих приложений 🔥🔥🔥

Авторский канал «paradiSEcurity» расскажет про информационную безопасносность мобильных приложений.

В кратких, но емких постах раскрываются важные темы:

🌶 как создавать безопасные приложения
🌶 как сделать реверс приложения
🌶 почему сложно организовать голосование на выборах через приложение

Если интересуешься лучшими практиками защиты приложений и хочешь понимать, почему даже они не всегда выдерживают хакерские атаки, то 👉 @paradisecurity
источник
2020 November 20
Android Live 🤖
​​Firebase Android BoM
#firebase

Недавно настраивал пуш-уведомления для проекта и, как обычно, полез в документацию Firebase, чтобы посмотреть необходимые зависимости.
К моему удивлению, появился механизм, который называется Firebase Android BoM.

Суть в том, что теперь не нужно обновлять все версии Firebase библиотек по отдельности, а достаточно обновить только одну версию — версию BoM. Главной фишкой является то, что обновлённые библиотеки будут совместимы между собой.

Выглядит это так:
dependencies {
 // Import the BoM for the Firebase platform
 implementation platform('com.google.firebase:firebase-bom:26.1.0')

 // Declare the dependencies for the desired Firebase products without specifying versions
 // For example, declare the dependencies for Firebase Authentication and Cloud Firestore
 implementation 'com.google.firebase:firebase-auth'
 implementation 'com.google.firebase:firebase-firestore'
}


Посмотреть, какие конкретно версии библиотек включены в конкретный BoM можно тут, а почитать детальнее можно в документации.
источник
2020 November 23
Android Live 🤖
​​Знакомство с MotionLayout
#intro #motionlayout

Думаю, что многие из вас уже знакомы с MotionLayout и теми фичами, которые он предоставляет. Если нет или вы недавно в Android-разработке, то пара статей поможет вам быстро разобраться с базовыми вещами, которые в нём есть.

Для начала есть статья, которая описывает функции Motion Editor — базового инструмента для предварительного просмотра созданных при помощи MotionLayout анимаций. В ней можно почитать про основные панели — Overview, Selection, Attribute, Preview и на примере посмотреть, как их использовать в проекте.

А если вы уже изучили теорию или она кажется вам слишком скучной, то есть CodeLab, где можно на практике закодидить анимацию и посмотреть, как она будет работать в реальном проекте. Тут можно изучить:

• ConstraintSets;
• анимации, которые работают на drag events;
• изменение анимации при помощи KeyPosition;
• изменение атрибутов при помощи KeyAttribute.
• анимацию шапки при помощи MotionLayout.
источник
2020 November 24
Android Live 🤖
​​Ещё про MotionLayout
#motionlayout #subscribers

Новая рубрика, где каждый из вас может поделиться интересными статьями начинается!
Вдогонку ко вчерашнему посту, рассказывающем о знакомстве с MotionLayout, @Vel_daN делится циклом своих статей, где рассказывает о более глубоком использовании этого компонента.

Главным недостатком MotionLayout является то, что если мы хотим создать анимацию с его использованием, то необходимо зарегистрировать все состояния в MotionScene при помощи ConstraintSet. Если наша анимация объёмная, то это сбивает с толку, становится нечитаемым, ну и всё ещё не отображается в runtime.

Решение —  это использовать xml-файлы, что заметно сокращает код и делает его более читаемым. Пока есть три статьи, вот первая, вторая и третья.

@Vel_daN также согласился ответить на ваши вопросы, связанные с MotionLayout и поделиться своим опытом, поэтому если у вас есть вопросы — можете задавать их в нашем чате.
источник
2020 November 26
Android Live 🤖
​​Кроссплатформенные приложения на Kotlin
#kotlin #crossplatform #compose

Одним из главных преимуществ Flutter перед Kotlin Multiplatform на сегодня является возможность создавать общий UI. К счастью, JetBrains работает над этой проблемой, и не так давно был анонс Jetpack Compose, который работает на Windows.

Нашёл статью, где описан пример приложения, работающего как под Windows, так и под Android. Автор использует библиотеку Decompose, созданную для улучшения работы с бизнес логикой, навигацией и UI.

Уже нет сомнений, что Jetpack Compose будущее UI для Android. Интересно, насколько Jetpack Compose приживётся в создании приложений под Windows? 🤔
источник
2020 November 27
Android Live 🤖
​​Как узнать время старта приложения?
#performance

Тестирование времени запуска приложения — это довольно популярная задача оптимизации приложения. От времени старта зависит общее впечатление от использования продукта.

Совсем недавно Google анонсировал библиотеку App Startup, которая позволяет правильно инициализировать компоненты для приложения.
Но чтобы понять, насколько улучшилось время запуска, нужно знать результаты до и после её применения.

Самым распространённым подходом является использование функции System.currentTimeMillis(), при помощи которой можно залогировать время, и вычислить разницу межу нужными нам кусками кода.
Но главная проблема в том, что мы не можем узнать время запуска до начала вызова нашего кода, соответственно и до вызова этой функции.

Есть хороший подход, описанный в этой статье. Автор делится командами adb, которые позволяют понять время запуска приложения с момента клика на иконку.

Итоговая команда выглядит так:

adb shell am start-activity -W -n com.android.samples.mytest/.MainActivity | grep "TotalTime" | cut -d ' ' -f 2

Кроме того в статье, говорится о том, как избежать ситуацию с троттлингом процессора, что очень сильно может помешать тестированию производительности приложения.
источник
2020 November 28
Android Live 🤖
​​Jetpack Compose и традиционные View
#compose #jetpack #view

Многие разработчики, которые хотят переписать своё приложение на Jetpack Compose задумываются об обратной совместимости с текущими View. Ведь это непосильная задача, особенно для небольших команд.
К счастью, у нас есть возможность использовать традиционные View и Layout в Compose и наоборот.

Существует класс AndroidView, который легко позволяет использовать обычные View внутри Composable-функций. Это особенно полезно при использовании сложных компонентов, например MapView.

Но есть также класс ComposeView, который позволяет использовать Composable-классы внутри xml-файлов. После это необходимо задать контент в виде Composable фукнции.
Также есть AbstractComposeView, который даёт возможность сделать Composable view, где внутри можно прописать необходимую функциональность.

Подробнее можно почитать в этой и этой статьях.

Jetpack Compose очень крутой фреимворк, который станет будущим UI нативной Android-разработки. Если вы хотите нырнуть в Jetpack Compose больше, то есть канал @android_compose, где автор делится полезными статьями про этот инструмент.

Совсем скоро будет анонс нашего мероприятия, где каждый из нас сможет «пощупать» Compose на реальном проекте 😎
источник
2020 November 30
Android Live 🤖
​​Best practices для безопасности приложений
#security

Уверен, что мы все старательно подходим к безопасности написанных нами приложений, особенно когда они связаны с персональными данными наших пользователей.
Но не все знают о ресурсе от Google, где описаны годные практики, связанные с безопасностью. И главное, что туда регулярно добавляются свежие подходы. Давайте пройдёмся по некоторым из ним.

👉 опасайтесь неявных Intents. Напомню, что это такие Intents, которые позволяют показать диалог выбора приложения через который можно открыть предлагаемый файл. Типичный сценарий — это sharing файлов, когда мы выбираем нужное нам приложение из кучи вариантов. Важно осторожно относиться к ним, потому что «подписаться» на передаваемые файлы могут любые приложения.

👉 изучите разрешения на уровне подписи. Это довольно крутая штука, если вам нужно передавать данные между двумя вашими приложениями. Вы можете прописать разрешение на уровне подписи, и никакое другое приложение не получит достук к передаваемым файлам.

👉 используйте Internal Storage. Для сохранения приватной информации нельзя использовать внешнее хранилище, к которому есть доступ других приложений. Кроме того, внутреннее хранилище удалится, если пользователь захочет удалить ваше приложение.

👉 помните про приватный режим SharedPreferences. Кстати, стоит уже обратить внимание на свежий Jetpack DataStore, который скоро придёт на замену префам.

👉 проверьте ContentProvider. Если у вас есть этот компонент, то проверьте, надо ли вам отдавать данные наружу. Если нет, то пропишите флаг android:exported="false», что скроет ваши данные внутри приложения.

👉 используйте SSL-соединения. Все запросы, которые вы делаете на сервер должны выполняться через https. Кроме того, подумайте о конфигурации trust manager для сетевых запросов. Чуть больше можно почитать тут.

👉 используйте WebView с осторожностью. Важно запретить пользователю уйти куда-то вне вашего контента WebView. Помните также о Chrome Tabs, если вам нужно просто показать контент из сети, но внутри приложения.

👉 проверьте набор Permissions. Важно, чтобы ваше приложение не запрашивало тех разрешений, которые ему не понадобятся для работы. Хорошим советов тут будет использовать Intent вместо разрешений, если возможно. К примеру, есть Intent для добавления контакта в телефонную книгу, и он избавит вас от запроса WRITE_CONTACTS. Очень часто разработчики запрашивают разрешение на запись файлов, хотя им достаточно только считывать их.

👉 обновляйте зависимости. Для себя я выделил правило обновления большинства зависимостей приложения сразу после релиза. Это даст время на тестирование и поимку багов, связанных с этими обновлениями. Но всё же от обновлений больше пользы, чем вреда, ведь разработчики активно исправляют баги, в том числе и безопасности, в своих библиотеках.

Если хотите добавить ещё каких-то правил или обсудить описанные, то обязательно пишите в чат или мне.
источник
2020 December 02
Android Live 🤖
​​Kotlin DSL для runtime permissions
#kotlin #kotlindsl #library

Запрос разрешений в Android довольно распространённая практика, и многие разработчики используют библиотеки для упрощения этого процесса.

Одна из них — это Eazy Permission, особенность которой в использовании Kotlin DSL, возможности использовать LiveData и coroutines для получения ответа об успешном запросе.

Но мне кажется, что главное — это возможность ещё раз посмотреть на довольно мощную функциональность dsl в Kotlin и написать удобные обёртки для своих задач. 🤓

Ссылка на библитеку тут, а подробнее почитать об использовании можно тут
источник
2020 December 03
Android Live 🤖
​​Android Study Jams. Первый митап
#intro

Большинство моих подписчиков — это практикующие Android-разработчики или люди, которые интересуются технологиями.
Если вы не пишите под Android, или знаете тех, кто давно хотел это сделать, но не знал с чего начать, то этот пост для вас.

У Google есть целый раздел с учебниками для новичков в Android-разработке. Есть несколько приложений, где вы сможете сделать их по шагам. Единственный недостаток — это отсутствие практикующего разработчика, который ответит на вопросы.

К счастью, эту проблему тоже можно решить.
Я помогаю ребям из студенческого сообщества DSC (Developer Student Clubs) в первых шагах, связанных с Android. Первый митап будет у сообщества из Саратова. Уже завтра, 4 декабря в 18:30 по МСК, мы вместе сделаем небольшое, но рабочее приложение под Android! Во время мероприятия вы сможете задавать ваши вопросы.

У каждого есть возможность поучаствовать в этом, достаточно просто перейти по ссылке и в деталях сообщения заполнить форму на участие.
Участие абсолютно бесплатное, а мероприятие будет онлайн. От вас не требуются знания программирования (хотя с ними будет проще).
Обратите внимание, что перед воркшопом нужно установить Android Studio и добавить эмулятор, инструкция есть тут.

Торопитесь, ведь число мест ограничено🤓
источник
2020 December 05
Android Live 🤖
​​Podlodka Crossplatform Crew
#conference

Тут ребята из Podlodka сообщают, что совсем скоро состоится неделя первой конференции Podlodka Crossplatform Crew. Старт 14 декабря. Что там будет?

🔹неделя интенсивов и воркшопов по кроссплатформенным технологиям;
🔹общение с крутейшими экспертами и другими участниками комьюнити;
🔹куча новых практик и идей, которые можно унести в свой багаж.

Никаких “Hello World!” на абстрактных примерах, только настоящий опыт внедрения и использования кроссплатформы в реальных проектах от топовых экспертов.

Тем, кто уже хорошо знаком с любой из платформ, неделя Crossplatform Crew будет особо полезна, потому что поможет понять, какая кроссплатформа лучше всего подойдет проекту, и подойдет ли вообще. В программе:

• интервью про кейсы внедрения Flutter, React Native, Kotlin Multiplatform Mobile в разных компаниях;
• воркшопы по интеграции разных технологий в существующий проект;
• рулетка кейсов и шоу “Прожарка”. Описывать бессмысленно – это надо видеть! 🤓

Подробное описание, спикеры и билеты доступны на сайте по выгодной цене.
Ну и традиционно, у моих подписчиков есть возможность выиграть один билет. Как и раньше, нужно просто оставить свой ник Telegram в форме. Форма открыта до 11 декабря, 13:00, розыгрыш будет в тот же день.

Если вы выиграете билет, но при этом вы уже купили один — то не переживайте, организаторы вернут вам деньги, так что затариться по выгодной цене лучше уже сейчас 🤓.
источник
2020 December 07
Android Live 🤖
​​Kotlin Flow
#flow #kotlin #documentation

Совсем недавно Google добавили в раздел документации информацию про Kotlin Flow. Давайте посмотрим подробнее, что там есть.

Вначале описывается то, что из себя представляет Flow: по сути, это тип, который похож на Iterator, который также отдаёт последовательность данных, но при этом использует suspend-функции для работы. Работа любого Flow делится на этапы создания, обработки и получения данных.

Для создания Flow можно использовать специальный builder, в котором можно вызвать функцию emit для публикации данных во Flow. Есть также две особенности работы Flow, о которых надо помнить:
🔹Flow последователен, поэтому все вызываемые suspend-функции ждут результата выполнения друг друга.
🔹flow builder не может «емиттить» данные через другой CoroutineContext.
Описан также хороший пример для понимая работы Flow.

Дальше есть пример использования оператора map — как пример изменения данных, формируемых Flow.
Сразу за ним — использование оператора collect для получения данных.

📌Важно обратить внимание на использование оператора flowOn, так как он распространяет своё действие на операторы, написанные выше.

Не забыли упомянуть и про обработку исключений, используя оператор catch.

Подробнее можно почитать тут. Как по мне, получилась хорошая документация, описывающая базу для работы с Flow. Годно.✌🏻
источник
2020 December 10
Android Live 🤖
​​Jetpack Compose и эквивалентные View
#compose #view #tips

При переходе на новую технологию или фреимворк, сложнее всего искать альтернативы уже знакомым конструкциям.
Для многих таким фреимворком сейчас может быть Jetpack Compose.

Тут @loskin поделился крутым ресурсом, который сопоставляет традиционные View с эквивалентами из Compose. Кроме этого, даст ещё и ссылку на пример из GitHub и на официальную документацию🔥.

А если перейти на начальную страницу, то можно найти подборку примеров приложений, использующих Jetpack Compose.

Даже если вы сейчас не пишите на Compose, то стоит сохранить сайт в закладки, так как в будущем он вам обязательно пригодится.
источник
2020 December 11
Android Live 🤖
​​Подмена Runtime Permissions
#security #subscribers

Тут @vitach скинул свою статью, где описывает, как подменить Runtime Permissions на свежих версиях Android.

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

Идея заключается в наложении поверх этой системной Activity своей с флагом android:windowIsTranslucent=true, который позволяет делать Activityс прозрачным фоном, а также добавить парочку флагов, чтобы убрать фокус:

FLAG_NOT_FOCUSABLE — убирает возможность взаимодействия с методом ввода;
FLAG_NOT_TOUCH_MODAL — отправляет события touch за пределы нашего окна;
FLAG_NOT_TOUCHABLE — убирает возможность получать события касания.

В результате мы получаем открытую фейковую Activity, где можем написать любое разрешение или текст, но при этом, по факту, вызвать совершенно другое. Правда, в некоторых версиях системы у нас есть отличающийся дизайн этих диалогов, но всегда можно допилить UI, используя описанный подход.

Баг работает на версиях Android >= 7.1.1, так как до этой версии показывался диалог с предупреждением о перекрытии окна.

Ссылка на код тут, а статья с описанием тут. Ну и читайте внимальнее те разрешения, которые даёте установленным приложениям.🙄
источник
Android Live 🤖
​​Результаты конкурса Podlodka Crossplatform Crew
#конкурс

Итак, пришло время опубликовать результаты конкурса, который был описан тут.

В конкурсе приняло участие 15 человек, при помощи генератора случайных чисел был выбран победитель — @YakovlevAleksey, с чем я его поздравляю! 🎊

Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах!
источник