Recursos do Android N Java 8 (compilador Jack) e interoperabilidade Kotlin


98

Atualização 3. O KOTLIN AGORA É OFICIALMENTE SUPORTADO PARA O DESENVOLVIMENTO ANDROID . POR GOOGLE. YAAAAAAAAS!

Atualização 2 : Parece que a JetBrains está realmente comprometida em oferecer suporte ao Kotlin para Android a longo prazo . Sou um usuário feliz do kotlin :).

Atualização : Hadi Hariri, da JetBrains, mencionou que vai lançar algumas informações sobre este assunto . Vou atualizar este post assim que eles fizerem.


=== MATERIAL DESCONTINUADO PRÓXIMO ===

O Google acaba de lançar uma prévia do Android N com alguns recursos interessantes, sendo o mais notável o suporte parcial à linguagem Java 8 . Isso é possível devido ao novo conjunto de ferramentas Jack no qual o Google está trabalhando.

O conjunto de ferramentas atual usando javac ou kotlinc :
javac ( .java-> .class) -> dx ( .class-> .dex)
kotlinc ( .kt-> .class) -> dx ( .class-> .dex)

Novo conjunto de ferramentas Jack:
Jack ( .java-> .jack-> .dex)

Estou assumindo que o Google avançará no sentido de tornar o Jack o conjunto de ferramentas padrão para o desenvolvimento do Android. Atualização: Jack agora está obsoleto . Sim.

Minha pergunta é como esse novo conjunto de ferramentas me afetará, no futuro, como um usuário kotlin para desenvolvimento Android? Ficarei "preso ao passado"?


1
(kotlin_library (multiple * .kt) => .jar), em seguida, Jill (.jar => Jayce), em seguida, importar para jack (semelhante a outro (não android) (java simples) jars)
Selvin

Lendo os documentos: "Você não precisa fazer nada diferente para usar o Jack - apenas use seus comandos makefile padrão para compilar a árvore ou seu projeto. Jack é o conjunto de ferramentas de construção Android padrão para M." - source: source.android.com/source/jack.html certamente isso é um erro de digitação e eles significam 'N' e não 'M' ?
Mark Keen

Jack está morto, alegre-se: P
EpicPandaForce

Respostas:


63

isenção de responsabilidade: eu trabalho no Jack

Isso não afetará você. O compilador de Kotlin produz bytecode Java 6, que Jack / Jill pode importar perfeitamente.


7
Você pode compartilhar alguns detalhes sobre isso? :)
Tudor Luca

Mas será que Kotlin será capaz de beneficiar a otimização de desempenho de Jack? (pelo menos um dia) porque jack parece bem incrível (mal posso esperar por algum benchmark agora)
NitroG42

Eu vi um vídeo de apresentação de um benchmark do autor de Proguard, com um pouco de pesquisa no Google você vai conseguir encontrar
sakis kaliakoudas

Estamos enfrentando algumas dificuldades para compilar o projeto Android com o Kotlin stdlib anexado. Parece um bug em Jill / Jack. Você poderia dar uma olhada nisso? code.google.com/p/android/issues/detail?id=196084
yanex

1
Isso significa que Jill não aceita bytecode Java 8? E os módulos da biblioteca? Se eles forem compilados em .aar e importados por Jill, eles também não poderão usar o Java 8? Ou seja, isso significa que os novos recursos do Java estão disponíveis apenas para fontes internas de projetos .java?
far.be

15

@Pavel Dudka

Jack - é um compilador. Semelhante ao javac, mas faz uma coisa um pouco diferente:

insira a descrição da imagem aqui

Como você pode ver, Jack compila o código-fonte Java diretamente no arquivo Dex! Não temos mais arquivos * .class intermediários, então a ferramenta dx não é necessária!

Mas espere! E se eu incluir uma biblioteca de terceiros em meu projeto (que vem como uma coleção de arquivos .class)?

E é aí que Jill entra em jogo:

insira a descrição da imagem aqui

Jill pode processar arquivos de classe e transformá-los em um formato Jayce especial que pode ser usado como entrada para o compilador Jack.

Então, agora vamos dar um passo de lado por um segundo e pensar ... O que vai acontecer com todos aqueles plugins legais nos quais ficamos tão viciados? Todos eles precisam de arquivos .class e o compilador Jack não os tem mais ...

Felizmente, Jack fornece alguns desses recursos importantes para nós prontos para uso:

  • Retrolambda - não será necessário. Jack pode lidar com lambdas corretamente
  • Proguard - agora está embutido no Jack, então você ainda pode usar ofuscação e minimização

Vantagens:

Jack oferece suporte à linguagem de programação Java 1.7 e integra recursos adicionais descritos abaixo.

  • Predexing

    Ao gerar um arquivo de biblioteca JACK, o .dex da biblioteca é gerado e armazenado dentro do arquivo de biblioteca .jack como um pré-dex. Ao compilar, JACK reutiliza o pré-dex de cada biblioteca. Todas as bibliotecas são pré-dexadas.

  • Compilação incremental

    Compilação incremental significa que apenas os componentes que foram tocados desde a última compilação e suas dependências são recompilados. A compilação incremental pode ser significativamente mais rápida do que uma compilação completa quando as alterações são limitadas a apenas um conjunto limitado de componentes.

  • Reembalagem

    JACK usa arquivos de configuração jarjar para fazer o reempacotamento.

  • Suporte Multidex

    Como os arquivos dex são limitados a métodos de 65K, os aplicativos com métodos de mais de 65K devem ser divididos em vários arquivos dex. (Consulte 'Criando aplicativos com mais de 65 mil métodos' para obter mais informações sobre multidex.)

Desvantagens:

  • A API de transformação não é suportada pelo Jack - não há bytecode Java intermediário que você possa modificar, então alguns plug-ins que não mencionei aqui irão parar de funcionar
  • O processamento de anotações não é suportado atualmente pelo Jack, então se você depende muito de bibliotecas como Dagger, AutoValue, etc., você deve pensar duas vezes antes de mudar para o Jack. EDIT: Como apontado por Jake Wharton, Jack in N Preview tem suporte para processamento de anotação, mas ainda não foi exposto por meio do Gradle.
  • Os detectores de lint que operam em um nível de bytecode Java não são suportados.
  • Jacoco não é suportado - bem, eu pessoalmente acho o Jacoco questionável (ele realmente não mostra o que você quer ver), então posso viver totalmente sem ele
  • Dexguard - a versão empresarial do Proguard não é atualmente suportada

o 'Processamento de anotação não é suportado por Jack' ainda é válido em setembro de 2016? Parece que agora é compatível ...
ticofab

ele é compatível, mas ainda existem bugs: por exemplo, a vinculação de dados ainda não funciona: consulte o android # 210615
TmTron

Observe que o processamento de anotações NÃO É totalmente suportado pelo Jack - ele está no mesmo estado decrépito do Compilador Eclipse, no qual Jack se baseia ( vários métodos são implementados como marcadores de posição, que lançam exceções quando chamados , há vários bugs não corrigidos, arquivados no bugtracker do ECJ).
user1643723

7

O Google não vai colocar o Jack como a ferramenta padrão, mas Jack and Jill.
Compilar arquivos .class para dex com Jill veio para ficar. Caso contrário, você pode dizer adeus às bibliotecas jar / aar.

Se Jack ou Jill serão mais lentos, ainda está em debate. A equipe do Android espera que o jack seja mais rápido do que o processo de compilação atual, mas esse não é o caso agora

Além disso, Jack e Dex estão disponíveis abertamente, nada impede que a equipe do kotlin escreva uma ferramenta que emita arquivos .jack ou .dex do código fonte do kotlin.


7

ATUALIZAÇÃO (16/03/2017)

Felizmente, Jack está morto e isso não afetará os desenvolvedores do Kotlin.


Se Jack for o futuro, você ficará preso ao passado com Kotlin. Atualmente, o Jack não oferece suporte a plug-ins que podem compilar fontes não-Java no bytecode Dalvik. E mesmo que fizesse, o JetBrains precisaria adicionar um novo back-end ao compilador Kotlin, o que não é uma tarefa trivial. Portanto, você terá que usar o Kotlin com Jill e será algo muito semelhante ao conjunto de ferramentas que você usa agora.

Como você pode ver na imagem abaixo, mesmo que seja impossível desligar explicitamente o Jack, você ainda poderá converter o projeto em um projeto de biblioteca para usar Jill. E o projeto do aplicativo apenas fará referência a este projeto de biblioteca.

Jack e Jill Application Build

A única maneira de ver como Kotlin pode funcionar com Jack, o que provavelmente não será implementado, é adicionando um back-end Java ao compilador Kotlin, ou seja, um back-end que gera código Java como o Xtend . Nesse caso, o código gerado pelo compilador Kotlin pode ser processado por Jack como qualquer outro código Java.

Mas no momento não sabemos exatamente o que Jack apoiará quando for lançado. Talvez algo mude drasticamente e a adição de suporte Kotlin a Jack se torne possível.


7
Na verdade, a equipe de Kotlin tem planos de apoiar Jack e Jill, eu ouvi sobre isso em seu evento ao vivo, mas prefiro um post oficial da JetBrains aqui, então não respondi a pergunta.
tecla de atalho de

Isso seria ótimo, mas o único suporte que ouvi é por meio de Jill. E como mencionei na resposta, não há tantas maneiras de adicionar esse suporte.
Michael

Na verdade, havia algo sobre a geração de código na memória (e sobre uma opção muito menos realista, Kotlin -> dex), de modo que a construção do Kotlin Android também teria uma aceleração significativa.
tecla de atalho de

Não entendo como a geração de código na memória se relaciona com a integração Jack. E a compilação Kotlin para dex significa que o JetBrains precisa escrever e suportar seu próprio conjunto de ferramentas semelhante ao Jack.
Michael

1
Não tenho certeza se alguém além da equipe Kotlin deve dizer o que pode e o que não pode fazer, ou o que pode ou não fazer. Eles já falaram sobre isso antes e têm planos que podem apresentar.
Jayson Minard

5

Conforme dito na postagem do blog ( Kotlin's Android Roadmap ) que apareceu hoje:

No momento, existem alguns problemas que impedem Jack de lidar com o bytecode gerado pelo Kotlin corretamente ( 196084 e 203531 ), mas planejamos trabalhar junto com a equipe do Google para resolver os problemas ou fornecer soluções alternativas de nossa parte. Uma vez feito isso , seremos capazes de traduzir apenas os arquivos de classe alterados usando Jill durante a compilação incremental, ao invés de traduzir todos os arquivos de classe todas as vezes (que é o único comportamento possível nas antigas ferramentas do Android).

Portanto, Kotlin acabará apoiando Jack e Jill e obterá benefícios com isso.


2

De acordo com o último anúncio do Google -

Decidimos adicionar suporte para recursos da linguagem Java 8 diretamente no conjunto de ferramentas javac e dx atual e descontinuar o conjunto de ferramentas Jack. Com essa nova direção, as ferramentas e plug-ins existentes dependentes do formato de arquivo da classe Java devem continuar a funcionar. No futuro, os recursos da linguagem Java 8 terão suporte nativo do sistema de construção do Android. Pretendemos lançar isso como parte do Android Studio nas próximas semanas e gostaríamos de compartilhar essa decisão com você o quanto antes.

Inicialmente testamos a adição de suporte a Java 8 por meio do conjunto de ferramentas Jack. Com o tempo, percebemos que o custo de mudar para Jack era muito alto para nossa comunidade quando consideramos os processadores de anotação, analisadores de bytecode e reescritores afetados. Obrigado por experimentar o conjunto de ferramentas Jack e nos dar ótimos comentários. Você pode continuar usando o Jack para construir seu código Java 8 até lançarmos o novo suporte. Migrar de Jack deve exigir pouco ou nenhum trabalho.

Portanto, não precisamos nos preocupar com o conjunto de ferramentas jack se tornando o conjunto de ferramentas padrão para o desenvolvimento do Android. Você pode continuar a usar o kotlin ou usar o conjunto normal de ferramentas javac / dx.

Fonte: Future of Java 8 Language Feature Support no Android


1

Já encontrei esta postagem do blog oficial do Kotlin:: Roteiro do Android do Kotlin

Lá você encontrará uma parte que diz que:

A próxima coisa que planejamos fazer para melhorar o desempenho de construção do Android é fornecer uma integração com a nova cadeia de ferramentas Jack e Jill do Android . No momento, existem alguns problemas que impedem Jack de lidar com o bytecode gerado pelo Kotlin corretamente ( 196084 e 203531 ), mas planejamos trabalhar junto com a equipe do Google para resolver os problemas ou fornecer soluções alternativas de nossa parte. Uma vez feito isso, seremos capazes de traduzir apenas os arquivos de classe alterados usando Jill durante a compilação incremental, em vez de traduzir todos os arquivos de classe todas as vezes (que é o único comportamento possível nas ferramentas antigas do Android).

Então, como @LukasBergstrom disse, não haverá nenhum problema em "travar no passado" ;-)

Você também pode verificar a Redditdiscussão relacionada a este tópico: Qual é o status de Kotlin com Jack e Jill?

Boa codificação.


0

De acordo com o blog do Kotlin , lançamento da seção 1.1-beta2 Novos recursos:

Suporte para construção de projetos Android quando o conjunto de ferramentas Jack está habilitado (jackOptions {true});

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.