Содержание статьи
9 марта компания Google представила Android N — предварительный выпуск седьмой версии своей операционки. И пока все радуются многооконному режиму, новой панели быстрых настроек и развитым уведомлениям, на которые можно отвечать без запуска приложения, я бы хотел сосредоточиться на действительно важных новшествах, которые делают Android лучше как систему, а именно: улучшениях в Doze, JIT/AOT-компиляторе, новом API тайлов и движении Android на десктопы.
Режим freeform
В октябре прошлого года Google заявила, что собирается слить Android и Chrome OS в одно целое. Тогда еще было непонятно, что конкретно они имеют в виду, однако высказывались предположения, что компания просто интегрирует куски Chrome OS в Android и заставит его работать на десктопах. Что ж, похоже, это оказалось правдой, так как в Android N действительно есть не только режим разделения экрана между двумя приложениями, но и так называемый режим freeform, который позволяет запускать приложения в плавающих окнах точно так же, как это реализовано в Remix OS.
Xakep #207. Дистанционное банковское ограбление
Объяснить наличие данного режима ничем иным, как желанием перенести систему на десктопы, нельзя: для планшетов хватит и режима разделения экрана, а на смартфонах не нужен ни тот ни другой. Десктопное будущее также косвенно подтверждается изменениями в API. Например, теперь есть выделенные кейкоды для копирования, вырезания и вставки, а также колбэк onProvideKeyboardShortcuts() для активити. Последний вызывается в ответ на ту или иную заданную программистом клавиатурную комбинацию. Также появился API для изменения курсора (PointerIcon) при наведении на элементы интерфейса (View).
Все это говорит в пользу того, что вскоре мы действительно увидим Android если не на десктопах, то уж точно на хромбуках и устройствах класса «трансформер»: подключил клавиатуру — получил классический многооконный интерфейс, отключил — у тебя стандартный Android. А можно пойти дальше и представить себе следующую ситуацию: въезжаешь в гостиницу, подключаешь свой смартфон по HDMI-кабелю к телевизору и получаешь полноценный многооконный рабочий стол (вместо стандартного Android UI, как сейчас). Неплохо, не правда ли?
AOT/JIT-компилятор и скорость установки софта
К релизу Android 5.0 Google решила окончательно отказаться от JIT-компиляции в пользу AOT-компиляции приложений. Это значит, что если в прошлых версиях Android приложения работали под управлением виртуальной машины (Dalvik), которая транслировала компоненты байт-кода приложения в машинные инструкции прямо по ходу его исполнения (JIT, just-in-time), то в Android 5.0 трансляция байт-кода в машинный код происходила один раз на этапе установки приложения (AOT — ahead-of-time).
Однако на самом деле JIT-компилятор никуда не делся и продолжал применяться для некоторых участков кода (в том числе самого Android), которые использовали кодогенерацию, а потому не могли быть переведены в машинные инструкции заблаговременно. Этот JIT-компилятор было решено задействовать в Android 7.0 с целью ускорения установки приложения и первичной загрузки после обновления: AOT-компилятор приводил к заметным задержкам в обоих случаях.
Так что Android 7.0 теперь действует иначе, чем Android 5.0+. Вместо того чтобы запускать AOT-компиляцию каждого приложения на этапе установки, он запускает приложение под управлением виртуальной машины, используя JIT-компилятор (почти так же, как в Android < 5.0), но следит за тем, какие участки кода приложения выполняются чаще всего. Затем эта информация используется для AOT-компиляции данных участков кода. Последняя операция выполняется только во время бездействия смартфона, находящегося на зарядке.
Говоря простыми словами, Google сплавила два совершенно различных подхода и заставила два компилятора работать сообща. Плюсами такой инновации являются:
- более эффективная компиляция — при реальном запуске приложения компилятор имеет возможность узнать о его работе гораздо больше, чем выполняя статический анализ, и, как следствие, применяются более подходящие методы оптимизации для каждой ситуации;
- сохранение оперативной и постоянной памяти — байт-код компактнее машинного кода, а если выполнять AOT-компиляцию только отдельных участков приложения и не выполнять компиляцию приложений, которыми юзер не пользуется, можно существенно сэкономить пространство NAND-памяти;
- резкое увеличение скорости установки и первой загрузки после обновления системы — нет AOT-компиляции, нет задержки.
Новый, улучшенный Doze
В Android 6.0 появился режим энергосбережения Doze, работающий по принципу «если смартфон долго не используется, отрубаем интернет и запрещаем приложениям будить девайс». На самом деле все несколько сложнее (во всех подробностях я описал его в статье «Дозируй батарею правильно!»), но суть именно такая. Ты не используешь телефон — он уходит в глубокий сон для сохранения батареи.
Doze — прекрасная технология, однако изначально в нее была заложена одна очень спорная особенность, за которую Google нередко критиковали: Doze учитывает не только время бездействия устройства, но и время его нахождения в покое. Другими словами, если постоянно перемещать смартфон (нести в сумке, например), он никогда не уйдет в Doze, пользуешься ты им или нет.
В Android 7.0 Google исправила эту проблему, и теперь смартфон переходит в режим Doze независимо от того, перемещается ли он.
Что еще?
- OpenJDK — Android теперь использует Java-библиотеки OpenJDK, благодаря чему появилась полноценная поддержка языка Java 8.
- Quick Settings Tile API — приложения теперь могут добавлять собственные тайлы в панель быстрых настроек (к слову сказать, такая функциональность уже есть в CyanogenMod).
- Project Svelte — продолжение разработки средств для создания более эффективных и не жадных до ресурсов приложений (JobScheduler и GcmNetworkManager).
- Data Saver — новый сервис, который автоматически активируется, когда проплаченный пакет трафика подходит к концу, и отключает фоновую передачу данных, ограничивая явную.
- Блокиратор номеров — ожидаемая с самых первых версий Android функция.
- OpenGL ES 3.2 — поддержки Vulkan пока, к сожалению, нет.
- Call screening — сторонние звонилки теперь могут показывать собственный экран входящего звонка.
- Multi-locale — теперь Android позволяет использовать сразу два системных языка (браузер больше не будет предлагать тебе перевод на английский, если ты его знаешь!).
- Always on VPN — теперь система может гарантировать, что трафик не утекает.
- Direct boot — зашифрованный смартфон теперь сохраняет базовую функциональность, даже если не введен PIN-код для расшифровки.
Выводы
С каждым новым релизом Google вносит в Android не только видимые юзеру изменения, но и массу внутренних улучшений, что, конечно же, не может не радовать. Какие-то из них имеют спорный характер (новый Doze или запрос полномочий во время работы в Android 6.0), другие, наоборот, важный шаг в правильном направлении (JIT/AOT-компиляция). Как бы там ни было, Google постоянно экспериментирует, и за всем этим очень интересно наблюдать.