Новый набор инструментов компилятора, Джек и Джилл, был включен в недавний выпуск Android SDK 21.1, но только сейчас Google объяснил, что это такое и что они делают.
Причудливые имена выдают большую часть игры. Джек — это комплект компилятора Java для Android, а Джилл — промежуточный компоновщик библиотек Джека. На данный момент оба имеют статус «экспериментальных».
Идея очень проста. Джек компилирует ваш Java-код прямо в исполняемый файл Dalvik .dex. Обычный процесс компиляции берет исходный код и использует стандартный компилятор javac для его преобразования сначала в байт-код Java, а затем передает его через компилятор dex, чтобы преобразовать его в байт-код Dalvik.
Новый компилятор Jack выполняет эту работу за один раз без использования байт-кода Java. Он также применяет оптимизацию и обфускацию, которые раньше предоставлялись Proguard. Это гораздо более простой одноэтапный процесс, и Google надеется в будущем использовать его еще больше с помощью таких функций, как инкрементная компиляция. Думаю, можно сказать, что у Android наконец-то появился собственный компилятор.
Обратите внимание, что полученный код .dex можно передать в традиционный движок Dalvik или в новый движок ART Android RunTime. Механизм ART использует предварительную компиляцию, которую мы когда-то называли «компиляцией» для преобразования .dex в машинный код во время установки. Это может быть намного быстрее.
Так что же делает Джилл?
Простой ответ заключается в том, что он защищает Джека от необходимости видеть и обрабатывать любой байт-код Java. Если у вас есть библиотека, Джилл преобразует файлы библиотеки .jar в формат библиотеки .jack, который Джек может объединить с остальной частью объектного кода.
Полный процесс можно увидеть на схеме ниже:
На данный момент вы должны включить поддержку Джека и Джилл, если хотите ее использовать. Это равносильно добавлению useJack = true в ваш файл build.gradle. На сайте разработчика Android есть гораздо больше деталей.
Так почему же Google переходит на Джека и Джилл?
Существует вероятность того, что за счет оптимизации последовательности компилятора появится возможность для дополнительной оптимизации — как упомянутая ранее инкрементная компиляция.
Другой менее технической причиной может быть необходимость для Google отойти от Dalvik и инфраструктуры Java, чтобы сделать судебный процесс Oracle менее проблематичным. Хотя было постановление, в котором в основном говорилось, что Google может использовать API Java и т. Д., Это нормально, это все еще обжаловано, и на этот раз это не выглядит так хорошо для Google. Отказ от использования javac и Dalvik ставит некоторую дистанцию между технологией Android и иском против Java.
С другой стороны, Джек и Джилл в настоящее время не поддерживают Java 8, и любые обновления должны быть реализованы Google. Когда Android был новым, совместимость с языком и инфраструктурой Java была большой проблемой, но теперь Android нужен почти Java.