Android N Java 8-Funktionen (Jack Compiler) und Kotlin Interop

98

Update 3. KOTLIN WIRD JETZT OFFIZIELL FÜR DIE ENTWICKLUNG VON ANDROIDEN UNTERSTÜTZT . VON GOOGLE. YAAAAAAAAS!

Update 2 : Es sieht so aus, als ob JetBrains Kotlin für Android langfristig wirklich unterstützt . Ich bin ein glücklicher Kotlin-Benutzer :).

Update : Hadi Hariri von JetBrains erwähnte, dass sie einige Informationen zu diesem Thema veröffentlichen werden . Ich werde diesen Beitrag aktualisieren, sobald sie es tun.


=== DEPRECATED STUFF NEXT ===

Google hat gerade eine Vorschau für das kommende Android N mit einigen interessanten Funktionen veröffentlicht. Die bemerkenswerteste ist die teilweise Unterstützung der Java 8-Sprache . Dies ist aufgrund der neuen Jack-Toolchain möglich, an der Google arbeitet.

Die aktuelle Toolchain mit javac oder kotlinc :
javac ( .java-> .class) -> dx ( .class-> .dex)
kotlinc ( .kt-> .class) -> dx ( .class-> .dex)

Neue Jack-Toolchain:
Jack ( .java-> .jack-> .dex)

Ich gehe davon aus, dass Google Jack zur Standard-Toolchain für die Android-Entwicklung machen wird. Update: Jack ist jetzt veraltet . Ja.

Meine Frage ist, wie sich diese neue Toolchain in Zukunft auf mich als Kotlin- Benutzer für die Android-Entwicklung auswirken wird . Werde ich "in der Vergangenheit stecken bleiben"?

Tudor Luca
quelle
1
(kotlin_library (multiple * .kt) => .jar) dann Jill (.jar => Jayce) und dann in jack importieren (ähnlich wie andere (nicht android) (plain java) Gläser)
Selvin
Lesen der Dokumente: "Sie müssen nichts anders machen, um Jack zu verwenden. Verwenden Sie einfach Ihre Standard-Makefile-Befehle, um den Baum oder Ihr Projekt zu kompilieren. Jack ist die Standard-Android-Build-Toolchain für M." - source: source.android.com/source/jack.html Das ist doch ein Tippfehler und sie bedeuten 'N', nicht 'M' ?
Mark Keen
Jack ist tot, freue dich: P
EpicPandaForce

Antworten:

63

Haftungsausschluss: Ich arbeite an Jack

Dies wird Sie nicht betreffen. Kotlins Compiler erzeugt Java 6-Bytecode, den Jack / Jill problemlos importieren können.

Lukas Bergstrom
quelle
7
Können Sie uns einige Details dazu mitteilen? :)
Tudor Luca
Aber wird Kotlin von der Leistungsoptimierung von Jack profitieren können? (mindestens einen Tag), weil Jack ziemlich fantastisch zu sein scheint (ich kann es kaum erwarten, einen Benchmark zu erhalten)
NitroG42
Ich habe eine Videopräsentation eines Benchmarks des Autors von Proguard gesehen. Mit ein bisschen googeln können Sie ihn finden
Sakis Kaliakoudas
Wir haben einige Schwierigkeiten beim Erstellen des Android-Projekts mit der angehängten Kotlin stdlib. Sieht aus wie ein Fehler in Jill / Jack. Könnten Sie sich das bitte ansehen? code.google.com/p/android/issues/detail?id=196084
yanex
1
Bedeutet das, dass Jill keinen Java 8-Bytecode akzeptiert? Was ist mit Bibliotheksmodulen? Wenn sie zu .aar kompiliert und dann von Jill importiert werden, können sie dann auch nicht Java 8 verwenden? Bedeutet dies, dass neue Java-Funktionen nur für interne Projekt-Java-Quellen verfügbar sind?
Far.be
15

@ Pavel Dudka

Jack - ist ein Compiler. Ähnlich wie Javac, aber es macht etwas anderes:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, kompiliert Jack Java-Quellcode direkt in die Dex-Datei! Wir haben keine * .class-Zwischendateien mehr, daher wird das dx-Tool nicht benötigt!

Aber warte! Was ist, wenn ich eine Bibliothek eines Drittanbieters in mein Projekt einbinde (die als Sammlung von .class-Dateien geliefert wird)?

Und dann kommt Jill ins Spiel:

Geben Sie hier die Bildbeschreibung ein

Jill kann Klassendateien verarbeiten und in ein spezielles Jayce-Format umwandeln, das als Eingabe für den Jack-Compiler verwendet werden kann.

Lassen Sie uns jetzt für eine Sekunde beiseite treten und überlegen ... Was wird mit all den coolen Plugins passieren, nach denen wir so süchtig geworden sind? Sie alle brauchen .class-Dateien und Jack Compiler hat diese nicht mehr ...

Glücklicherweise bietet Jack einige der für uns wichtigen Funktionen sofort an:

  • Retrolambda - wird nicht benötigt. Jack kann mit Lambdas richtig umgehen
  • Proguard - es ist jetzt in Jack eingebrannt, sodass Sie weiterhin Verschleierung und Minimierung verwenden können

Vorteile:

Jack unterstützt die Java-Programmiersprache 1.7 und integriert zusätzliche Funktionen, die unten beschrieben werden.

  • Vordexen

    Beim Generieren einer JACK-Bibliotheksdatei wird der .dex der Bibliothek generiert und als Pre-Dex in der .jack-Bibliotheksdatei gespeichert. Beim Kompilieren verwendet JACK den Pre-Dex aus jeder Bibliothek erneut. Alle Bibliotheken sind vordexiert.

  • Inkrementelle Zusammenstellung

    Inkrementelle Kompilierung bedeutet, dass nur Komponenten, die seit der letzten Kompilierung berührt wurden, und ihre Abhängigkeiten neu kompiliert werden. Inkrementelle Kompilierung kann erheblich schneller sein als eine vollständige Kompilierung, wenn Änderungen nur auf einen begrenzten Satz von Komponenten beschränkt sind.

  • Umpacken

    JACK verwendet jarjar-Konfigurationsdateien, um das Umpacken durchzuführen.

  • Multidex-Unterstützung

    Da Dex-Dateien auf 65K-Methoden beschränkt sind, müssen Apps mit über 65K-Methoden in mehrere Dex-Dateien aufgeteilt werden. (Weitere Informationen zu Multidex finden Sie unter "Erstellen von Apps mit über 65.000 Methoden".)

Nachteile:

  • Die Transformations-API wird von Jack nicht unterstützt. Es gibt keinen Java-Zwischenbytecode, den Sie ändern können. Daher funktionieren einige Plugins, die ich hier nicht erwähnt habe, nicht mehr
  • Die Verarbeitung von Anmerkungen wird derzeit von Jack nicht unterstützt. Wenn Sie also stark von Bibliotheken wie Dagger, AutoValue usw. abhängig sind, sollten Sie zweimal überlegen, bevor Sie zu Jack wechseln. BEARBEITEN: Wie von Jake Wharton hervorgehoben, unterstützt Jack in N Preview die Verarbeitung von Anmerkungen, ist jedoch noch nicht über Gradle verfügbar.
  • Flusendetektoren, die auf Java-Bytecode-Ebene arbeiten, werden nicht unterstützt.
  • Jacoco wird nicht unterstützt - nun, ich persönlich finde Jacoco fragwürdig (es zeigt nicht wirklich, was Sie sehen möchten), kann also völlig ohne es leben
  • Dexguard - Enterprise-Version von Proguard wird derzeit nicht unterstützt
Dhaval Jivani
quelle
Gilt die 'Annotation-Verarbeitung wird derzeit nicht von Jack unterstützt' noch im September 2016? Es scheint, als ob es jetzt unterstützt wird ...
Ticofab
es wird unterstützt, aber es gibt immer noch Fehler: zB Datenbindung funktioniert noch nicht: siehe Android # 210615
TmTron
Beachten Sie, dass die Annotationsverarbeitung von Jack NICHT vollständig unterstützt wird - sie befindet sich in demselben altersschwachen Zustand wie im Eclipse Compiler, auf dem Jack basiert ( mehrere Methoden sind als Platzhalter implementiert, die beim Aufrufen Ausnahmen auslösen, es werden zahlreiche nicht behobene Fehler abgelegt auf EuGH Bugtracker).
user1643723
7

Google wird Jack nicht als Standardwerkzeug verwenden, aber Jack and Jill.
Das Kompilieren von .class-Dateien zu dex mit Jill ist hier, um zu bleiben. Ansonsten können Sie sich von jar / aar-Bibliotheken verabschieden.

Ob Jack oder Jill langsamer werden, steht noch zur Debatte. Das Android-Team hofft, dass Jack schneller sein wird als der aktuelle Build-Prozess, aber das ist derzeit nicht der Fall

Darüber hinaus sind Jack und Dex offen verfügbar. Nichts hindert das Kotlin-Team daran, ein Tool zu schreiben, das .jack- oder .dex-Dateien aus dem Kotlin-Quellcode ausgibt.

Teovald
quelle
7

UPDATE (16.03.2017)

Zum Glück ist Jack tot und hat keine Auswirkungen auf Kotlin-Entwickler.


Wenn Jack die Zukunft ist, werden Sie mit Kotlin in der Vergangenheit stecken bleiben. Derzeit unterstützt Jack keine Plugins, die Nicht-Java-Quellen in Dalvik-Bytecode kompilieren können. Und selbst wenn dies der Fall wäre, müsste JetBrains dem Kotlin-Compiler ein neues Backend hinzufügen, was keine triviale Aufgabe ist. Sie müssen also Kotlin mit Jill verwenden und es wird etwas sehr ähnliches sein wie die Toolchain, die Sie jetzt verwenden.

Wie Sie im Bild unten sehen können, können Sie das Projekt auch dann in ein Bibliotheksprojekt konvertieren, um Jill zu verwenden, wenn es unmöglich ist, Jack explizit auszuschalten. Das Anwendungsprojekt verweist nur auf dieses Bibliotheksprojekt.

Jack und Jill Application Build

Ich sehe nur, wie Kotlin mit Jack arbeiten kann, was wahrscheinlich nicht implementiert wird, indem ich dem Kotlin-Compiler ein Java-Backend hinzufüge, dh ein Backend, das Java-Code wie Xtend generiert . In diesem Fall kann vom Kotlin-Compiler generierter Code von Jack wie jeder andere Java-Code verarbeitet werden.

Aber im Moment wissen wir nicht genau, was Jack unterstützen wird, wenn es veröffentlicht wird. Vielleicht ändert sich etwas dramatisch und das Hinzufügen von Kotlin-Unterstützung zu Jack wird möglich.

Michael
quelle
7
Eigentlich hat das Kotlin-Team Pläne, Jack & Jill zu unterstützen. Ich habe bei ihrem Live-Event davon gehört, aber ich würde lieber einen offiziellen Beitrag von JetBrains hier bevorzugen, also habe ich die Frage nicht beantwortet.
Hotkey
Das wäre großartig, aber die einzige Unterstützung, von der ich gehört habe, ist über Jill. Und wie ich in der Antwort erwähnt habe, gibt es nicht so viele Möglichkeiten, diese Unterstützung hinzuzufügen.
Michael
Tatsächlich hatte die In-Memory-Code-Generierung (und die viel weniger realistische Option Kotlin -> dex) etwas zu bieten, sodass der Kotlin-Android-Build ebenfalls erheblich beschleunigt werden konnte.
Hotkey
Verstehen Sie nicht, wie sich die In-Memory-Codegenerierung auf die Jack-Integration auswirkt. Und Kotlin to Dex-Kompilierung bedeutet, dass JetBrains eine eigene Toolchain schreiben und unterstützen muss, die Jack ähnelt.
Michael
1
Ich bin mir nicht sicher, ob jemand anderes als das Kotlin-Team sagen sollte, was er kann und was nicht oder was er tun oder nicht tun könnte. Sie haben bereits darüber gesprochen und haben Pläne, die sie präsentieren können.
Jayson Minard
5

Wie in dem Blog-Beitrag ( Kotlins Android Roadmap ) gesagt , der heute erschien:

Momentan gibt es einige Probleme, die Jack daran hindern, den von Kotlin generierten Bytecode korrekt zu behandeln ( 196084 und 203531 ). Wir planen jedoch, mit dem Google-Team zusammenzuarbeiten, um entweder die Probleme zu beheben oder Problemumgehungen auf unserer Seite bereitzustellen. Sobald dies erledigt ist, können wir während der inkrementellen Kompilierung nur geänderte Klassendateien mit Jill übersetzen, anstatt jedes Mal alle Klassendateien zu übersetzen (was das einzig mögliche Verhalten in den alten Android-Tools ist).

Also wird Kotlin Jack & Jill irgendwann unterstützen und davon profitieren.

Hotkey
quelle
2

Laut aktueller Google-Ankündigung -

Wir haben uns entschlossen, die Unterstützung für Java 8-Sprachfunktionen direkt in die aktuellen Javac- und DX-Tools aufzunehmen und die Jack-Toolchain zu verwerfen. Mit dieser neuen Richtung sollten vorhandene Tools und Plugins, die vom Dateiformat der Java-Klasse abhängen, weiterhin funktionieren. In Zukunft werden Java 8-Sprachfunktionen vom Android-Build-System nativ unterstützt. Wir möchten dies in den kommenden Wochen als Teil von Android Studio starten und diese Entscheidung frühzeitig mit Ihnen teilen.

Wir haben zunächst das Hinzufügen von Java 8-Unterstützung über die Jack-Toolchain getestet. Im Laufe der Zeit stellten wir fest, dass die Kosten für den Wechsel zu Jack für unsere Community zu hoch waren, als wir die betroffenen Anmerkungsprozessoren, Bytecode-Analysatoren und Umschreiber in Betracht zogen. Vielen Dank, dass Sie die Jack-Toolchain ausprobiert und uns ein großartiges Feedback gegeben haben. Sie können Jack weiterhin zum Erstellen Ihres Java 8-Codes verwenden, bis wir die neue Unterstützung veröffentlichen. Die Migration von Jack sollte wenig oder gar keine Arbeit erfordern.

Wir müssen uns also keine Sorgen machen, dass die Jack-Toolchain zur Standard-Toolchain für die Android-Entwicklung wird. Sie können weiterhin Kotlin oder normale Javac / DX-Tools verwenden.

Quelle: Future of Java 8 Language Feature Support für Android

Aniket Thakur
quelle
1

Ich habe diesen Blog-Beitrag bereits im offiziellen Kotlin-Blog gefunden :: Kotlins Android-Roadmap

Dort würden Sie einen Teil finden, der Folgendes sagt:

Das nächste, was wir zur Verbesserung der Android-Build-Leistung planen, ist die Integration in die neue Android- Toolchain von Jack und Jill . Momentan gibt es einige Probleme, die Jack daran hindern, den von Kotlin generierten Bytecode korrekt zu behandeln ( 196084 und 203531 ). Wir planen jedoch, mit dem Google-Team zusammenzuarbeiten, um entweder die Probleme zu beheben oder Problemumgehungen auf unserer Seite bereitzustellen. Sobald dies erledigt ist, können wir während der inkrementellen Kompilierung nur geänderte Klassendateien mit Jill übersetzen, anstatt jedes Mal alle Klassendateien zu übersetzen (was das einzig mögliche Verhalten in den alten Android-Tools ist).

Also, wie @LukasBergstrom sagte, wird es kein Problem mit "in der Vergangenheit stecken bleiben" geben ;-)

Sie können auch die RedditDiskussion zu diesem Thema überprüfen : Wie ist der Status von Kotlin mit Jack und Jill?

Viel Spaß beim Codieren.

piotrek1543
quelle
0

Laut Kotlin-Blog wird der Abschnitt mit den neuen Funktionen von Version 1.1-beta2 veröffentlicht:

Unterstützung für das Erstellen von Android-Projekten, wenn die Jack-Toolchain aktiviert ist (jackOptions {true});

David Kindred
quelle