Ну, вы знаете, на днях закончился Google I/O. Мне не удалось на нём побывать, но иметь материал где-то на подкорке хочется. Я думаю, что не один в таком положении. Поэтому я буду потихоньку смотреть записи всех сессий, что мне показались интересными, и закидывать сюда поинты из каждого видео, которые меня заинтересуют. Не в каждый нюанс я буду погружаться достаточно глубоко, поэтому, если где-то ошибусь, feel free to написать мне, что я мудак и объяснить, в чём именно :) Итак, первый пошёл…
Есть проблема. Я её, например, ощущаю на себе: все приложения соответствуют Material Design и почти все выглядят одинаково скучно. Размывается индивидуальность бренда. На выбор компании остаются только цвет да иконки (не всегда, но часто). И, хотя Google-guys с самого начала говорили, что material - это рекомендация, а не жёсткие рамки, почти все всё равно лепили по material-лекалам одно и то же безобразие. Ну, Google поняли, что имеют дело со стадом хомячков, и решили добавить нам степеней свободы. Посредством Material Theming нам дают свободу (и тулзы, чтобы эту свободу держать в узде - сочетай цвета, мать твою) в выборе цветов, шрифтов и форм для элементов на экране.
Появился Sketch-плагин, который позволит переложить работу дизайнера в стили для Material Components - пачки написанных для нас View.
Ещё мне очень понравился момент с формой контролов (см. картинку выше), который даёт дополнительное понимание z-level’а компонентов.
#talk #material #design
https://youtu.be/3VUMl_l-_fI
Появился Sketch-плагин, который позволит переложить работу дизайнера в стили для Material Components - пачки написанных для нас View.
Ещё мне очень понравился момент с формой контролов (см. картинку выше), который даёт дополнительное понимание z-level’а компонентов.
#talk #material #design
https://youtu.be/3VUMl_l-_fI
YouTube
Customize Material Components for your product (Google I/O '18)
Take advantage of Material’s new expressiveness and adaptability by learning how to customize Material Design Components and quickly build beautiful products for Android, iOS, web, and Flutter.
Rate this session by signing-in on the I/O website here → h…
Rate this session by signing-in on the I/O website here → h…
Выступление Chet Haase и Romain Guy. Тут ты должен был стать заинтригован.
В докладе описывается весь Android Rendering Pipeline, но поскольку вместить это в 40 минут не получится, доклад выглядит как быстрое набрасывание названий разных классов и модулей. Тем не менее, вдумчиво его посмотреть я бы скорее советовал.
Наброшу несколько названий из доклада, чтобы ты понимал, о чём речь: Choreographer, VSync, UI Thread, RenderThread, SurfaceFlinger, BufferQueue, Hardware Composer (HWC).
Теперь несколько интересных фактов из сессии:
1. Начиная с Android Oreo можно использовать
2. Кусочек хинта (почему так - см. видео) - чем меньше
3. Метод
4. “RecyclerView is now able to do prefetching of items ahead of time”
5. Graphika app on Github - пачка примеров с использованием SurfaceFlinger, Surface, SurfaceView, media encoder, virtual displays.
6.
Подробности обо всём этом найдёшь по ссылке.
#rendering #window #surface #gpu
https://youtu.be/zdQRIYOST64
В докладе описывается весь Android Rendering Pipeline, но поскольку вместить это в 40 минут не получится, доклад выглядит как быстрое набрасывание названий разных классов и модулей. Тем не менее, вдумчиво его посмотреть я бы скорее советовал.
Наброшу несколько названий из доклада, чтобы ты понимал, о чём речь: Choreographer, VSync, UI Thread, RenderThread, SurfaceFlinger, BufferQueue, Hardware Composer (HWC).
Теперь несколько интересных фактов из сессии:
1. Начиная с Android Oreo можно использовать
Bitmap.Config.HARDWARE, чтобы аллоцировать Bitmap напрямую на GPU и не тратить время на копирование. Недостаток: если серьёзно разойтись, можно получить пачку совершенно невнятных крашей из глубин фреймворка2. Кусочек хинта (почему так - см. видео) - чем меньше
Window объектов на экране, тем лучше3. Метод
invalidate(left, top, right, bottom) можно больше не дрочить - система уже умеет неплохо оптимизировать этот момент, а багов от его использования уйма4. “RecyclerView is now able to do prefetching of items ahead of time”
5. Graphika app on Github - пачка примеров с использованием SurfaceFlinger, Surface, SurfaceView, media encoder, virtual displays.
6.
adb shell dumpsys SurfaceFlinger лучше выполнять, когда что-то анимируется/меняется на экране, иначе можно получить не совсем точные данные из-за дополнительных оптимизацийПодробности обо всём этом найдёшь по ссылке.
#rendering #window #surface #gpu
https://youtu.be/zdQRIYOST64
YouTube
Drawn out: How Android renders (Google I/O '18)
Come learn how Android turns your app's UI into pixels on the screen. Understanding how things work under the hood can help you figure out how to get the best performance for your applications.
Rate this session by signing-in on the I/O website here → h…
Rate this session by signing-in on the I/O website here → h…
В видео по ссылке рассказывают, что нового в ART в Android P:
1. Оптимизации компилятора для Kotlin (например, inline null-checks для non-null параметров)
2. CompactDex - штука, которая почикает Dex-файлы прямо на девайсе. Умеет: deduplicate and shrink code items, deduplicate multidex data, incorporate profile based Dex layout optimization (сложить методы, которые дёргаются часто или на старте в одно место в памяти)
3. На Nougat появились code profiles - во время выполнения аппа проверяется, какой код и когда выполняется и применяются соответствующие оптимизации. На Android P пошли дальше: появляется cloud profiles - данные о выполнении вашего кода загружаются в облако и оттуда прилетают другим юзерам. То есть если на Nougat чем чаще апп использовался, тем лучше работал, то на Android P ребята из Google хотят добиться оптимальной производительности сразу после установки, как раз благодаря cloud profiles. А теперь гениальная идея из их доклада: берём 1%-2% юзеров из alpha и beta каналов, они используют апп, а потом на всех юзеров уже раскатывается апп, для которого собраны все profiles и апп сразу работает оптимально. Любо!
#kotlin #art #performance #optimize
https://youtu.be/Yi9-BqUxsno
1. Оптимизации компилятора для Kotlin (например, inline null-checks для non-null параметров)
2. CompactDex - штука, которая почикает Dex-файлы прямо на девайсе. Умеет: deduplicate and shrink code items, deduplicate multidex data, incorporate profile based Dex layout optimization (сложить методы, которые дёргаются часто или на старте в одно место в памяти)
3. На Nougat появились code profiles - во время выполнения аппа проверяется, какой код и когда выполняется и применяются соответствующие оптимизации. На Android P пошли дальше: появляется cloud profiles - данные о выполнении вашего кода загружаются в облако и оттуда прилетают другим юзерам. То есть если на Nougat чем чаще апп использовался, тем лучше работал, то на Android P ребята из Google хотят добиться оптимальной производительности сразу после установки, как раз благодаря cloud profiles. А теперь гениальная идея из их доклада: берём 1%-2% юзеров из alpha и beta каналов, они используют апп, а потом на всех юзеров уже раскатывается апп, для которого собраны все profiles и апп сразу работает оптимально. Любо!
#kotlin #art #performance #optimize
https://youtu.be/Yi9-BqUxsno
YouTube
What's new in Android Runtime (Google I/O '18)
If you use the Java or Kotlin programming languages to develop on Android, Android Runtime (ART) is what ensures your code runs quickly and efficiently. Learn more about how ART makes it easier to write a great Android app with improvements in debugging and…
Доклад про то, что нового в Android development tools. Отмечу следующее:
- Android Studio 3.2:
* What’s new window
* App bundle generation
* Dynamic features support
* “Sessions” window in profiler
* Energy profiler
* AndroidX refactoring - перевести всё на новую версию support-библиотек. Ещё появился Jetifier: “converts legacy Maven artefacts to the new AndroidX namespace and caches those for new builds”
* Navigation library и UI для неё - позволяет выстроить всю навигацию одним xml, в том числе умеет добавлять анимации переходам, позволяет удобно прописать deeplinks и даже вроде бы позволяет разрулить передачу аргументов в Activity/Fragment
* Layout Editor - появляются всякие кнопки и меню для быстрого добавления sample data в design-режиме
* Запустили студию на Pixel Chromebook (no ADB yet - “you can upload straight to the Play Store and hope for the best”)
* D8 - new default Dexer & R8 - new default optimizer
* Бонус: показали фичу, которая в разработке (сказали, выйдет наверное даже не в 3.3) и использует следующую версию ConstraintLayout - работа с transition анимациями прямо из UI.
- Emulator:
* Save and replay snapshots
* Better camera to support AR apps
Ну, как-то так.
#studio #emulator #adt
https://youtu.be/WxAZk7A7OkM
- Android Studio 3.2:
* What’s new window
* App bundle generation
* Dynamic features support
* “Sessions” window in profiler
* Energy profiler
* AndroidX refactoring - перевести всё на новую версию support-библиотек. Ещё появился Jetifier: “converts legacy Maven artefacts to the new AndroidX namespace and caches those for new builds”
* Navigation library и UI для неё - позволяет выстроить всю навигацию одним xml, в том числе умеет добавлять анимации переходам, позволяет удобно прописать deeplinks и даже вроде бы позволяет разрулить передачу аргументов в Activity/Fragment
* Layout Editor - появляются всякие кнопки и меню для быстрого добавления sample data в design-режиме
* Запустили студию на Pixel Chromebook (no ADB yet - “you can upload straight to the Play Store and hope for the best”)
* D8 - new default Dexer & R8 - new default optimizer
* Бонус: показали фичу, которая в разработке (сказали, выйдет наверное даже не в 3.3) и использует следующую версию ConstraintLayout - работа с transition анимациями прямо из UI.
- Emulator:
* Save and replay snapshots
* Better camera to support AR apps
Ну, как-то так.
#studio #emulator #adt
https://youtu.be/WxAZk7A7OkM
YouTube
What's new in Android development tools (Google I/O '18)
An overview of all the recent features in Android Studio for Android app developers. The session will include demos and a tour de force presentation of relevant features that will accelerate developers' workflow on the latest Android APIs.
Rate this session…
Rate this session…
Из этого выступления я выпишу не очень много поинтов, но доклад интересный, сходите посмотрите. А поинты там такие:
- Well Aged Advice:
* Prioritise efficiency
* Avoid WakeLocks
* Don’t use undocumented APIs
* Store strings and values as resources
* Avoid transmitting/storing contacts & location
- Android Fundamentals:
* Java language syntax -> Kotlin
* UI logic for background processing -> ViewModels
* Services for background processing -> Work Manager
* Monitor system events with Receivers -> Work Manager
* Content Providers for database access -> Room
Бонус: в Android P не будет вылезать ANR-диалог, апп просто будет падать.
#tips #anr
https://youtu.be/eHjHlujp3Tg
- Well Aged Advice:
* Prioritise efficiency
* Avoid WakeLocks
* Don’t use undocumented APIs
* Store strings and values as resources
* Avoid transmitting/storing contacts & location
- Android Fundamentals:
* Java language syntax -> Kotlin
* UI logic for background processing -> ViewModels
* Services for background processing -> Work Manager
* Monitor system events with Receivers -> Work Manager
* Content Providers for database access -> Room
Бонус: в Android P не будет вылезать ANR-диалог, апп просто будет падать.
#tips #anr
https://youtu.be/eHjHlujp3Tg
YouTube
Protips: A fresh look at advanced topics for Android experts (Google I/O '18)
It's been 10 years since the first Android device launch, and even experienced Android developers are still using tools, APIs, and best-practices from 2008. The return of Android Protips brings you up-to-speed on modern solutions to Android development challenges…
Что-то из нового Android:
- Battery:
* App standby buckets: использование аппа определяет, как и когда он запустить свои jobs
* Background restrictions: если апп ведёт себя непорядочно, можно ему к чёртовой матери всё запретить
- Background input & privacy:
* Микрофон в фоне - нельзя
* Камера в фоне - нельзя
* Разные сенсоры - вроде бы будут возвращать нулевые значения - можно сказать, тоже нельзя
- Background text measurement:
* Измерять текст дорого, а делать это приходится много. Прозвучала цифра: 80%-90% всего measure-layout-draw цикла приходится на измерение текста.
* Поэтому теперь его можно делать в фоне -
- Notifications:
* inline images & stickers
* можно показать картинки участников чата, например
* smart reply UI (а-ля чатбот)
* no more “app is using battery” notification
- Deprecation policy:
* Август 2018 - новые аппы только с targetSdk 26
* Ноябрь 2018 - обновления аппов только с targetSdk 26
* Август 2019 - те, кто используют нативные куски, обязаны давать 64-bit ABI (32-bit опционально)
Это только то, за что зацепился глаз. В докладе ещё больше, но тратить время не советовал бы :)
#androidp #background #notifications
https://youtu.be/eMHsnvhcf78
- Battery:
* App standby buckets: использование аппа определяет, как и когда он запустить свои jobs
* Background restrictions: если апп ведёт себя непорядочно, можно ему к чёртовой матери всё запретить
- Background input & privacy:
* Микрофон в фоне - нельзя
* Камера в фоне - нельзя
* Разные сенсоры - вроде бы будут возвращать нулевые значения - можно сказать, тоже нельзя
- Background text measurement:
* Измерять текст дорого, а делать это приходится много. Прозвучала цифра: 80%-90% всего measure-layout-draw цикла приходится на измерение текста.
* Поэтому теперь его можно делать в фоне -
PrecomputedText.create(…)- Notifications:
* inline images & stickers
* можно показать картинки участников чата, например
* smart reply UI (а-ля чатбот)
* no more “app is using battery” notification
- Deprecation policy:
* Август 2018 - новые аппы только с targetSdk 26
* Ноябрь 2018 - обновления аппов только с targetSdk 26
* Август 2019 - те, кто используют нативные куски, обязаны давать 64-bit ABI (32-bit опционально)
Это только то, за что зацепился глаз. В докладе ещё больше, но тратить время не советовал бы :)
#androidp #background #notifications
https://youtu.be/eMHsnvhcf78
YouTube
What's new in Android (Google I/O '18)
An overview of the latest developer-facing features in the Android platform and other new and exciting developments.
Rate this session by signing-in on the I/O website here → https://goo.gl/oEa9Hr
Watch more videos about Jetpack → https://goo.gl/kw8LPv…
Rate this session by signing-in on the I/O website here → https://goo.gl/oEa9Hr
Watch more videos about Jetpack → https://goo.gl/kw8LPv…
Доклад, в котором по шагам проходится, как работают штуки типа ProGuard и R8, как к ним пишутся keep-правила и что делать, когда после включения
#proguard #r8 #minification
https://youtu.be/x9T5EYE-QWQ
minifyEnabled true всё сломалось. В целом, не советую тратить время, если всё это уже знаешь.#proguard #r8 #minification
https://youtu.be/x9T5EYE-QWQ
YouTube
Effective ProGuard keep rules for smaller applications (Google I/O '18)
ProGuard keep rules are the super power in reducing application size. Correctly specified, they allow tools to remove unneeded code and obfuscate applications. But what exactly do these rules mean? This session provides an answer by deep diving into what…
Нашёл шпаргалку (уверен, не я один постоянно это забываю) про `FontMetrics`. И да, как всегда Android Framework во всей красе - baseline считай сам :)
#cheatsheet #font #text
#cheatsheet #font #text
Статья-инструкция к решению задач на dynamic programming и memoization. Интересно, посмотрите.
#algorithm #dynamicprogramming #memoization
http://blog.refdash.com/dynamic-programming-tutorial-example/
#algorithm #dynamicprogramming #memoization
http://blog.refdash.com/dynamic-programming-tutorial-example/
Пачка хаков при работе с числами на уровне битов (сдвиги, включить-выключить битик и всё такое прочее). Статья классная, жалко только, что расписано всё в отрыве от применения. А ведь запекание состояния компонента (какого-нибудь View, например), которому нужна куча bool-флагов, в одно чиселко в определённых случаях может резко упростить и сократить код.
#hack #bit
http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/
#hack #bit
http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/
catonmat.net
Introduction to Low Level Bit Hacks
I decided to write an article about a thing that is second nature to embedded systems programmers – low level bit hacks. Bit hacks are ingenious little programming tricks that manipulate integers in a smart and efficient manner. Instead of performing operations…
Так, а если кто-то тут по битовым операциям хочет угореть, то @kenrube прислал ссылку на ещё более обширный сборник.
#hack #bit
http://graphics.stanford.edu/~seander/bithacks.html
#hack #bit
http://graphics.stanford.edu/~seander/bithacks.html
Статья про разницу между разными подходами к IO: blocking, non-blocking, multiplexed и async.
#io #multiplexed #async
https://www.rubberducking.com/2018/05/the-various-kinds-of-io-blocking-non.html
#io #multiplexed #async
https://www.rubberducking.com/2018/05/the-various-kinds-of-io-blocking-non.html
Rubberducking
The Various Kinds of IO - Blocking, Non-blocking, Multiplexed and Async.
A blog where I write down my thoughts, ideas and notions, as an exercise to cement them in my memory and improve on their concepts.
Мы тут недавно вспомнили, что Google обещали выложить исходники Architecture Components, но как-то всё это дело прошло мимо нас и мы их не видели. Так вот, они всё-таки есть, может и вам пригодится.
-
-
- Paging: https://android.googlesource.com/platform/frameworks/support/+/master/paging/common/src/main/java/android/arch/paging
- Room: https://android.googlesource.com/platform/frameworks/support/+/master/room/common/src/main/java/android/arch/persistence/room
#source #architecture #components
-
Lifecycle, LifecycleOwner, LifecycleObserver и прочее разное: https://android.googlesource.com/platform/frameworks/support/+/master/lifecycle/common/src/main/java/android/arch/lifecycle-
ViewModel, LiveData и т.п.: https://android.googlesource.com/platform/frameworks/support/+/master/lifecycle/extensions/src/main/java/android/arch/lifecycle- Paging: https://android.googlesource.com/platform/frameworks/support/+/master/paging/common/src/main/java/android/arch/paging
- Room: https://android.googlesource.com/platform/frameworks/support/+/master/room/common/src/main/java/android/arch/persistence/room
#source #architecture #components
Доклад про новое в Android Support Library.
-
-
-
-
-
- Material components:
* Обновили
*
*
#supportlib #view #material #talk
https://youtu.be/jdKUm8tGogw
-
RecyclerView Selection Library - штука, помогающая реализовать selection над списком. Умеет в selection жесты как в Google Photos, что очень даже неплохо. Хотя, это и не очень-то новость, вроде бы про неё я уже давно что-то слышал-
ListAdapter - какая-то странная поделка, упрощающая использование DiffUtil в меняющихся списках, но, судя по коду, который показали, она не то чтобы сильно сокращает код, который придётся написать + ограничивает ваш Adapter на один List, а этого не всегда достаточно-
androidx.webkit - позволяет использовать WebView, обновляемый через Play Store, на старых API-
CustomTab переезжает в androidx.browser + появляется возможность воткнуться в контекстное меню вашей CustomTab и добавить своё действие-
HeifWriter - позволяет эффективно записать YUV byte buffers, Surface и Bitmap в файл, но пока только на API 28+. Обещают добавить backport- Material components:
* Обновили
TextInputLayout - теперь он с рамкой и вроде бы умеет добавлять кнопку “Очистить”*
Button теперь можно по-разному закруглять и добавлять в них иконки*
BottomAppBar - по сути тот же AppBar, только снизу#supportlib #view #material #talk
https://youtu.be/jdKUm8tGogw
YouTube
Android Jetpack: What’s new in Android Support Library (Google I/O 2018)
Get to know AndroidX -- the new name and packaging for the Android Support Library -- the foundation for Android libraries in Jetpack, and learn about features available in the 1.0.0 release.
Rate this session by signing-in on the I/O website here → htt…
Rate this session by signing-in on the I/O website here → htt…
Очень насыщенный доклад про рисование текста. Пока что из всех Google I/O докладов мне встретилось два настолько насыщенных доклада - этот и про Android rendering pipeline, о нём я писал выше.
Сразу порекомендую посмотреть это видео всем, кому приходится много использовать
Ну и основные highlights:
- Text stack в Android разбит на две части - Java и Native (сразу обратим внимание, что Android контролирует только три верхних уровня - всю Java часть и верхний уровень из Native - Minikin).
* Верхний уровень в Java части - это
* Native часть куда более насыщенная, пройдёмся сверху вниз: Minikin - библиотека для text measurement, line breaking и hyphenation (перенос слов), ICU - работа с Unicode, HarfBuzz - text shaping, FreeType - генерирует bitmaps для всех gliffs, Skia - основной графический движок системы
- Начиная с Android L у нас есть System Wide Word Layout LRU Cache - кэширует до 5000 слов, чтобы переиспользовать результаты обсчётов, когда это же слово снова нужно будет отрисовать
- В Android P ускорили использование simple break strategy вместе с normal или full hyphenation frequency - в детали углубляться не буду, подробности можно найти в видео
- Если с сервака, например, нам приходит строчка, в которой намешано несколько языков, и мы знаем, где какой язык используется, то для правильного переноса слов/строк текста нужно использовать
-
- У нас есть три класса:
- Ещё я увидел интересную фишку с
- Если нужно отрисовать какой-то очень длинный текст, не нужно его целиком запихивать в
- Ну и новая фишка в Android P -
За сим откланиваюсь.
#text #span #textview #talk
https://youtu.be/x-FcOX6ErdI
Сразу порекомендую посмотреть это видео всем, кому приходится много использовать
Span, особенно внутри RecyclerView.Ну и основные highlights:
- Text stack в Android разбит на две части - Java и Native (сразу обратим внимание, что Android контролирует только три верхних уровня - всю Java часть и верхний уровень из Native - Minikin).
* Верхний уровень в Java части - это
TextView и EditText, затем идут Layout, Paint и Canvas* Native часть куда более насыщенная, пройдёмся сверху вниз: Minikin - библиотека для text measurement, line breaking и hyphenation (перенос слов), ICU - работа с Unicode, HarfBuzz - text shaping, FreeType - генерирует bitmaps для всех gliffs, Skia - основной графический движок системы
- Начиная с Android L у нас есть System Wide Word Layout LRU Cache - кэширует до 5000 слов, чтобы переиспользовать результаты обсчётов, когда это же слово снова нужно будет отрисовать
- В Android P ускорили использование simple break strategy вместе с normal или full hyphenation frequency - в детали углубляться не буду, подробности можно найти в видео
- Если с сервака, например, нам приходит строчка, в которой намешано несколько языков, и мы знаем, где какой язык используется, то для правильного переноса слов/строк текста нужно использовать
LocaleSpan-
Span делятся на Paragraph spans (применяются на параграф, очевидно) и Character spans (применяются посимвольно, тоже очевидно). В свою очередь Character spans делятся на Appearance affecting (после применения нужно сделать redraw) и Metric affecting (после применения нужно сделать и remeasure, и redraw). Про написание своих Span в докладе тоже есть кусок, поэтому посмотрите, если нужно- У нас есть три класса:
SpannedString (нельзя mutable text, нельзя mutable markup), SpannableString (нельзя mutable text, можно mutable markup) и SpannableStringBuilder (можно mutable text, можно mutable markup). В докладе показали сравнение производительности SpannableString и SpannableStringBuilder (они по-разному устроены внутри: один на массиве, второй на деревьях), результаты следующие: до 250 Span они ведут себя одинаково, дальше SpannableStringBuilder выигрывает. Ну, вы поняли, что использовать :)- Ещё я увидел интересную фишку с
<annotaion/> тэгом внутри strings.xml. Допустим, у вас есть какая-то строка, переведённая на несколько языков. Вам нужно применить какой-то Span на определённое слово в этой строке. Но в одном языке это слово стоит в одном месте, а в другом языке - в другом. Вот ровно эту проблему решает <annotation/> тэг. Если такая задача перед вами стоит - сходите посмотрите.- Если нужно отрисовать какой-то очень длинный текст, не нужно его целиком запихивать в
TextView. Разбейте на параграфы и используйте RecyclerView.- Ну и новая фишка в Android P -
Magnifier. Это такая экранная лупа, которая поможет с выделением текста. Для TextView и EditText она будет работать из коробки, но и к своим custom View её можно прикрутить.За сим откланиваюсь.
#text #span #textview #talk
https://youtu.be/x-FcOX6ErdI
YouTube
Best practices for text on Android (Google I/O '18)
This session will cover common usages of text in Android apps, and common pitfalls developers fall into that can be avoided. Topics to be covered include styling with spans, working with editable text, measuring your own text, when and how to use different…
Новость, которая будет интересна всем Google Developer Experts (GDE) и тем, кто планирует получить этот статус. Каждый GDE теперь может получить бесплатную лицензию на все продукты JetBrains.
#gde #google #intellij #jetbrains
https://www.jetbrains.com/shop/eform/devrecognition
#gde #google #intellij #jetbrains
https://www.jetbrains.com/shop/eform/devrecognition
Неплохая статья в блоге Karumi с некоторыми советами/фишками по Kotlin. Многое из того, что там есть, довольно очевидно и баян. Но есть и очень приятные вещи типа
#kotlin #tips
http://blog.karumi.com/kotlin-android-development-6-months-into-it/
.exhaustive для when. Советую посмотреть.#kotlin #tips
http://blog.karumi.com/kotlin-android-development-6-months-into-it/
Karumi Blog
Kotlin Android development - 6 months into it
Tips and tricks after 6 months working with Kotlin for Android - Karumi