В марте этого года была представлена первая превью-версия Android N. Пока она существует в виде беты и дата финального релиза еще не определена (предположительно ОС увидит свет во второй половине 2016 года). Об основных нововведениях и тенденциях, уже сейчас, на этапе беты, прослеживающихся в обновлении, мы поговорили с первым в России Android Google Developer Expert Денисом Неклюдовым. А для тех, кто хочет встретиться лично, Денис выступит на конференции Mobius 2016 4 июня в Петербурге.



— Здравствуйте! Расскажите, пожалуйста, в двух словах о себе и своей работе.

— Добрый день! Зовут меня Денис Неклюдов. Я работаю в небольшой компании, занимающейся разработкой мобильных приложений для финансовых организаций и стартапов. В компании я занимаю позицию team-lead-а, специализируясь именно на разработке под Android.
Помимо основной работы участвую в записи подкаста Android Dev, где мы с коллегами на профессиональном уровне подробно рассказываем о технологиях Google и разработке в целом.

— Что означает ваш Google Developer Expert? Что он дает вам в профессиональном плане?

— Статус Google Developer Expert я получил год назад. По задумке Google основная задача эксперта GDE — соединять создателей технологий компании и рядовых разработчиков, которые пользуются этими технологиями. Соответственно, эксперт может пользоваться ранним доступом к новым разработкам компании, имеет определенные привилегии при выступлениях на конференциях и т.п.
Лично мне статус GDE позволяет оперативно получать информацию о технологиях, затрагивающих мою профессиональную деятельность. Я использую это и в работе, и при записи выпусков Android Dev. А также заниматься моим любимым хобби: делиться знаниями с людьми на конференциях, в подкастах и в статьях.

— Наверняка вам уже довелось поработать с превью-версиями Android N. Каково ваше мнение о представленном обновлении, как разработчика?

— Для полноценного впечатления еще слишком рано, т.к. на данный момент вышла только вторая техническая preview-версия, далекая от финального релиза. Но основные заложенные в обновление фичи и идеи уже видны.
Не могу сказать, что Android N — это апдейт, который что-то глобально меняет, ломает или приносит в платформу. Это очередное полноценное ежегодное обновление, добавляющее недостающие детали и улучшающие существующие элементы, как прошлогодний Marshmallow.

— В новой версии Android N заявлено довольно много нововведений. Насколько они актуальны для текущего уровня развития аппаратного обеспечения мобильных устройств?

— Нововведений, определяющих большие нагрузки на железо (в частности, процессор и видеокарту) в новом Android нет. Да, появился многооконный режим, но устройства Android давно работают в многопоточном окружении, когда допускается одновременный запуск в фоне нескольких приложений и сервисов. Так что у современных устройств не будет проблем с отображением двух приложений в многооконном режиме.
Для тех, кто близко работает с железом, самое интересное там — API Vulkan, но, насколько мне известно, он тоже не так уж и требователен к ресурсам. Скорее наоборот — он оптимизирован за счет работы на более низком уровне и позволяет получить большее количество fps при той же производительности аппаратного обеспечения.

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

— На мой взгляд, утверждение о том, что Android плохо адаптирован под большие экраны, спекулятивно. Действительно, существует обывательское мнение о том, что приложения на iPad (написанные для iOS) выглядят симпатичнее и более адаптированы для планшетов, нежели “планшетные” версии приложений Android. Но это нюансы самих приложений. Это связано не с размерами экрана, а с UX при работе с планшетом.
Раньше, возможно, и были подобные сложности. Но еще в 2011 году, когда был представлен Android 4.0 и одна ОС стала работать как на планшетах, так и на других устройствах, у разработчиков появилась возможность делать приложения для планшетов и телефонов в едином установочном файле (едином файле apk). Т.е. вопрос был решен. Я не думаю, что заявленные нововведения как-то кардинально изменят пользовательский опыт от работы с Android-планшетом.

— Какие именно нововведения системы, на ваш взгляд, были наиболее ожидаемы разработчиками?

— Если честно, я не заметил в списках нововведений Android N каких-то wow-фич, о которых все мечтали (о которых можно было бы сказать: “Ну ничего себе, этого мы так ждали, и это они наконец-то сделали”). Существующих в Android инструментов по большому счету достаточно, а принципиальные недостатки, которые хотелось бы поправить, найти сложно. Но могу отметить наиболее мажорные нововведения.

Первый момент — это даже не wow-фича, а скорее наоборот, очередной шаг “закручивания гаек”, которое Google осуществляет на протяжении последних нескольких релизов ОС. Он касается проектов внутри ОС, которые лишают приложение ресурсов при работе в фоновом режиме. В принципе, это очень логичный шаг, поскольку изначально Android позволял приложению работать как оно хочет и потреблять сколько угодно ресурсов (как бы давно у пользователя оно не было открыто). Но на рынке работает много недобросовестных разработчиков, которые активно пользуются ресурсами системы, даже когда их приложение в фоне. И с каждым релизом (и в Android Marshmallow, и сейчас в Android N) Google демонстрирует тенденцию ограничения ресурсов системы, а также доступа к сети, доступных давно не используемым, но запущенным в фоне приложениям. Это вполне логично и позволяет продлить работу батареи, избавив пользователя от головной боли о том, что у него в фоне работает куча сервисов, о которых он и понятия не имел.

Второй момент — долгожданная официальная поддержка блек-листа входящих вызовов. Наиболее актуальна она для разработчиков приложений контакт-менеджеров или менеджеров входящих звонков. Все знают о том, что ранее для реализации в Android блокировки нежелательных входящих звонков нужно было совершить магию с reflection, а это не самое приятное решение. Теперь же наконец появилось официальное API.
Важные нововведения, о которых не все журналисты говорят, но разработчики заметили сразу — это изменения в безопасности. В Android N появилась улучшенная запись сертификатов, что позволит делать более безопасные приложения, менее подверженные атакам злоумышленников.
Еще одно хорошее добавление — поддержка icu4j, позволяющей осуществлять различные штуки с локализацией приложений (в частности, работать с форматированием чисел и другими локале-зависимыми вещами).

— А как вы можете прокомментировать переход на новую версию Java?

— Это двоякий момент. С одной стороны переход на новую версию действительно нужен. Это естественный процесс, мы рады, что поддержка появилась. Но переход не столь ожидаем. Многие разработчики, давно мечтавшие о фишках Java 8, уже перешли на Kotlin от компании JetBrains, и Google не возражает против такого подхода. Таким образом, они получили возможность самореализоваться в красивом коде. Кроме того, существует проект retrolambda, который позволяет использовать лямбды при написании кода на Java 7. Он не сильно замедляет процесс компиляции, но при этом ускоряет разработку для любителей вставлять лямбды.
В любом случае разговор о версиях Java — это беседа о красоте кода. Если человек думает о разработке продукта, а не о самореализации в чистоте кода, все это вторично. Поэтому наличие новых фишек из Java 8 — это, безусловно, положительный момент; спасибо Google, что они к этому идут. Но многие фишки Java 8 будут поддержаны только в Android N, а основной или минимальной версией мы ее сможем поставить не скоро — к тому моменту выйдет Java 9, а может и Java 10. И снова это будут какие-то бэкпорты, альтернативные способы использования фич.

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

— Обрезание ресурсов — это, на самом деле, самое важное. Doze Mode, предназначенный для того, чтобы приложения получали все меньше и меньше ресурсов — ключевая проблема, особенно для ребят, которые в фоне долго держат какие-то открытые сокеты, пытаются получать изменения локации пользователя, изменения состояния сети и т.п. Сейчас они все должны держать в голове, что ситуация меняется и нужно переходить на встроенные google message service и push-нотификации.
Еще один момент, о котором стоит беспокоиться разработчикам, начинающим писать под Android N, — это динамическая смена DPI. Теперь пользователь может на лету поменять множитель DPI в своем устройстве, и вся верстка неожиданно изменит свою форму. Поэтому разработчик должен делать максимально резиновый интерфейс при верстке и учитывать, что пользователь не просто может сменить устройство на другое, но и на существующем девайсе сменить множитель DPI.

— Динамическая смена DPI — это “хвост” многооконного режима?

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

— Выпущена еще только вторая Preview-версия для разработчиков. Не рано ли сейчас начинать перенос приложений, тем более дата окончательного релиза системы пока не назначена?

— Тут важно поговорить о категориях разработчиков. Если вы — конвейерный разработчик, который делает для заказчика приложение за приложением, то я не вижу особого смысла сейчас смотреть в сторону Android N и пытаться объяснить заказчику, что уже нужно заложить его. Особенно, если речь идет о приложениях-однодневках для 0,1 пользователя.
Если же вы — серьезная продуктовая компания, и ваш продукт уже имеет миллионы пользователей, то, безусловно, к чему тянуть? Вам в любом случае придется поддерживать Android N. Так сделайте это заранее, хотя бы на бета-версиях ваших будущих релизов. Заложите поддержку и посмотрите, как будут работать ваши приложения с учетом ограничений фонового режима, изменений верстки и т.п. Тем более, если у вас миллионы пользователей, то хотя бы у небольшого процента из них появится Android N, как только выйдет релиз (а может они уже сейчас используют бету). Почему бы не порадовать их поддержкой новых фич и адаптацией своего приложения для этой системы?

— Замечены ли какие-то проблемы в SDK для Android N?

— Насколько мы с коллегами пробовали, никаких особых проблем нет. Можно брать новые фишки и пытаться их использовать. Правда, насколько мне известно (может уже что-то изменилось), полной поддержки всех обещанных в Android N фишек Java 8 пока нет.

— На ваш взгляд, новые приложения разработчикам сейчас лучше сразу ориентировать на Android N или смотреть на более распространенные версии системы?

— Если отталкиваться от наиболее распространенной на рынке версии ОС, то надо разрабатывать под Android 5.1 lollipop и даже не думать о поддержке Marshmallow, т.к. у нее не так уж и много пользователей. Но такой подход изначально не верен, т.к. с каждым днем все больше пользователей обновляется. К примеру, на Marshmallow обновилось многие флагманы от Samsung, а это огромное количество пользователей. Поэтому нужно, конечно, разрабатывать под самые последние версии Android и тестировать и на предыдущих, и на самых популярных — это будет всегда выигрышный подход.




Мы приглашаем хабровчан на конференцию по мобильной разработке Mobius 2016 (Санкт-Петербург, 4 июня), на которой Денис сделает два доклада:

Подробнее о конференции — на ее сайте.

Комментарии (28)


  1. 23derevo
    05.05.2016 11:42
    +2

    Мне кажется, что разговор о переходе на Java 8 — это не только разговор о качестве кода. Это разговор о переходе c устаревшей и плохо поддерживаемой кодовой базы Apache Harmony, разрабатываемой 10 лет назад Intel и IBM на OpenJDK 8 (тыц, тыц) — у которой гораздо более продвинутый и поддерживаемый classlib с кучей перфомансных улучшений и пофикшенных багов.


    1. basnopisets
      05.05.2016 12:53
      +2

      и переход этот во многом вызван судебной тяжбой с Oracle


      1. 23derevo
        05.05.2016 13:19
        +6

        «не было бы счастья, да несчастье помогло»


        1. artemgapchenko
          05.05.2016 20:05
          +1

          Спорный вопрос, считать ли несчастием ситуацию, в которую Google залез самостоятельно. Слушал вчера выпуск подкаста Triangulation с Джеймсом Гослингом, и там он напрямик говорил, что Google в самом начале создания Android приходил к Sun, и просил дать им лицензию на использование Java на Android-устройствах. Бесплатно. Не смотря на то, что лицензия стоила денег, и разработчики Sun как бы не за идею работали. Им предложили индивидуальную стоимость лицензии, дешевле чем остальным, но и это Google не устроило — хотели получить лицензию бесплатно.
          Так что тут скорее «За что боролись — на то и напоролись».


  1. dim_s
    05.05.2016 11:48
    +2

    Google тормозит развитие Java и нежелание реализовывать новые стандарты и stdlib языка лишь тому подтверждение. Это смешные оправдания в стиле — есть же другие языки, а Java мы не будем развивать. С такой позицией я полностью на стороне Oracle в судебной тяжбе против Google.


    1. DenimTornado
      05.05.2016 12:21

      Хм, разве? По-моему выглядит так, что Google тупо долго выпускает новую версию Android. При чём здесь нежелание реализовывать новые стандарты, если версии Android растут медленнее, чем версии Java?


      1. dim_s
        05.05.2016 13:32
        +3

        Я думаю есть возможность развивать инструменты и stdlib без обновления версии Android.


  1. olegi
    05.05.2016 14:48

    К примеру, на Marshmallow обновилось многие флагманы от Samsung, а это огромное количество пользователей.

    Может в фин-техе все на флагманах, а в реальности дела иначе http://hwstats.unity3d.com/mobile/device-android.html


    1. ITurchenko
      05.05.2016 15:14

      Уже 7.5% всех устройств работают на Marshmallow — developer.android.com/about/dashboards/index.html
      И хочу заметить, динамика роста доли пользователей Marshmallow гораздо бодрее, чем в своё время у Lollipop'а.


    1. nekdenis
      05.05.2016 16:11

      Огромное по количеству человек, но не по процентному соотношению.
      Так то понятно, полно еще реальных пользователей и с 2.3. Но это же все не означает, что мы не должны поддерживать и ориентироваться на современные версии ОС и их фишки.


  1. 1nt3g3r
    05.05.2016 15:30
    +1

    В статье написано «Игровой движок Vulkan» — может, все же API для 2D\3D графики?


    1. nekdenis
      05.05.2016 16:07

      верно подмечено!


    1. ARG89
      05.05.2016 18:43
      +1

      Спасибо, поправил.


  1. davemilter
    05.05.2016 16:11

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


    1. nekdenis
      05.05.2016 16:14
      +4

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


    1. romashko_o
      06.05.2016 05:38
      +1

      Кроме аппаратного DPI есть множитель, который отвечает за масштаб приложений. Динамический DPI был на моей памяти достаточно давно реализован в кастомных прошивках Paranoid Android, например — можно было приложения на телефоне застаивть выглядеть как планшетные, с уменьшенным масштабом элементов.


  1. Kalobok
    05.05.2016 17:23
    +6

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

    И мы даже знаем имена этих разработчиков.

    Самые жадные до батареи: Google Services, Android OS и Maps. На последние у меня уже рефлекс — попользовался, доехал, вышел из навигации, сделал ей force-close. Иначе батарея легко сжирается полностью за пару часов.

    Самый жадный до данных — Android OS, намного обошедший всех конкурентов. За прошлый месяц, например, сожрал гиг с лишним траффика — больше, чем все остальные потребители вместе взятые (музыка, подкасты, навигация, почта и т.п). И это при том, что все лишние синхронизации (фото, гуглоплюс и т.п.) отключены.

    Есть, есть еще над чем поработать некоторым недобросовестным разработчикам.


    1. SamsonovAnton
      06.05.2016 10:18
      +3

      «Android OS за прошлый месяц сожрал гиг с лишним траффика — больше, чем все остальные потребители вместе взятые».

      Когда я пару лет назад купил своё первое Android-устройство (планшет Asus Fonepad на роль автонавигатора), то поначалу никак не мог понять, почему система не может проверить наличие обновлений прошивки — только бешено мигает кнопкой «Проверить» при наличии подключения к сети. Так как покупал накануне поездки, разбираться не было времени. Во время поездки обратил внимание, что трафик течёт рекой: когда пользовался Яндекс.Картами на Symbian, расходовались копейки, а тут за неделю вышло около 1 гигабайта — при том, что основные карты городов я скачал заранее по Wi-Fi. Но самое смешное, что трафик продолжал утекать, даже когда я вернулся домой. После запуска tcpdump на домашнем маршрутизаторе, стало ясно, что планшет ломится на сайт обновлений по HTTPS, получает отлуп, и тут же повторяет попытку — и так до бесконечности, по несколько раз в секунду. Если не ошибаюсь, причина была в том, что в [более-менее свежей] заводской версии был установлен устаревший SSL-сертификат, и дело решилось заменой сертификата и прочисткой кэша диспетчера загрузок. Но это я сумел вовремя заметить и разобраться, — а менее опытные пользователи так до скончания жизни устройства и будут тратить свой трафик впустую, ведь автоматически обновиться они так никогда не и смогут.


      1. Kalobok
        06.05.2016 13:46

        Кстати, это тоже вариант. Надо будет проверить.


    1. nekdenis
      06.05.2016 13:53
      +2

      Про прожорливость Google Play Services — это самое распространенное заблуждение. Дело в том, что любое сторонее или гугловое приложение, которое использует пуши, локацию, карты, Nearby messages, Analytics и другие гугловые сервисы внутри себя, дергает API Google Play Services. Поскольку у вас на устройствах полно таких приложений, то все их обращения в статистике батареи идут одной графой: Google Services. И с Android OS аналогично. Что у вас с картами, не знаю. У меня обычно 2GIS при сворачивании не перестает слушать локацию и продолжает жрать батарею.

      Я не спорю, в Android есть протёки, как например mobile radio active bug. Но не нужно туда приписывать плей сервисы.


      1. Kalobok
        06.05.2016 14:41

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

        Простой пример: гуглоплею в настройках сказано качать обновления только через вайфай. Тем не менее, когда вайфая нет у меня постоянно выскакивают сообщения, что появились обновления каких-то программ. Они не скачиваются, слава богу, но проверяются. Хотя, казалось бы, какой смысл? Пустая трата батареи и траффика.

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

        Еще пример из наболевшего, немного из другой области, но подтверждающий кривизну гугловских программ. Случается регулярно. Еду куда-то, слушаю книжку, попутно включена навигация с голосом. Когда голос что-то говорит, книжка останавливается. Удобно. Включаю вместо книжки гугломузыку. Все работает нормально. Выключаю музыку, включаю снова книжку. И тут начинается цирк. Голос от навигации книжку больше не выключает. Кнопка на гарнитуре книжку останавливает, но обратно запускает, внезапно, музыку. Оказывается. умный гуглоплеер вешается на сообщения о паузах/стартах и не отдает их более активным приложениям пока не убьешь его принудительно, вместе с сервисом. Тогда все снова начинает работать как надо.

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


  1. Daytar
    05.05.2016 17:53
    -1

    самое интересное там — поддержка нового игрового движка Vulkan

    И давно у нас вулкан стал игровым движком?


  1. mkarev
    05.05.2016 21:06
    +1

    — Стоит ли ожидать в ближайшее время улучшение поддержки NDK?

    Понимаю, что вопрос не по Android N, а по Android Studio, просто наболело.
    Лаконичные Android.mk зарыли в землю заменили автогенерацией средствами неуклюжего gradle, при этом «забыли» добавить поддержку внешних модулей и статических библиотек.
    Более-менее вменяемая поддержка NDK есть только в экспериментальном плагине, который не совместим с дефолтным, что как бы намекает, что пользователи NDK — это «люди с ограниченными возможностями».

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


    1. silentnuke
      07.05.2016 14:01

      Вполне совместим. експерементальный плагин также генерит aar. соовтесвенно выносим ndk в отдельный модуль, где используем эксперементальный плагин и подключаем как зависимость к основному, который использует старый плагин.


      1. mkarev
        07.05.2016 22:11

        Нативная часть в Android обычно используется совместно с Java классом.
        Логично предположить, что этот класс должен быть реализован в нативном модуле.
        Или я ошибаюсь?

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

        Module: app
        apply plugin: 'com.android.application' // Java only
        ...
        dependencies {
        compile project(path: ':libn')
        compile project(path: ':libj')
        ...
        }

        Module:libn
        apply plugin: 'com.android.model.library' // Native,Java
        ...
        Module:libj
        apply plugin: 'com.android.library' // Java only
        ...


        1. silentnuke
          08.05.2016 06:12

          Java класс реализуется в том же нативном модуле и прекрасно виден в главном модуле.
          Если хотите, создайте минимальный пример где не работает и залейте на гитхаб, гляну.


  1. ebogdanov
    05.05.2016 21:37
    +1

    мы поговорили с первым в России Google Developer Expert Денисом Неклюдовым

    Обидно даже, ведь был такой еще аж в 2013-2014 году при старте программы.

    Ну или так и пишите — в категории Android


    1. ARG89
      06.05.2016 01:14
      +1

      Справедливо, поправил