Telegram Web
​​Как обеспечить безопасность приложения?
#разработка #статьи #комментарии

Для большинства приложений — безопасность очень важная вещь. Это особенно она важна, если вы работаете с данными пользователей или у вас есть покупки. Ведь никто не хочет, чтобы платной версией приложения пользовались бесплатно. 😉

Автор в статье дал несколько советов, которые значительно улучшат безопасность внутри приложения.

обфускаций кода — наверное, первая и самая важная вещь, которая должна быть у вас включена. Для этого нужно прописать minifyenabled = true в вашем build.gradle приложения. Начиная с Android Studio 3.5 по умолчанию включен R8 вместо pro-guard, что, судя по всему, делает реверс-инжениринг приложения тяжелее. Обязательно проверьте своё приложение после включения этого флага и уделите особое внимание enum-классам.

проверка на root — по сути root позволяет пользователям делать на их устройстве чуть больше, чем обычным пользователям, например изменение системных файлов или доступ ко внутреннему хранилищу приложения. Запрет использования приложения на root-устройствах может быть критичным.
Мне не приходилось делать проверку на root, но судя по всему, есть решение в виде библиотеки RootBeer.

зашифрованное соединение с сервером — не мне рассказывать, что большинство приложений связаны с сервером. Обязательно проверьте, насколько безопасно это соединение: это обязательно должно быть https соединение. Можно добавить ещё Certificate Pinning, которым вы будете шифровать каждый запрос на сервер. Пример есть тут.

шифрованное локальное хранилище — тут важно оценить «важность» тех данных, которые хранятся на устройстве. Если эти данные позволяют выполнять запросы на сервер от лица пользователя (например, это token), то обязательно стоит задуматься о безопасном хранении этой информации. Для шифрования sharedpreferences можно использовать security-crypto, который хоть и не находится в релизной стадии, но уже работает довольно сносно.

debug mode и логи — никогда не кладите в логи какую-то важную информацию. Проверьте, включен ли deguggable = false в релизном билде.

А что ещё важно учитывать, чтобы сделать приложение безопасным? Давайте обсудим в комментариях
👍1
​​Firebase App Distribution
#разработка

Одним из способом доставки билда тестировщикам, является Firebase App Distribution. Это хороший и простой способ. И у него есть следующие преимущества:
• бесплатный;
• нет лимитов на размер файла приложения;
• работает и на iOS и на Android;
• можно добавлять группы тестировщиков;
• можно приглашать в тестирование по ссылке;
• добавление release notes к каждому билду;
• интеграция с Android Studio.

Для меня ключевым является последний пункт. Даже если у вас в проекте нет CI-системы, то вы легко можете выполнить одну gradle-команду, чтобы загрузить свежую версию приложения в Firebase с release notes и оповестить всех ваших тестировщиков.

Оповещением займется сам Firebase, а мы давайте посмотрим, как же получить release notes от HEAD в git до последнего тега. Пусть все коммиты с префиксом {ADD} — это наши release notes.
Для этого выполним команды:
1) def tagNumber = "git describe --abbrev=0 --tags".execute().text.trim() — вернёт там последий тэг
2) def releaseNotes = ("git --no-pager log ${tagNumber}...HEAD --no-merges --date-order --format=%s --grep {ADD}").execute().text.trim() — вернёт нам список коммитов с префиксом {ADD}
3) new File("release_notes.txt").text = releaseNotes — сохраним всё в файл

А дальше чуть-чуть настроим Firebase:

firebaseAppDistribution {
releaseNotesFile = project.rootProject.file('release_notes.txt')
}


Укажем, что хотим взять release notes именно из этого файла, а остальные настройки лучше посмотреть тут.

Осталось только объединить описанные выше команды в одну при помощи gradle task, назовём её logs и выполним эти команды:

task getLogsAssembleAndDistributeQaRelease(type: GradleBuild) {
tasks = ['clean',
'logs',
'appDistributionUploadQaRelease']
}

В итоге наш билд улетит в Firebase, главное дождаться сборки и не выключить компьютер. 😉
Друзья, нужна ваша помощь.

На канале хочу запустить новую рубрику. Суть её состоит в том, чтобы брать интервью у разработчиков, живущих в других странах и городах.
Будем разговаривать про уровень жизни в стране, культурные привычки, наличие работы, насколько легко туда переехать, нравится ли жить там, сколько стоит жизнь, ну и самое важное — какой зарплатный уровень и налоги.
Получится обширная статья про страну, направленная на жизнь разработчика. Ну а цифры буду суммировать в табличку, чтобы сделать вывод: «Где же лучше жить разработчику?»

Скажите, насколько было бы вам интересно видеть эту рубрику? Какие страны хотелось бы видеть прежде всего и в каком формате?

Лично мне это кажется интересным, ведь информации из первых рук в Интернете не так много. Пишите в комментариях или мне в личку @al_gorshkov и, конечно, голосуйте реакциями. 🤓
Ого, понял, что идея с рубрикой вам зашла!

Особая благодарность подписчикам, которые написали мне в личку с предложением рассказать о своём городе. Если кто-то ещё хочет, но при этом стесняется — не надо переживать, пишите мне @al_gorshkov, уверен, что остальным будет интересно прочитать о вашем опыте.😌
Android Academy про Android 11
#конференции

Уже прошло пару месяцев с момента появления Android 11, но всё равно ещё есть доклады, которые рассказывают о новых фишках и деталях.

Ребята из Android Academy Global делают мероприятие, где будет 3 темы:

1️⃣ Jetpack Dagger Hilt, Мануэль Виво, Google
2️⃣ ActivityResultApi and AppStartUp Api, Алексей Быков, Revolut
3️⃣ Jetpack Paging 3, Дмитрий Мовчан, Revolut

Оно будет уже совсем скоро, 4 августа в 19:00 по Москве. А зарегистрироваться можно тут.
​​Оптимизация приложения для автозаполнения
#разработка

Совсем недавно, столкнулся с интересным, и на первый взгляд, странным багом. У одного пользователя приложения при вводе параметров в EditText появлялось всплывающее сообщение с выбором логина и пароля для входа в него (в приложение).
Пришлось капнуть в сторону решения этого бага, и выяснил одну деталь, которую я раньше игнорировал.

При создании нового EditText в xml, он предлагает ввести атрибут importantForAutofill. Чтобы убрать warning, можно просто игнорировать этот атрибут или добавить в EditText параметр tools:ignore="Autofill". В этом случае, вы уберёте warning, но сможете поймать похожий на мой баг.

Однако лучше не полениться и оптимизировать своё приложение для сервисов автозаполнения. 😊
Например, если вы не хотите, чтобы ваш EditText был доступен для заполнения, используйте в нём параметр android:importantForAutofill="no". Но, например, для ввода логина или пароля, можно поставить этот атрибут yes и добавить новый атрибут android:autofillHints="password" для паролей и android:autofillHints="emailAddress" для e-mail.

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

Подробнее про автозаполнение и доступны константы можно прочитать тут.
​​Жизнь в Израиле
#интервью #экспаты

Итак, начнём новую рубрику на канале!

Наш первый гость — это Андрей Раньков. Он проживает в Израиле, город Кфар-Саба (15 км от Тель-Авива) вместе с женой и двумя детьми. Андрей является Mobile Lead в компании Appcard.

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

Ссылка на форму, где можно задавать свои вопросы тут.

А если у вас есть предложения или вопросы по этому формату, или же вы проживаете в других странах и хотите поделиться опытом, то пишите мне @al_gorshkov.
​​Используйте In-App Review API для Google Play ревью
#разработка

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

Наконец-то Google даёт нам API для того, чтобы пользователь мог поставить оценку приложения прямо в нем. 👍🏻
Подробнее о том, как работает API можно почитать тут.

По сути, это API — часть Play Core Library, которая сделана для Java/Kotlin, C++ и Unity. Google подчёркивает, что важно определить, где в вашем приложении самое лучшее место для того, чтобы попросить пользователя оставить оценку.
​​Анимация как в Google почте
#разработка #статьи

Ни для кого не секрет, что пользователей привлекают приятные анимации в приложении. Google старается делать инструменты для создания анимаций в приложении всё более доступными, а мне по-прежнему нравятся статьи, где описываются крутые примеры с тем, как создавать анимации. 🙃

В этой статье автор описывает, как сделать анимацию открытия почты приложения Google-почта. На мой взгляд, получилась приятная и ненавязчивая анимация, которую можно использовать в качестве основной при открытии экранов вашего приложения.
​​KotlinX Datetime
#разработка #библиотека

Совсем недавно разработчики из JetBrains анонсировали библиотеку для работы с датами kotlinx-datetime версии 0.1.

Это здорово, потому что до последнего момента не было возможности работать с датами напрямую из Kotlin. И если мы, как Android-разработчики, могли напрямую ссылаться на API java.time.*, то при работе с мультиплатформой такой возможности не было.

Более детально о работе с этой библиотекой можно прочесть тут
​​Давненько на канале не проводилось конкурсов. Это нужно срочно исправлять😉

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

Старт конкурса 19 августа в 18:00. Задачку, как всегда, можно будет решить в течении 48 часов.

В этот раз за призы отвечают ребята из команды Badoo.
И вас ждёт 3 призовых места:
🥇место — толстовка + сумка + мерч;
🥈 место — футболка + сумка + мерч;
🥉 место — сумка + мерч.

Кстати, команда Badoo Tech, ведёт интересный Telegram канал, где делится своим опытом. Подписан и давно читаю: @badoo_tech
​​Эти PIN-коды могут быть легко подобраны
#статьи

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

Мне кажется, что мало кто отдаёт себе отчёт, насколько безопасным является их код для разблокировки. Сегодня я хочу поделиться с вами исследованием, где публикуются списки небезопасных pin-кодов. Можно попробовать найти в нём свой собственный. 😏

Интересно, что исследователи пришли к выводу, что 6-значные коды фактически не увеличивают безопасность, так как в этом случае пользователи стараются вводить более простые коды: даты, запоминаемые коды или шаблоны клавиатуры.

Ссылка на исследование тут.
​​Бесконечная строка
#конкурс

У вас есть строка, которая теоретически может повторяться бесконечное количество раз.
Но кроме этой строки есть и ограничитель, который заставляет эту строку остановиться на заданном числе. Ваша задача посчитать, сколько раз встречается символ a в этой бесконечной, но ограниченной числом, строке.

Входные параметры
s — строка, которая становится бесконечной;
n — число-ограничитель до которого нужно посчитать количество символов a;

Выходные параметры
Целое число — количество символов a в этой строке.

Ограничения
1 <= s.length() <=100
1 <= n <=10^6

Пример входных данных
aba
10

Пример выходных данных
7

Объяснение
Строка aba, которая может повторяться бесконечно ограничивается числом 10 и превращается в abaabaabaa. И количество символов a в ней равно 7.

Шаблон на языке Kotlin.

Условия конкурса
1. Решения принимаются в течении 48 часов, то есть до 21 августа 2020 года, 18:00. Необходимо отправить только тело функции.

2. Отправить можно только одно решение.

3. Можно исправлять отправленное решение неограниченное количество раз. Принятым будет считаться решение, отправленное последним.

4. Победителем будет являться самое короткое тело функции func().

5. В подсчете количества символов учитывается только тело функции. Например, в примере return 0; количество символов равняется 9. Это и определяет длину решения.

6. Переименовывать функцию нельзя, как и изменять входные параметры. Убирать return также запрещается.

7. Требований к форматированию нет, важно рабочее решение. Можно убирать пробелы между переменными и писать код в одну строку, если это не нарушит работоспособность решения.

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

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

Также, если кто-то хочет помочь в проверке решений при помощи тестов, то пишите мне.

Решение нужно отправить в форму. Желаю всем удачи!
​​Распознавание рисунков при помощи ML Kit
#статьи #разработка

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

Автор рассматривает Digital Ink Recognition API из ML Kit, которое распознаёт написанный вручную текст или изображение с экрана. По его словам, результаты довольно точные.

Любопытно, что приложение также может работать оффлайн, правда при этом надо скачать модель в виде 20 мегабайт.

Описание того, как сделать такое приложение и ссылка на готовое можно найти тут.
​​Результаты конкурса «​​Бесконечная строка»
#конкурс

Итак, самое время подвести итог нашего конкурса.
В этот раз в конкурсе участвовало 65 решений. Довольно много было и решений, которые не удовлетворяли условиям конкурса: присутствовали и удаления return из функции, и ошибки каста Long в Int.
Такие решения не прошли отбор, так как условия чётко оговаривали правила того, что нельзя никак менять параметры функции, равно как и удалять return. 😊

В результате победили решения, которые имели 52 символа:

1) return(0..n-1).count{s[it.toInt()%s.length]=='a'}*1L@Namolem
2) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L@amihusb
3) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L@luckycactus

Так как решения участников имеют однинаковую длину, то рандомное распределение призов выглядит следующим образом:
1) толстовка + сумка + мерч — достаются номеру 3, или @luckycactus
2) футболка + сумка + мерч — достаются номеру 2, или @amihusb
3) сумка + мерч — достаются номеру 1, или @Namolem

Ссылка на видео с рандомным распределением тут.

Спасибо команде Badoo на отличный мерч и призы.
Кроме того, отдельное спасибо @g_apollo и @KoteykaEvil за помощь в проверке заданий.

Также благодарю всех кто участвовал в конкурсе! И поздравляю победителей! 😎

Конкурс далеко не последний, поэтому вновь спрашиваю вас: какие призы вам были бы наиболее интересны при проведении подобных конкурсов? Напишите, пожалуйста, мне.
​​Android Lint Framework — введение
#разработка #статьи

Android Studio даёт довольно много инструментов для того, чтобы писать качественный код. Одним из таких является Lint: IDE подсказывает вам о каких-то неточностях в вашем коде и распространённых багах, к которым можем привести этот код.

Однако самым главным преимуществом является то, что каждый сам может написать свои правила для кода. 😎 Автор этой статьи описывает шаги для написания своего lint-правила:

🔹какие зависимости подключить;
🔹от какого класса наследоваться;
🔹как прописать типы классов, на которые будет распространяться правило;
🔹как применить написанное правило.

Также есть неплохой репозиторий от Uber, где содержится целый набор lint-проверок.
​​Как писать быстрые layouts
#разработка #статьи

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

Но всё равно нужно держать в голове следующий момент: большинство устройсв сегодня имеют частоту обновления экрана в 60 fps, то есть на отрисовку одного кадра у нас есть 1/60 ≈ 16 миллисекунд. Для того, чтобы добиться этого результата у нас есть несколько инструментов и советов.

1) Используйте средства для диагностики проблем с layouts: Layout Inspector, Systrace, Android Profiler. Каждая из них достойна отдельного поста, поэтому пока только ссылки в документации.

2) Переиспользование layouts с merge.
Вынесение layout в xml и использование его при помощи include — довольно распространённая практика. Однако, многие забывают, что вместо корневого layout можно написать merge, который уберёт лишний уровень вложенности.

3) Используйте подходящий родительский layout.
Для этого пользуйтесь следующим правилом: для сложной верстки — ConstraintLayout, для вертикальных или горизонтальных последовательных элементов — LinearLayout, для расположения элементов одного над другим — FrameLayout.

4) Используйте ViewStub.
ViewStub — это хорошая альтернатива, когда вам нужно показать тяжёлый layout на экране или сделать этот показ отложенным. Он быстро рендерится и легко применяется, поэтому не забывайте про этот инструмент.

Подробнее про эти советы можно почитать тут.
​​Jetpack Compose теперь в Alpha
#разработка #опрос

Сегодня вышла Alpha версия фреимворка Jetpack Compose.
Финальную версию обещают к 2021 году, ну а пока у нас есть:

🔹анимации;
🔹поддержка Constraint Layout;
🔹жесты;
🔹совместимость с текущими проектами и View;
🔹preview в Android Studio;
🔹и другие изменения.

Обновление довольно глобальное, с нетерпением жду beta версию. 😎
Примеры приложений уже есть тут, знаменитый Sunflower и новый для меня Tivi.

Подробнее про изменения можно почитать тут.

Ждёте Jetpack Compose?
​​Constraint Layout 2.0
#разработка #статьи #конференции

Constraint Layout — один из самых популярных компонентов Jetpack. И не зря: это отличный способ построения сложной вёрстки, причём для этого можно использовать только встроенный редактор (хотя иногда удобнее пописать код).

Совсем недавно ConstraintLayout 2.0 перешёл в релизную стадию, и теперь его можно смело затягивать в проект. Давайте же поговорим, что там появилось нового в отличии от первой версии.

🔹Flow — это «виртуальный» layout, который позволяет соединять view в цепочки, которые могут переходить на следующую строку при недостатке места. Очень полезная штука, особенно когда вы не знаете, насколько широкими и разными будут компоненты у вас на экране, но вам обязательно нужно показать их все. Так как это виртуальный layout, то он не добавляет новых view в иерархию, а просто содержит в себе несколько свойств для перечисленных ссылок на view. Почитать побольше об этом компоненте можно тут

🔹Layer — это так же «виртуальный» layout, который позволяет применять какие-то трансформации для view сразу для всей группы. Например, если вы хотите применить анимацию перемещения для большого числа view, то можно просто перечислить их в отдельный layer и применить анимацию только для layer.

🔹Motion Layout — наверное, одна из самых ожидаемых фич. Он позволяет создавать фактически любые анимации довольно простым и удобным способом благодяря встроенному в Android Studio редактору.

В одном пункте об этой фиче не расскажешь, но тут очень кстати ребята из Android Academy Minsk организуют митап, который рассказывает про Motion Layout и как его применять.
Пройдёт он 3 сентября в 19:00 по МСК. На митапе мы узнаем что такое MotionLayout и какие проблемы он может решать, изучим базовые вещи для анимаций а также пошагово в конце получим готовый экран Логина/Регистрации. Ссылка на регистрацию тут, а само мероприятие онлайн и бесплатно.

А почитать чуть-чуть больше об описанных изменениях можно в этой статье.
Ещё немного о Jetpack Compose
#конференции

Ребята из Android Academy Global организуют митап, который посвящён теме Jetpach Compose. Доклады довольно крутые, учитывая свежесть технологии:

1) Jetpack Compose and MVI — Артур Бадретдинов, Squire Technologies. Доклад будет о том, как связать паттерн MVI и свежий Jetpack Compose. Посмотрим на примеры реализации и как это будет работать в связке.

2) Easing In and Out with Jetpack Compose — Артем Нестеренко, Loóna Inc. Новый подход даёт нам возможность легче создавать анимации. Также посмотрим на примеры кода и узнаем, каково же это писать анимации в декларативном стиле.

Мероприятие будет уже завтра, 01.09.2020 в 19:00, оно будет онлайн и бесплатно.
Ссылка на регистрацию тут, а ссылка на YouTube прилетит прям перед началом😎.
2025/08/30 12:13:58
Back to Top
HTML Embed Code: