Возможности Android N Java 8 (компилятор Jack) и взаимодействие с Kotlin

98

Обновление 3. KOTLIN ТЕПЕРЬ ОФИЦИАЛЬНО ПОДДЕРЖИВАЕТСЯ ДЛЯ РАЗРАБОТКИ ANDROID . ПО GOOGLE. УААААААААС!

Обновление 2 : похоже, что JetBrains действительно привержена поддержке Kotlin для Android в долгосрочной перспективе . Я счастливый пользователь котлина :).

Обновление : Хади Харири из JetBrains упомянул, что они собираются выпустить некоторую информацию по этой теме . Я обновлю этот пост, как только они это сделают.


=== УСТАРЕВШИЕ МАТЕРИАЛЫ СЛЕДУЮЩИЕ ===

Google только что выпустил предварительную версию предстоящего Android N с некоторыми интересными функциями, наиболее заметной из которых является частичная поддержка языка Java 8 . Это возможно благодаря новой цепочке инструментов Jack, над которой работает Google.

Текущая цепочка инструментов с использованием javac или kotlinc :
javac ( .java-> .class) -> dx ( .class-> .dex)
kotlinc ( .kt-> .class) -> dx ( .class-> .dex)

Новый набор инструментов Джека:
Джек ( .java-> .jack-> .dex)

Я предполагаю, что Google будет стремиться сделать Джека инструментом по умолчанию для разработки под Android. Обновление: теперь Джек устарел . Яс.

У меня вопрос, как этот новый набор инструментов повлияет на меня в будущем, как на пользователя kotlin для разработки под Android? Я застряну в прошлом?

Тюдор Лука
источник
1
(kotlin_library (multiple * .kt) => .jar), затем Jill (.jar => Jayce), затем импорт в jack (аналогично другим (не android) (обычная java) jar-файлы)
Selvin
Чтение документации: «Для использования Джека не нужно ничего делать по-другому - просто используйте стандартные команды makefile для компиляции дерева или вашего проекта. Джек - это набор инструментов сборки Android по умолчанию для M.» - источник: source.android.com/source/jack.html, конечно, это опечатка, и они означают «N», а не «M» ?
Марк Кин,
Джек мертв, радуйтесь: P
EpicPandaForce

Ответы:

63

отказ от ответственности: я работаю над Джеком

Это не повлияет на вас. Компилятор Kotlin создает байт-код Java 6, который Джек / Джилл может легко импортировать.

Лукас Бергстром
источник
7
Не могли бы вы рассказать об этом подробнее? :)
Tudor Luca
Но сможет ли Котлин извлечь выгоду из оптимизации производительности Джека? (по крайней мере, один день), потому что jack кажется довольно крутым (я не могу дождаться какого-нибудь теста прямо сейчас)
NitroG42
Я видел видео-презентацию бенчмарка от автора proguard. Немного погуглив, и вы сможете его найти
Сакис Калиакудас
У нас возникли некоторые трудности со сборкой проекта Android с прикрепленной стандартной библиотекой Kotlin. Похоже на ошибку в Джилл / Джек. Не могли бы вы изучить это? code.google.com/p/android/issues/detail?id=196084
yanex
1
Означает ли это, что Джилл не принимает байт-код Java 8? А как насчет библиотечных модулей? Если они скомпилированы в .aar, а затем импортированы Джилл, не могут ли они также использовать Java 8? Т.е. означает ли это, что новые возможности Java доступны только для внутренних исходников проекта .java?
far.be
15

@Pavel Dudka

Джек - компилятор. Похож на javac, но делает немного другое:

введите описание изображения здесь

Как видите, Джек компилирует исходный код Java прямо в файл Dex! У нас больше нет промежуточных файлов * .class, поэтому инструмент dx не нужен!

Но ждать! Что, если я включу в свой проект стороннюю библиотеку (которая поставляется в виде коллекции файлов .class)?

И тогда в игру вступает Джилл:

введите описание изображения здесь

Джилл может обрабатывать файлы классов и преобразовывать их в специальный формат Jayce, который можно использовать в качестве входных данных для компилятора Jack.

Итак, теперь давайте на секунду отойдем в сторону и подумаем ... Что будет со всеми этими классными плагинами, от которых мы так пристрастились? Всем им нужны файлы .class, а у компилятора Джека их больше нет ...

К счастью, Джек предоставляет некоторые из этих важных для нас функций прямо из коробки:

  • Ретроламбда - не понадобится. Джек может правильно обращаться с лямбдами
  • Proguard - теперь он встроен в Jack, поэтому вы все еще можете использовать обфускацию и минимизацию

Преимущества:

Джек поддерживает язык программирования Java 1.7 и включает дополнительные функции, описанные ниже.

  • Predexing

    При создании файла библиотеки JACK создается .dex библиотеки и сохраняется внутри файла библиотеки .jack в качестве префикса. При компиляции JACK повторно использует префикс из каждой библиотеки. Все библиотеки предварительно настроены.

  • Инкрементальная компиляция

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

  • Переупаковка

    JACK использует файлы конфигурации jarjar для переупаковки.

  • Поддержка Multidex

    Поскольку файлы dex ограничены 65K методами, приложения с более чем 65K методами должны быть разделены на несколько файлов dex. (См. «Создание приложений с использованием более 65K методов» для получения дополнительной информации о multidex.)

Недостатки:

  • Transform API не поддерживается Джеком - промежуточного байт-кода Java, который можно изменить, нет, поэтому некоторые плагины, о которых я здесь не упоминал, перестанут работать.
  • Обработка аннотаций в настоящее время не поддерживается Джеком, поэтому, если вы сильно зависите от таких библиотек, как Dagger, AutoValue и т. Д., Вам следует дважды подумать, прежде чем переключаться на Jack. РЕДАКТИРОВАТЬ: Как указал Джейк Уортон, у Джека в N Preview есть поддержка обработки аннотаций, но она еще не отображается через Gradle.
  • Детекторы линта, работающие на уровне байт-кода Java, не поддерживаются.
  • Жакоко не поддерживается - лично я считаю Жакоко сомнительным (на самом деле он не показывает то, что вы хотите видеть), поэтому могу жить без него.
  • Dexguard - корпоративная версия Proguard в настоящее время не поддерживается
Дхавал Дживани
источник
действует ли по состоянию на сентябрь 2016 г. «обработка аннотаций в настоящее время не поддерживается Джеком»? Похоже, сейчас это поддерживается ...
ticofab 08
он поддерживается, но все еще есть ошибки: например, привязка данных еще не работает: см. android # 210615
TmTron
Обратите внимание, что обработка аннотаций НЕ полностью поддерживается Джеком - она ​​находится в том же дряхлом состоянии, что и в компиляторе Eclipse, на котором основан Джек ( несколько методов реализованы как заполнители, которые вызывают исключения при вызове , имеется множество не исправленных ошибок, зарегистрировано на багтрекере ECJ).
user1643723
7

Google не собирается продвигать Джека в качестве инструмента по умолчанию, но Jack and Jill.
Компиляция файлов .class в dex с помощью Jill никуда не денется. В противном случае вы можете попрощаться с библиотеками jar / aar.

Будет ли Джек или Джилл медленнее, все еще обсуждается. Команда Android надеется, что jack будет быстрее, чем текущий процесс сборки, но сейчас это не так.

Кроме того, Джек и Декс доступны в открытом доступе, ничто не мешает команде kotlin написать инструмент, генерирующий файлы .jack или .dex из исходного кода kotlin.

Теовальд
источник
7

ОБНОВЛЕНИЕ (16.03.2017)

К счастью, Джек мертв, поэтому разработчиков Kotlin это не коснется.


Если будущее - за Джеком, то с Котлином вы застрянете в прошлом. В настоящее время Джек не поддерживает плагины, которые могут компилировать исходный текст, отличный от Java, в байт-код Dalvik. И даже если бы это произошло, JetBrains необходимо было бы добавить новый бэкэнд в компилятор Kotlin, что является нетривиальной задачей. Таким образом, вам придется использовать Kotlin с Джилл, и это будет что-то очень похожее на ту цепочку инструментов, которую вы используете сейчас.

Как вы можете видеть на изображении ниже, даже если невозможно явно отключить Джека, вы все равно сможете преобразовать проект в проект библиотеки для использования Джилл. И проект приложения будет просто ссылаться на этот проект библиотеки.

Сборка приложения Джека и Джилл

Единственный способ, которым я вижу, как Kotlin может работать с Джеком, что, вероятно, не будет реализовано, - это добавить серверную часть Java в компилятор Kotlin, то есть бэкэнд, который генерирует код Java, такой как Xtend. . В этом случае код, сгенерированный компилятором Kotlin, может обрабатываться Джеком как любой другой код Java.

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

Майкл
источник
7
На самом деле у команды Kotlin есть планы по поддержке Jack & Jill, я слышал об этом на их живом мероприятии, но я бы предпочел официальный пост от JetBrains здесь, поэтому я не ответил на вопрос.
горячая клавиша
Это было бы здорово, но я слышал только о поддержке через Джилл. И, как я уже упоминал в ответе, не так уж много способов добавить эту поддержку.
Майкл
Фактически, было кое-что о генерации кода в памяти (и о гораздо менее реалистичном варианте, Kotlin -> dex), так что сборка Kotlin Android также имела значительное ускорение.
горячая клавиша
Не понимаю, как генерация кода в памяти связана с интеграцией Джека. А компиляция Kotlin для dex означает, что JetBrains необходимо написать и поддерживать собственный набор инструментов, аналогичный Jack.
Michael
1
Не уверен, что кто-либо, кроме команды Kotlin, должен говорить, что они могут, а что не могут, или что они могут или не могут делать. Они уже говорили об этом раньше, и у них есть планы, которые они могут представить.
Джейсон Минард,
5

Как сказано в опубликованном сегодня сообщении блога ( Kotlin's Android Roadmap ):

Прямо сейчас есть некоторые проблемы, которые мешают Джеку правильно обрабатывать байт-код, сгенерированный Kotlin ( 196084 и 203531 ), но мы планируем работать вместе с командой Google, чтобы либо решить проблемы, либо предоставить обходные пути с нашей стороны. Как только это будет сделано, мы сможем переводить только измененные файлы классов с помощью Jill во время инкрементной компиляции, в отличие от перевода всех файлов классов каждый раз (что является единственно возможным поведением в старых инструментах Android).

Так что Kotlin в конечном итоге поддержит Jack & Jill и получит от этого выгоду.

горячая клавиша
источник
2

Согласно последнему объявлению Google -

Мы решили добавить поддержку функций языка Java 8 непосредственно в текущий набор инструментов javac и dx и исключить набор инструментов Jack. В этом новом направлении существующие инструменты и плагины, зависящие от формата файлов классов Java, должны продолжать работать. В дальнейшем функции языка Java 8 будут изначально поддерживаться системой сборки Android. Мы планируем запустить это как часть Android Studio в ближайшие недели, и мы хотели заранее сообщить вам об этом решении.

Сначала мы протестировали добавление поддержки Java 8 с помощью набора инструментов Jack. Со временем мы поняли, что стоимость перехода на Джека была слишком высока для нашего сообщества, когда мы рассмотрели, как это повлияет на процессоры аннотаций, анализаторы байт-кода и перезаписчики. Спасибо, что попробовали инструментальную цепочку Jack и оставили нам отличный отзыв. Вы можете продолжать использовать Джека для создания кода Java 8, пока мы не выпустим новую поддержку. Переход от Джека не требует или почти не требует работы.

Так что нам не нужно беспокоиться о том, что набор инструментов jack станет набором инструментов по умолчанию для разработки под Android. Вы можете продолжать использовать kotlin или использовать обычный набор инструментов javac / dx.

Источник: Будущее поддержки языковых функций Java 8 на Android

Аникет Такур
источник
1

Я уже нашел это сообщение в официальном блоге Kotlin :: Дорожная карта Android Kotlin

Там вы найдете часть, в которой говорится:

Следующее, что мы планируем сделать для повышения производительности сборки Android, - это обеспечить интеграцию с новым набором инструментов Android Jack and Jill . Прямо сейчас есть некоторые проблемы, которые мешают Джеку правильно обрабатывать байт-код, сгенерированный Kotlin ( 196084 и 203531 ), но мы планируем работать вместе с командой Google, чтобы либо решить проблемы, либо предоставить обходные пути с нашей стороны. Как только это будет сделано, мы сможем переводить только измененные файлы классов с помощью Jill во время инкрементной компиляции, в отличие от перевода всех файлов классов каждый раз (что является единственно возможным поведением в старых инструментах Android).

Итак, как сказал @LukasBergstrom, не будет никаких проблем с «застреванием в прошлом» ;-)

Вы также можете проверить Redditобсуждение, связанное с этой темой: Каков статус Котлина с Джеком и Джилл?

Удачного кодирования.

piotrek1543
источник
0

Согласно блогу Kotlin , в разделе новых функций выпуска 1.1-beta2:

Поддержка создания проектов Android при включенной цепочке инструментов Jack (jackOptions {true});

Дэвид Киндред
источник