Открытый вебинар «Онлайн-интенсив «Упрощаем процесс код ревью с помощью Android Lint»» 19.02.2020 в 20:00 | OTUS
Запланируйте обучение с выгодой в Otus!
-15% на все курсы до 20.11 Забрать скидку! →
Выбрать курс
Проходил 19 февраля 2020 года в 20:00

Открытый вебинар Вебинар для Android-разработчиков с опытом работы.
Онлайн-интенсив «Упрощаем процесс код ревью с помощью Android Lint»

Открытый вебинар онлайн

На интенсиве вы:
- узнаете, как при помощи статических анализаторов, а именно Android Lint, упростить и ускорить процесс код ревью.
- разберете, как работает Android Lint, как парсить source файлы, что такое AST, PSI и тп.
- займетесь live-кодингом: напишете кастомные lint проверки на частые ошибки, возникающие при написании кода.
Преподаватель
Антон Казаков

Запись

О курсе

Android Developer. Professional
106 000 ₽ 90 100 ₽
5 месяцев
Начало 27 декабря
  • Научитесь использовать всю мощь Kotlin для создания современных Android-приложений
  • Научитесь использовать инструменты необходимые для качественной промышленной Android-разработки: Android Architecture, Dagger 2, RxJava, Kotlin coroutines, JUnit, UI Tests, Ui Profiling, Gradle optimizations и др.
  • Создадите свой аналог YouTube, Imgur, CoinMarketCap в рамках разработки индивидуальной проектной работы, которая пополнит ваше портфолио
  • Общение напрямую с преподавателями на лекциях и в Telegram-чате, обсуждение …
Программа курса
Модуль 1
Введение
Модуль 2
Architecture
Модуль 3
View
Модуль 4
Compose
Модуль 5
Data
Модуль 6
Testing
Модуль 7
Kotlin Multiplatform
Модуль 8
Build process
Модуль 9
Проектная работа
Введение
Освежим знания по Kotlin stdlib. Поговорим о kotlin coroutines, их внутреннем устройстве и API.
выбрать и обсудить тему проектной работы;
спланировать работу над проектом;
ознакомиться с регламентом работы над проектом.
27 декабря, 20:00 — 21:30
Лектор: Антон Казаков
Architecture
В этом модуле поговорим про архитектуру в Android приложениях. Рассмотрим популярные архитектурные паттерны и выявим pros & cons каждого из них. Углубимся в ООП паттерны, особое внимание уделим IOC, в частности Dependency Injection: изучим как работает Dagger 2 и используем его для построение многомодульного приложения. Научимся искать явные признаки плохо спроектированного проекта и общие “запахи кода”, и рефакторить проблемные участки кода.
Android Multithreading
обсудить многопоточность в Android приложениях;
узнать немного базы о процессах и потоках в Linux, Handler, Looper и отправка сообщений, Main Thread.
10 января, 20:00 — 21:30
Лектор: Николай Кочетков
RxJava
научиться применять ключевые операторы RxJava;
уметь писать собственные операторы.
14 января, 20:00 — 21:30
Лектор: Михаил Валуйский
Домашние задания: 1
ДЗ
ReactiveCats. - Переведите сетевой запрос с retrofit.Call на RX цепочку. Для этого подключите Retrofit адаптер, поменяйте возвращаемые типы функций

- Поменяйте логику в CatsViewModel.kt с колбеков на RX. Логику обработки успеха/ошибки из коллбека необходимо перенести в терминальные коллбеки RX цепочки. Не забудьте очистить подписки когда ViewModel уничтожается

- Реализуйте функцию otus.homework.reactivecats.LocalCatFactsGenerator#generateCatFact, так, чтобы она возвращала Fact со случайной строкой из массива строк R.array.local_cat_facts обернутую в подходящий стрим(Flowable/Single/Observable и т.п)

- Реализуйте функцию otus.homework.reactivecats.LocalCatFactsGenerator#generateCatFactPeriodically так, чтобы она эмитила Fact со случайной строкой из массива строк R.array.local_cat_facts каждые 2000 миллисекунд. Если вновь заэмиченный Fact совпадает с предыдущим - пропускаем элемент.

- Реализуйте функцию otus.homework.reactivecats.CatsViewModel#getFacts следующим образом: каждые 2 секунды идем в сеть за новым фактом, если сетевой запрос завершился неуспешно, то в качестве фоллбека идем за фактом в уже реализованный otus.homework.reactivecats.LocalCatFactsGenerator#generateCatFact.
Kotlin coroutines
изучить coroutine api, принцип работы корутин, structured concurrency;
рассмотреть кейсы применения корутин в android разработке;
разобраться как корутины устроены внутри, что скрывается за модификатором suspend, что такое CPS и FSM и почему корутины такие легковесные.
17 января, 20:00 — 21:30
Лектор: Николай Кочетков
Домашние задания: 1
ДЗ
Kotlin coroutines. 1. Перейти с коллбеков на suspend функции и корутины:
- Поменять возвращаемый тип в `CatsService` и добавить модификатор `suspend`
- Переписать логику в презентере с `Callback` на корутины и `suspend` функции
- Реализовать свой скоуп: PresenterScope с `MainDispatcher` и CoroutineName("CatsCoroutine") в качестве элементов контекста
- Добавить обработку исключений через try-catch. В случае `java.net.SocketTimeoutException` показываем Toast с текстом "Не удалось получить ответ от сервером". В остальных случаях логируем исключение в `otus.homework.coroutines.CrashMonitor` и показываем Toast с `exception.message`
- Не забываем отменять Job в `onStop()`
2. Добавить к запросу фактов запрос рандомных картинок с [https://aws.random.cat/meow](https://aws.random.cat/meow):
- На каждый рефреш экрана должен запрашиваться факт + картинка: добавляем сетевой запрос и реализуем логику аналогичную первой задаче. Для загрузки изображений уже подключена библиотека [Picasso](https://github.com/square/picasso)
- В метод `view.populate` передаем 1 аргумент, поэтому необходимо реализовать модель презентейшен слоя в которой будут содержаться необходимые данные для рендеринга(текст и ссылка на картинку)
- Отменятся запросы должны одновременно
3. Реализовать решение на ViewModel:
- Реализовать наследника `ViewModel` и продублировать в нем логику из `CatsPresenter`, с необходимыми изменениями. Используйте `viewModelScope` в качестве скоупа.
- Добавить логирование ошибок через CoroutineExceptionHanlder. Используйте класс CrashMonitor в качестве фейкового CrashMonitor инструмента
- Создать sealed класс `Result`. Унаследовать от него классы `Success<T>`, `Error`. Использовать эти классы как стейт необходимый для рендеринга/отображени ошибки

https://github.com/Otus-Android/CoroutinesHomework
Flow
рассмотреть кейсы применение каналов в андроид разработке;
изучить принцип работы флоу и задачи которые он решает;
изучить операторы для работы с флоу;
сравнить флоу с более привычной для android разработки имплементацией реактивных стримов - RxJava и интероп между флоу и RxJava;
рассмотреть кейсы применение флоу в андроид разработке.
21 января, 20:00 — 21:30
Лектор: Иван Шалимов
Домашние задания: 1
ДЗ
Flow. ## Перейти с коллбеков на саспенд функции и корутины

1. Сейчас приложение крашится. Поправьте ошибку.
2. Поменяйте реализацию с LiveData на StateFlow
3. В случае если возникнет ошибка в стриме, нужно заэмитить айтем `Result.Error`*

*Создать sealed класс Result. Унаследовать от него классы Success<T>, Error. Использовать эти классы как стейт необходимый для рендеринга/отображени ошибки

### Реализовать функции с использование flow операторов

1. В классе SampleInteractor реализуйте функции task1`-`task4 в соответствии с условиями. Для проверки функций используйте тесты в SampleInteractorTest

https://github.com/Otus-Android/FlowHomework
Clean Architecture
разобраться с концепциями Чистой Архитектуры, Слоистой Архитектуры, Гексагональной Архитектуры, сходствами и различиями между ними;
знать исторические предпосылки к появлению Чистой Архитектуры и по подходам, которые легли в основу Чистой Архитектуры;
знать самые распространенные заблуждения относительно того как работает чистая Архитектура применимо к мобильной разработке;
изучить чистую Архитектуру на примере.
24 января, 20:00 — 21:30
Лектор: Евгений Козочкин
MVC+MVP+MVVM
рассмотреть что такое Presentation паттерны, зачем они нужны, как они живут совместно с концепцией Clean Architecture;
сформировать понимание того в каких условиях и с какой целью эти паттерны появились, какие проблемы они решают, как подойти к решению вопроса о том какой паттерн использовать для своего приложения;
рассмотреть на примеры реализации паттернов MVP и MVVM с разборов различных вариантов их реализации;
разобрать различия между MVP и MVVM и то какие шаги необходимо сделать чтобы превратить MVP в MVVM;
отойти от парадигмы что один экран - это один набор (View)+(Presenter/ViewModel)+(Model), разбираем различные подходы к построению иерархичных паттернов.
28 января, 20:00 — 21:30
Лектор: Евгений Козочкин
MVI
познакомиться с архитектурным паттерном MVI и его реализацией в Android.
31 января, 20:00 — 21:30
Лектор: Максим Качинкин
Dagger2. Часть 1
изучить принципы DI и стандарт JSR-330;
рассмотреть основные структуры, которые предоставляет Dagger2;
рассмотреть Component Dependencies как механизм построения иерархии модулей;
изучить генерируемый Dagger'ом код;
рассмотреть механизм Assisted Injection.
4 февраля, 20:00 — 21:30
Лектор: Антон Казаков
Домашние задания: 1
ДЗ
Dagger2. https://github.com/Otus-Android/Dagger2Homework
Dagger2. Часть 2
рассмотреть принципы DI и стандарт JSR-330;
рассмотреть основные структуры, которые предоставляет Dagger2;
рассмотреть Component Dependencies как механизм построения иерархии модулей;
рассмотреть генерируемый Dagger'ом код;
рассмотреть механизм Assisted Injection.
7 февраля, 20:00 — 21:30
Лектор: Антон Казаков
Hilt
научиться использовать Subcomponents для построения графов компонентов;
рассмотреть Hilt Api и его основные конструкции;
научиться встраивать свои компоненты;
рассмотреть как работает Hilt под капотом.
11 февраля, 20:00 — 21:30
Лектор: Антон Казаков
Multi-module project. 1 часть
обозначить проблемы которые решает многомодульное приложение;
научится проектировать многомодульные приложения с Dagger2 в качестве DI фреймворка;
изучить типы модулей в многомодульном проекте;
изучить способы навигации в многомодульном проекте.
14 февраля, 20:00 — 21:30
Лектор: Антон Казаков
Multi-module project. 2 часть
обозначить проблемы, которые решает многомодульное приложение;
научиться проектировать многомодульные приложения с Dagger2 в качестве DI фреймворка;
рассмотреть типы модулей в многомодульном проекте;
рассмотреть способы навигации в многомодульном проекте.
18 февраля, 20:00 — 21:30
Лектор: Антон Казаков
Консультация по ДЗ
получить ответы на вопросы по проекту, ДЗ и по курсу.
21 февраля, 20:00 — 21:30
Лектор: Антон Казаков
View
Третий модуль посвящен View и всему что с ними связано. Поговорим о View и ViewGroup которые доступны из коробки, погрузимся в их устройство и сравним быстродействие. Рассмотрим инструменты которые предоставляет Android SDK для рисования/рендеринга своих View. Сделаем наше приложение более отзывчивым используя широкие возможности Animator фреймворка. Научимся использовать инструменты для профилирования чтобы быть уверенными что наши вью попадают в ui rendering frame.
Views
изучить процесс измерения и расположения View на экране;
научиться писать свои кастомные View и ViewGroup;
научиться писать свои кастомные LayoutParams.
25 февраля, 20:00 — 21:30
Лектор: Андрей Савченко
Canvas
изучить все наиболее часто используемые инструменты для отрисовки Custom View;
научиться делать обработку касаний и жестов;
научиться анимировать CustomView.
28 февраля, 20:00 — 21:30
Лектор: Андрей Савченко
Домашние задания: 1
ДЗ
Custom View. Задание 1. Реализовать кастом View - график Pie Chart, на котором будем визуализировать траты по категориям:

- Обязательно реализуйте метод onMeasure и учтите все возможные MeasureSpecs
- Реализуйте механизм сохранения состояния внутри View
- Предусмотрите как минимум 10 категорий(цветов) на графике
- В качестве данных для визуализации используйте файл payload.json
- Реализуйте механизм обработки клика на сектор - по клику на часть графика должен срабатывать коллбек, в качестве аргумента - категория на которой был клик евент.

Задание 2. Реализуйте еще одну кастомную View - график детализацию категории, чтобы можно было смотреть траты по одной категории в динамике:
По оси Y сумма трат в день, по оси Х дата(шаг по оси Х = 1 дню)

- Обязательно реализуйте метод onMeasure и учтите все возможные MeasureSpecs
- Реализуйте механизм сохранения состояния внутри View
- В качестве данных для визуализации используйте файл payload.json
- Реализовывать масштабирование/скроллинг/обработку тач евентов не нужно

https://github.com/Otus-Android/HomeWork_07
Animations
изучить Animator Framework;
изучить Animated Vector Drawable;
научиться использовать Shapeshifter.
4 марта, 20:00 — 21:30
Лектор: Артур Бадретдинов
Домашние задания: 1
ДЗ
Animations. Для выполнения домашней работы необходимо добавить анимации в приложение. Анимации можно добавлять любые - это могут быть `fragment/activity transitions, ViewPropertyAnimator/ObjectAnimator` и т п.
RecyclerView
изучить основные компоненты RecyclerView:
ViewHolder;
ItemDecorator;
ItemAnimator;
SnapHelper;
Adapter и др.
изучить возможность реализации swipe to delete и drag n drop механик;
научится работать с большим количеством ViewType.
7 марта, 20:00 — 21:30
Лектор: Андрей Савченко
Ui Profiling
изучить инструментарий для профайлинга UI;
научится находить медленные места в работе приложения и оптимизировать их.
11 марта, 20:00 — 21:30
Лектор: Артур Бадретдинов
Compose
Данный модуль посвящен изучению нового UI фреймворка в андроиде - Compose. Узнаем его особенности и отличия от View фреймворка. Научимся делать приложения на Compose.
Compose. 1 часть
рассмотреть процесс написания compose функций;
рассмотреть жизненный цикл composables;
рассмотреть стейт менеджмент composables;
научиться строить лейауты, используя compose.
21 марта, 20:00 — 21:30
Лектор: Максим Качинкин
Compose. 2 часть
научиться строить лейауты, используя compose;
рассмотреть построение навигации в compose приложении;
рассмотреть механизм эффектов - LaunchedEffect, DisposableEffect;
рассмотреть механизм сompositionLocalProvider;
рассмотреть механизм управления стейтом (derivedStateOf, mutableStateOf, produceState, updatedState).
25 марта, 20:00 — 21:30
Лектор: Максим Качинкин
Домашние задания: 1
ДЗ
Compose - 1. Перевести приложение с активити и фрагментами - на фулл композ с одной активти.
нужно сделать форк от - https://github.com/jumpstreet13/abocha_android_basic_single_activity_fragments и вести работу там
Compose. 3 часть
изучить рисование в compose и создание собственных ViewGroup;
рассмотреть фреймворк анимаций в compose;
рассмотреть Intrinsic measurment в compose;
рассмотреть создание адаптивного ui в compose;
рассмотреть graphicsLayer modifier.
28 марта, 20:00 — 21:30
Лектор: Максим Качинкин
Compose. 4 часть
рассмотреть immutable, stable типы в compose;
рассмотреть сбор метрик composable функций;
рассмотреть процесс дебага количества рекомпозиций и типовые оптимизации.
1 апреля, 20:00 — 21:30
Лектор: Максим Качинкин
Домашние задания: 1
ДЗ
Compose - 2. Создать кастомную вью на Compose, которая будет располагать дочерние элементы со сдвигом по вертикали. По сути аналог Column который сдвигает каждый следующий элемент вправо так, чтобы получилась лесенка. Добавить анимации переходов между экранами к предудущему заданию.
Работа ведется в том форке который вы сделали в рамках прошлого задания.
Консультация по ДЗ
получить ответы на вопросы по проекту, ДЗ и по курсу.
4 апреля, 20:00 — 21:30
Лектор: Максим Качинкин
Data
Здесь мы поговорим о том как получать данные, обрабатывать их и безопасно хранить. Рассмотрим способы получения данных по сети, хранение в persistent и secure хранилищах.
Network
рассмотреть способы сетевого взаимодействия в Android;
рассмотреть библиотеки Gson, Retrofit, Kotlin Serialization Json, OkHttp.
8 апреля, 20:00 — 21:30
Лектор: Максим Качинкин
Persistent storage
рассмотреть различные способы хранения данных в Android.
11 апреля, 20:00 — 21:30
Лектор: Михаил Валуйский
Домашние задания: 1
ДЗ
Источники данных. Для выполнения домашней работы необходимо добавить источник данных. Если ваше приложение получает данные по сети - нужно организовать сетевой слой взаимодействия. Если ваше приложение хранит/получает данные из локальной базы данных, то организуйте слой взаимодействия с БД.




Например, для организации сетевого слоя вы можете использовать `Retrofit, OkHttp, Gson, Moshi` и т.п.




Для организации слоя работы с БД можете использовать любую БД/ORM: `Realm, SQLite, ObjectBobx, Room` и т.п.
Securing storage
разобраться как работать с безопасным хранилище секретных данных;
базовые алгоритмы шифрования и их применение в Android.
15 апреля, 20:00 — 21:30
Лектор: Виталий Раевский
Домашние задания: 1
ДЗ
Securing storage. Задание 1. Реализуйте безопасное хранение auth token:

- Обязательно реализуйте шифрование полученного токена авторизации AES алгоритмом
- Предусмотрите безопасное хранение ключа
- Обеспечьте поддержку API < 23
- Дополнительно
- Используйте максимально безопастный режим шифрование (не ECB)

Задание 2. Реализуйте вход используя биометрию:

- Релизуйте авторизацию в приложение через BiometricPrompt
- Обеспечьте поддержку STRONG и WEAK биометрию
- Дополнительно
- Добавьте возможность включать или отключать авторизацию через биометрию

Тестовый пользователь
1. Email: [email protected]
2. Пароль: otus




Материаы, которыми можно пользоваться:
https://github.com/vitalyraevsky/otus_security


https://developer.android.com/privacy-and-security/keystore
Testing
В данном модуле рассмотрим различные виды тестов. Начнем с основания пирамиды тестирования - unit тестов, плавно перейдем на интеграционные тесты и закончим на вершине - автоматизированными UI тестами которые позволяют облегчить и ускорить ручное тестирование. Поговорим о таких инструментах как JUnit, Mockito, Robolectric, Espresso, UIAutomator и т.д. Подробно разберем на практике нюансы различных видов тестирования, слабые и сильные стороны, их стоимость и процессы написания/выполнения.
Testing. 1 часть
познакомится с различными видами тестов через пирамиду тестирования;
научиться писать unit тесты;
научиться структурировать unit тесты;
познакомиться с популярными фреймворками для написания тестов в Android:
- JUnit
- Mockito
познакомится с различными видами тестовых дублеров;
научиться писать интеграционные тесты;
рассмотреть best practices по написанию тестов.
18 апреля, 20:00 — 21:30
Лектор: Антон Казаков
Домашние задания: 1
ДЗ
Testing. Юнит тесты и интеграционные тесты.. Книги
{: .no_toc }

- [Книга](https://www.manning.com/books/effective-unit-testing) с best practises по проектированию и написанию unit тестов
- [Книга](http://shop.oreilly.com/product/0636920038597) о том как пиcать тест на Spock. По своему опыту не рекомендую использовать Spock в связке с Robolectric, но если вы пишите не под Android, либо вам удалось избавиться от Robolectric, то советую посмотреть на Spock
- [Новое издание](https://www.manning.com/books/junit-in-action-third-edition) книги о написании тестов с JUnit 5

Статьи
{: .no_toc }

- [Памятка](http://wiki.c2.com/?ArrangeActAssert) по arrange-act-assert
- [Блог](https://testing.googleblog.com) от Google о тестировании. Много крутых постов о том как нужно писать тесты на Java/C++. Что выбрать DAMP или DRY, как правильно декомпозировать assertions и т.п. Советую перечитать все что уже есть в блоге и следить за новыми постами
- [Блог](https://martinfowler.com/testing/) Мартина Фаулера. Куча статей о том какие виды тестов существуют, какие тестовые дублеры и где нужно использовать, паттерны написания тестов и многое другое. Новые статьи почти не выходят, но то что уже написано прочитать нужно обязательно
- [Статья](https://docs.gradle.org/current/userguide/java_testing.html) о том как правильно выполнять тесты если вы используйте Gradle

Видео
{: .no_toc }

- [Крутой доклад](https://www.youtube.com/watch?v=EZ05e7EMOLM) про то как правильно готовить TDD
- [TDD в Android](https://www.youtube.com/watch?v=WW5TL7070xU)
Testing. 2 часть
рассмотреть фреймворк Robolectric;
научиться писать шадоуклассы;
научиться тестировать RX цепочки;
научиться тестировать саспенд функции и корутины;
познакомиться с mockwebserver.
22 апреля, 20:00 — 21:30
Лектор: Антон Казаков
UI Tests. 1 часть
познакомиться с библиотекой Espresso;
разобраться с основными классами для работы: ViewActions/ViewAssertions/ViewInteractions;
познакомиться с Idling Resource;
научиться писать свои матчеры;
познакомиться с паттерном PageObject;
научиться писать UI тесты на пользовательские сценарии.
25 апреля, 20:00 — 21:30
Лектор: Антон Казаков
UI Tests. 2 часть
познакомиться с паттерном PageObject;
познакомиться с Kaspresso;
познакомиться с UIAutomator.
29 апреля, 20:00 — 21:30
Лектор: Антон Казаков
Консультация по ДЗ
получить ответы на вопросы по проекту, ДЗ и по курсу.
13 мая, 20:00 — 21:30
Лектор: Антон Казаков
Kotlin Multiplatform
Кроссплатформенная бизнес-логика
разработать кроссплатформенный модуль бизнес-логики и интегрировать его с нативными интерфейсами для Android и Web.
16 мая, 20:00 — 21:30
Кроссплатформенный view с использованием Compose Multiplatform
создать кроссплатформенный view-слой с использованием Compose Multiplatform и реализовать интерфейсы Kotlin для нативных платформ.
20 мая, 20:00 — 21:30
Использование и обзор кроссплатформенных библиотек
изучить и проанализировать использование кроссплатформенных библиотек для разработки сетевых приложений и управления данными с помощью Ktor, SQLDelight и Kodein.
23 мая, 20:00 — 21:30
Build process
Этот модуль посвящен инфраструктуре, сборке и деплою приложений. Поговорим о системах сборки, контейнерах, инструментах для CI/CD. Напишем свой pipeline для сборки/тестирования/деплоя приложения.
R8 & Proguard
научиться писать точные keep рулы;
рассмотреть пайплайн работы R8/Proguard;
научиться работать с аутпутами R8/Proguard.
27 мая, 20:00 — 21:30
Лектор: Антон Казаков
Gradle
познакомиться с основными сущностями Gradle;
рассмотреть жизненный цикл Gradle проектов;
научиться писать свои таски и плагины.
30 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Gradle API. В этой домашней работе мы напишем несколько Gradle тасок для публикации приложения в Google Play:

1. Подключите [Google Play Publisher API](https://developers.google.com/android-publisher)
2. Добавьте Extension для конфигурации публикации приложения: выбор трека, процента раскатки, release notes
3. Реализуйте Gradle Task который будет публиковать APK/AAB приложения в соответствии с конфигами
Optimizing Gradle Builds
познакомиться с профайлерами/бенчмарками, использующимися для детального анализа Gradle билдов;
изучить основные способы оптимизации Gradle билдов через настройки AGP/Gradle/JVM и других инструментов;
изучить общие советы и лучшие практики ускорения Gradle билдов.
3 июня, 20:00 — 21:30
Лектор: Антон Казаков
Android Lint
познакомиться с Lint Api;
научиться писать свои проверки;
научиться тестировать Lint проверки;
познакомиться с абстракциями использующимися для написания проверок: UAST, PSI и т.п.
6 июня, 20:00 — 21:30
Лектор: Антон Казаков
Домашние задания: 1
ДЗ
Android Lint. Задание 1.
Корутины, запущенные на `kotlinx.coroutines.GlobalScope` нужно контролировать вне скоупа класс, в котором они созданы. Контролировать глобальные корутины неудобно, а отсутствие контроля может привести к излишнему использованию ресурсов и утечкам памяти.




Подробнее про `GlobalScope`: https://elizarov.medium.com/the-reason-to-avoid-globalscope-835337445abc




Задание 2.
Частая ошибка при использовании корутин - передача экземпляра `Job`/`SupervisorJob` в корутин билдер. Хоть `Job` и его наследники являются элементами `CoroutineContext`, их использование внутри корутин-билдеров не имеет никакого эффекта, это может сломать ожидаемые обработку ошибок и механизм отмены корутин.




Подробнее:
https://medium.com/androiddevelopers/exceptions-in-coroutines-ce8da1ec060c
https://www.lukaslechner.com/7-common-mistakes-you-might-be-making-when-using-kotlin-coroutines/




Использование еще одного наследника `Job` - `NonCancellable` внутри корутин-билдеров сломает обработку ошибок у всех корутин в иерархии




Подробнее про `NonCancellable`: ****https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html




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




https://kazakovanton.notion.site/Android-Lint-dd3140b5b4c8490883bfe8c8e8e25e24
https://github.com/Otus-Android/Homework_AndroidLint
Docker для Android разработки
рассмотреть юзкейсы применения docker контейнеров в android разработке;
рассмотреть архитектуру docker и его основные механизмы;
рассмотреть основные CLI команды docker клиента;
научиться писать свои Dockerfile, собирать из них image и пушить их на DockerHub.
10 июня, 20:00 — 21:30
Лектор: Антон Казаков
Jenkins
познакомиться с Jenkins и его DSL;
построить пайплайн для проекта;
научиться делегировать сборку проекта jenkins и настраивать триггеры;
поработать с Jenkins в Docker контейнере;
построить инфраструктуру из мастера и слейвов.
13 июня, 20:00 — 21:30
Лектор: Виталий Раевский
Домашние задания: 1
ДЗ
CI/CD. Задание 1.
Начнем с написания Dockerfile, имейдж собранный на его основе, в дальнейшем будет использоваться как билд-агент Jenkins’a для сборки приложения.




Задание 2.
В этом задании нужно реализовать Jenkinsfile который будет выполнять типичный флоу для сборки приложения в зависимости от source ветки.




Задание 3.
Хорошая практика запускать ежедневные ночные билды с https://github.com/gradle/gradle-profiler, чтобы видеть как меняется процесс сборки в динамике и при обнаружении аномалий быстро устранять их.




https://kazakovanton.notion.site/CI-CD-1a5dc5415d3d4bc3a9d13642601709b5
App Monitoring
изучить процесс деплоя приложения в различные системы: Firebase App Distribution, AppCenter;
изучить процесс подписки apk файла;
рассмотреть особенности сборки APK и AAB файлов;
изучить процесс деплоя приложения в Google Play, AppGallery.
17 июня, 20:00 — 21:30
Лектор: Антон Казаков
Консультация по ДЗ
получить ответы на вопросы по проекту, ДЗ и по курсу.
20 июня, 20:00 — 21:30
Лектор: Антон Казаков
Проектная работа
Этот модуль посвящен доработке и защите выпускных работ. Работа над проектом начинается с самого первого модуля.
Консультация по проектам и домашним заданиям
получить ответы на вопросы по проекту, ДЗ и по курсу.
24 июня, 20:00 — 21:30
Лектор: Антон Казаков
Домашние задания: 1
ДЗ
Проект. Сдать ссылку на репозиторий курсового проекта.
В репозитории обязательно должен быть заполнен файл Readme.md с описание проекта.
Защита проектных работ
защитить проект и получить рекомендации экспертов.
27 июня, 20:00 — 21:30
Лектор: Антон Казаков

Преподаватель

Антон Казаков
Руководитель направления Android-разработки в Золотое яблоко
Окончил магистратуру Казанского авиационного института по специальности «Радиотехника и телекоммуникации».

В Android-разработке с 2013 года. Разрабатывал приложения в небольших стартапах и огромных компаниях, работал в «СберТехе», руководил Android-разработкой в компании «Технократия» и «Альфа-Банке».

На текущий момент руководит Android-разработкой в «Золотое яблоко» (goldapple.ru). Оптимизирует процессы разработки и поставки фич, работает над тулингом, чтобы облегчить жизнь разработчикам.

Помимо Android-разработки, интересуется бэкенд-разработкой и DevOps-практиками. Любит решать алгоритмические задачи.
Преподаватель курсов:
Android Developer. Professional
Черная пятница в Otus! ⚡️
Скидка 15% на все курсы до 20.11 →