Как стать автором
Обновить

Комментарии 8

Не всё так просто. Пробовал на самой новой версии апи (кажется, 28) включить java 1.8 и использовать библиотеку на scala 2.12 — падало в рантайме, какие-то инструкции телефону не нравились.

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

Здесь bootstrap метод назван metafactory в классе java.lang.invoke.LambdaMetafactory. Он живет в JDK и занимается созданием анонимных классов налету (on-the-fly) в рантайме для лямбд так же, как и D8 генерит их в компайлтайме.

Если взглянуть на документацию Android к java.lang.invoke
или на исходники AOSP к java.lang.invoke, увидим, что в рантайме этого класса нет. Вот поэтому дешугаринг всегда происходит во время компиляции, независимо от того, какой у вас minApi. VM поддерживает байткод инструкцию, похожую на invokedynamic, но встроенный в JDK LambdaMetafactory недоступен для использования.

Мне казалось, что андроид плагин сам конвертирует зависимости, если они используют java8.

Боюсь, вам только казалось. Такой магии там нет. Зависимость может и стримы использовать, или то же DateTime API, и плагин с этим ничего не сделает.

Ну не совсем так. В последней альфа версии плагина были добавлены именно бэкпорты некоторых API, включая Stream и DateTime.

Интересно, не видел еще. Возможно, потому что это альфа :) Надо будет попробовать в будущем, может, отпадет потребность в библиотеках ThreeTenABP и LightweightStreamAPI.
Но я так понимаю, все равно этот дешугаринг должен происходить при сборке непосредственно библиотеки; с готовыми библиотеками, собранными под Java 8 для стандартной JVM, плагин ничего делать не будет.
Блин, тоже был в этом уверен. Хорошо что узнал об этом на хабре, а не пытаясь что то заставить работать)
Спасибо. Теперь мне понятно почему на AOSP падают некоторые приложения, например aliexpress.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий