Есть ли в Android Studio 3.0 что-то революционно новое? В чем основной недостаток Java 9 и каковы плюсы Kotlin? Про это, а также про профайлеры, компиляторы, IoT и многое другое — в нашем интервью с Денисом Неклюдовым — первым разработчиком из России, получившим статус GDE.
Денис Неклюдов nekdenis — первый российский разработчик, получивший статус Google Developer Expert. За его плечами богатый опыт разработки приложений для социальных сетей, финансовых организаций, транспортных компаний и рекламных сетей и агентств. Принимал участие в большом количестве проектов, работая над архитектурой, UI и UX. Выступает на различных конференциях, ведет курсы и блоги, в том числе и на Хабре.
Мы расспросили его о различных особенностях разработки под Android Oreo.
— В целом не секрет, что недавний релиз Android Studio 3.0 — это некая мини-революция в мире Android-разработчиков. Для многих он означает поддержку подмножества функций Java 8 (пусть не до конца, но это обещают исправить в следующих релизах). Какое подмножество Java 8 теперь доступно из коробки и есть ли зависимости от API level? С чем это связано? Как минимум в документации указано, что Stream’мы или функциональные интерфейсы доступны в андроиде с API level 24 и выше, и нам интересно мнение опытных разработчиков по этому поводу.
Денис Неклюдов: Действительно, неспроста версию подняли до третьей. Мажорный релиз студии – это отличный повод попробовать что-то новое. Я являюсь рьяным сторонником перехода Android-разработки на Kotlin, поэтому в первую очередь рекомендую обратить внимание на улучшенную поддержку языка от JetBrains в новой Android Studio. А вот «десахароз» лямбд, методреференсов дефолтных методов и прочих плюшек Java 8 я не пробовал. Подробный список фич представлен на сайте. Но, действительно, стримы недоступны. Почему они их не портировали, хороший вопрос. Однако уже сейчас можно на свой страх и риск воспользоваться сторонними портами, например этим или этим.
— Официальная поддержка Google языка Kotlin дала в целом какие-то плоды? Что изменилось, на ваш взгляд?
Денис Неклюдов: Изменилось взаимодействие Google с JetBrains, что позволяет им более тесно работать над поддержкой Kotlin. В том числе начались работы по формированию Kotlin Foundation, в рамках которой будут решаться вопросы будущего языка и его поддержки. Для тех, кто жил с плагином в IDEA или AS, с точки зрения новых возможностей мало что поменялось. Зато для тех разработчиков, которые боялись переходить на Kotlin или попробовать его, официальная поддержка стала символом того, что это не просто какой-то эксперимент и удел группы гиков, а официально поддержанный язык. И да, теперь нужно помнить про Йода Нотацию (печально улыбается)
— Kotlin — новый язык и новая технология. Один из самых частых вопросов от бизнеса — что делать, если обнаружатся проблемы. Насколько свободно разработчики относятся к принятию pull requests от других организаций? Не придется ли ждать десять лет, пока на твой коммит вообще взглянут? Насколько это вообще возможно — в смысле общего качества библиотек, компилятора и так далее — словом, порога входа для нового разработчика?
Денис Неклюдов: Kotlin относительно Java и тем более C++ молодой парнишка, но ему уже семь лет и он почти два года находится в релизе. Так что он достаточно стабилен для серьезного внедрения в продакшн. Поддержка языка настолько хороша, что вам не нужно делать PR — достаточно завести issue в багтрекере, и ребята из JetBrains починят аргументированный баг в ближайшей сборке.
Для разработчиков, незнакомых с языком, порог входа очень низкий. Язык похож как на Java, так и на многие современные языки, в том числе Swift. Для первого знакомства мы всегда рекомендуем официальные обучающие материалы – они быстро и доходчиво введут вас в курс дела.
— Недавно вышла Java 9. Как думаешь, как именно это повлияет на Android-разработку и повлияет ли вообще? Может оказаться так, что библиотеки обновятся до девятки, и мы снова потеряем возможность их использовать?
Денис Неклюдов: Я думаю, что переход в сторону Kotlin — одно из решений проблемы отставания (в плане развития) Android от Java. Велик процент устройств, где мы не можем исполнять даже Java 8 код. А благодаря Kotlin разработчики могут использовать многие современные языковые примочки, компилируя их в байткод от Java 7. Мир библиотек для Android всегда жил на Java 7, и никто не портирует их на Java 8. Отличный пример тому — супер-популярная в мире Android RxJava 2 и ее Java 8 альтернатива Project Reactor, которой никто на Android не пользуется, в том числе поэтому сейчас оба проекта (Kotlin и RxJava2) активно поддерживаются и развиваются.
— Что ты вообще думаешь по поводу фрагментации платформы, учитывая возросшее количество языков и их версий. Какая стратегия поддержки старых версий и сегментирования по поколениям устройств является наиболее разумной?
Денис Неклюдов: Для меня мало что меняется с годами. Многие новые фичи SDK, к счастью, бекпортируются в Support Library, а остальное можно поддержать, проверяя версию Android, на которой сейчас запущено приложение. В данный момент актуально поддерживать минимальную версию Android 4.1. И сосредотачиваться на фичах платформы — начиная с Android 5. Хотя будь у меня много денег, я бы, подобно Facebook, имел две версии приложения — мощную со всеми фичами, для новых платформ, и простую, мало потребляющую трафик и батарею, с минимальным набором фич, зато работающую на китайской пластмассовой погремушке за полторы тысячи рублей.
— Android Profiler — что тебе в нем особенно нравится и какие преимущества можно отметить?
Денис Неклюдов: Мне очень нравится смотреть сетевую активность приложения в нем, забыл про Stetho. Еще это отличный инструмент для того, чтобы посмотреть на аллокации памяти: кто и в каком объеме их осуществляет. Для анализа работы CPU нет ничего лучше systrace, но быстро посмотреть, не выходя из Studio, можно и с помощью профайлера.
— Что представляет собой Android Profiler изнутри? Это штука, привязанная к Android Studio, или студия просто вызывает API какой-то конкретной подсистемы? Если там есть какой-то бэкенд, его можно было бы использовать для автоматического тестирования или чего-то в этом роде. Сейчас есть очень большая проблема в выстраивании девопс-тулчейнов для мобильных платформ, но мало кому понятно, как правильно это делать.
Денис Неклюдов: Profiler является частью Android Studio и не имеет headless API, чтобы использовать его без UI. Да и едва ли это нужно. Он создан для поиска утечек памяти, анализа загрузки процессора и просмотра сетевой активности человеком. Не думаю, что это та часть процесса, которую нужно автоматизировать на CI. Если помечтать, то было бы прекрасно получать от билд-сервера отчеты по утечкам и неоптимальным алгоритмам, но сейчас это утопия из далекого будущего.
— У разработчиков десктопной Java есть специальная дисциплина – написание и отладка профайлеров. Стоит ли нам тоже иметь десять разных профайлеров для Android? В каких ситуациях стоит использовать Android Profiler, а где лучше воздержаться? Всегда ли ему стоит верить?
Денис Неклюдов: Если быть честным: мобильный мир так быстро меняется, что не каждый бизнес может себе позволить инженеров, которые будут заниматься дотошным профайлингом приложения. Если мощности профайлера не хватает для изучения трейсов, то мощности systrace уж точно должно хватить. На этот счет есть отличный доклад, а точнее два.
— Поддержка Instant Apps — какое основное преимущество от этой технологии? Какая польза разработчикам и конечным пользователям? Есть ли ограничения на функциональность при использовании этой технологии?
Денис Неклюдов: Как только Instant apps станут стабильными, работающими везде и с безбажной поддержкой со стороны инструментов разработки и системы сборки, так настанет новая эра – приложений без установки. Вы только представьте, что вы, подобно веб-страницам, подгружаете приложение экран за экраном, только то, что вам нужно.
Конечно, standalone приложения никуда не денутся. Мессенджеры, социальные сети, приложения по работе с финансами и игры никто не будет открывать постранично, но вот, например, открывать часть убера из карт, оплату билетов из афиши, карту ТЦ или парка развлечений по QR или ссылке – это гораздо удобнее, чем устанавливать приложение на один день, да еще и скачивая весь его дистрибутив по 4G.
Для разработчика Instant Apps — это повод навести порядок в архитектуре и структуре приложения. Разбить его на независимые или слабосвязные модули. Но сейчас многое не поддерживается со стороны инструментов. К примеру, нельзя иметь DataBinding верстку не в корневом модуле. А еще нужно следить за размером Instant App, apk не должен превышать 4 МБ.
Ограничения с точки зрения функциональности тоже присутствуют, instant apps не требуют установки, поэтому они имеют меньший доступ к системе, ее состоянию и данным пользователя. Но все ограничения вполне логичны.
— Android Things — есть ли отличия от «обычного» андроида? Какие цели в конечном счете преследует Google, предоставляя эту систему потребителям? Что для тебя значит этот продукт? В чем его функциональные отличия от Linux для того же Raspberry Pi?
Денис Неклюдов: Android Things отличается от мобильной версии Android отсутствием элементов, нужных лишь мобильным устройствам, например Content Provider и кастомными клавиатурами. Взамен там добавлены API для работы с устройствами ввода/вывода.
Безусловно, AT создан именно для Internet of Things, а не просто микроконтроллеров с какой-то программой. Мощность устройств и широкий спектр готовых инструментов позволяет полностью использовать потенциал подключенного к сети устройства. Ярким примером может послужить применение AT-устройств в качестве центрального хаба для датчиков и контроллеров, а их мощность позволит, не дожидаясь ответа от сети, принимать решения самостоятельно, ведь на AT можно даже использовать TensorFlow.
При использовании Raspbian, к примеру, на Raspberry Pi 3, не получится воспользоваться широким набором сервисов Google, таких как Firebase Cloud Messages, Firestore, Fuse Location Provider и многих других. К тому же, Raspberry Pi — это устройство для домашнего хобби, а не для промышленного использования. Android Things, в свою очередь, работает на готовых к коммерческому внедрению SoM, таких как NXP pico i.mx7d.
Про Android Things у меня в подкасте есть целый выпуск-интервью с Dave Smith, представителем команды в Google. А для меня лично возможность совместить хобби с любимыми библиотеками, знакомым языком и SDK — огромное удовольствие, которое я получаю по вечерам, автоматизируя домашние задачи. Так, к примеру, в Польше на Google Developer Days я выставлял свое управление кондиционерами, где центральное устройство работало на AT.
А про то, как сделать свое умное устройство, я расскажу за день до Mobius…
— Есть вопрос о компиляторах. Очевидно, что Jack toolchain окончательно уходит в небытие, а на его место приходит новый компилятор Dex (в Android Studio 3.0 он пока как preview, а с 3.1 уже используется по умолчанию). Чем он лучше Jack и как это в конечном счете сказывается на разработке? Какие оптимизации используются?
Денис Неклюдов: Новый компилятор Dex под названием D8, который немного уменьшает размер приложения за счет более компактных Dex-файлов, и Jack не то чтобы были связаны. Но Google отказались от своего незавершенного компилятора, это факт. На разработке новый Dex практически не скажется, разве что можно отгрести багов в неожиданных местах, так как он не отлажен до конца.
— Как, по-вашему, ребята из Google добились нативной поддержки фич из Java 8? Какие изменения претерпела Android Runtime?
Денис Неклюдов: Ну это не нативная поддержка, а конвертация языкового «сахара» в байткод. Они производят десахароз и формируют байткод, имитирующий то, что создается в Java 8. Но, конечно, все бэкпортнуть невозможно, однако это отличный повод отказаться от retrolambda.
— С учетом поддержки фич из Java 8 дает ли это возможность использования Scala >=2.12 для разработки? Вообще логика такая: в новой toolchain используется javac -> desugar -> dx. Java — это язык, который официально поддерживается компанией-разработчиком. Однако стоит учитывать, что desugar & dx полагаются на jvm байт-код, поэтому должна быть возможность подключать другие языки, которые его генерируют. По идее могут возникнуть проблемы преобразования из jvm-bytecode в байт-код dalvik.Так как Scala генерирует код иначе, чем javac. Например, может быть проблема с байт-код инструкцией invokedynamic. Поэтому будет ли desugar поддерживать все допустимые байт-коды Java в будущем?
Денис Неклюдов: Invokedynamic нет в старых SDK, поэтому невозможно было в том числе сделать порт всех фишек Java 8. Едва ли что-то еще добавят в desugar. Scala и Android очень редко пересекаются, и, учитывая поддержку Kotlin, мне лично неясно зачем тратить без того короткую жизнь на притягивание за уши на чужое поле языка, который хорош в своем сегменте, но не в мире мобильной разработки.
Среди приятных нововведений в Android 8 можно отметить добавление java.nio.file и java.lang.invoke. Какие преимущества дают эти новые API и в каких сценариях их лучше использовать?
Денис Неклюдов: Не стоит забывать, что должна пройти пара-тройка лет, чтобы разработчики смогли поставить minsdk 26 в своих приложениях, чтобы опираться на эти API. А в целом они полезны тем, кто пишет специфичные библиотеки.
Если мобильная разработка — ваш основной конек, и вы любите смаковать детали, наверняка вам понравятся вот эти доклады на нашей ноябрьской конференции Mobius 2017 Moscow:
- Crash репорты Android NDK (Иван Пономарев, Akvelon)
- Оптимизация размера приложения (Дмитрий Куркин, Mail.Ru)
- Пишем Java-френдли Kotlin-код (Сергей Рябов, Independent)
- Пустота наследия: стратегия кардинальных улучшений в проекте (Владимир Иванов, EPAM Systems)
Автор: Олег Чирухин