Fitur Android N Java 8 (kompiler Jack) dan interop Kotlin

98

Pembaruan 3. KOTLIN SEKARANG DIDUKUNG SECARA RESMI UNTUK PENGEMBANGAN ANDROID . OLEH GOOGLE. YAAAAAAAAS!

Pembaruan 2 : Sepertinya JetBrains benar-benar berkomitmen untuk mendukung Kotlin untuk Android dalam jangka panjang . Saya adalah pengguna kotlin yang bahagia :).

Update : Hadi Hariri, dari JetBrains, menyebutkan bahwa mereka akan merilis beberapa info tentang topik ini . Saya akan memperbarui posting ini setelah mereka melakukannya.


=== HAL-HAL YANG TIDAK BERLAKU BERIKUTNYA ===

Google baru saja merilis pratinjau untuk Android N mendatang dengan beberapa fitur menarik, yang paling menonjol adalah dukungan bahasa Java 8 parsial . Ini dimungkinkan karena toolchain Jack baru yang sedang dikerjakan Google.

Toolchain saat ini menggunakan javac atau kotlinc :
javac ( .java-> .class) -> dx ( .class-> .dex)
kotlinc ( .kt-> .class) -> dx ( .class-> .dex)

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

Saya berasumsi Google akan mendorong ke depan untuk menjadikan Jack sebagai rantai alat default untuk pengembangan Android. Pembaruan: Jack sekarang tidak digunakan lagi . Yas.

Pertanyaan saya adalah bagaimana toolchain baru ini akan mempengaruhi saya, di masa depan, sebagai pengguna kotlin untuk pengembangan Android? Apakah saya akan "terjebak di masa lalu"?

Tudor Luca
sumber
1
(kotlin_library (multiple * .kt) => .jar) lalu Jill (.jar => Jayce) lalu impor ke jack (mirip seperti toples lain (non android) (plain java))
Selvin
Membaca dokumen: "Anda tidak perlu melakukan apa pun secara berbeda untuk menggunakan Jack - cukup gunakan perintah makefile standar Anda untuk mengompilasi pohon atau proyek Anda. Jack adalah toolchain build Android default untuk M." - sumber: source.android.com/source/jack.html pasti salah ketik dan maksudnya 'N' bukan 'M' ?
Mark Keen
Jack sudah mati, bersukacitalah: P
EpicPandaForce

Jawaban:

63

disclaimer: Saya menangani Jack

Ini tidak akan mempengaruhi Anda. Kompiler Kotlin menghasilkan bytecode Java 6, yang dapat diimpor oleh Jack / Jill dengan baik.

Lukas Bergstrom
sumber
7
Bisakah Anda membagikan beberapa detail tentang itu? :)
Tudor Luca
Tetapi apakah Kotlin dapat memanfaatkan pengoptimalan kinerja Jack? (setidaknya satu hari) karena jack tampaknya cukup luar biasa (saya tidak sabar menunggu patokan sekarang)
NitroG42
Saya telah melihat presentasi video tolok ukur dari penulis proguard, Dengan sedikit googling Anda akan dapat menemukannya
sakis kaliakoudas
Kami mengalami beberapa kesulitan dalam membuat proyek Android dengan stdlib Kotlin terpasang. Sepertinya bug di Jill / Jack. Bisakah Anda memeriksanya? code.google.com/p/android/issues/detail?id=196084
yanex
1
Apakah itu berarti Jill tidak menerima bytecode Java 8? Bagaimana dengan modul perpustakaan? Jika mereka dikompilasi ke .aar dan kemudian diimpor oleh Jill, apakah mereka juga tidak dapat menggunakan Java 8? Yaitu apakah itu berarti bahwa fitur baru Java hanya tersedia untuk sumber proyek internal .java?
far.be
15

@Pavel Dka

Jack - adalah kompiler. Mirip dengan javac, tetapi fungsinya sedikit berbeda:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, Jack mengkompilasi kode sumber Java langsung ke file Dex! Kami tidak lagi memiliki file menengah * .class, jadi alat dx tidak diperlukan!

Tapi tunggu! Bagaimana jika saya menyertakan pustaka pihak ketiga dalam proyek saya (yang datang sebagai kumpulan file .class)?

Dan saat itulah Jill mulai bermain:

masukkan deskripsi gambar di sini

Jill dapat memproses file kelas dan mengubahnya menjadi format Jayce khusus yang dapat digunakan sebagai masukan untuk kompiler Jack.

Jadi sekarang mari kita minggir sejenak dan berpikir ... Apa yang akan terjadi pada semua plugin keren yang membuat kita begitu kecanduan? Mereka semua membutuhkan file .class dan kompiler Jack tidak memilikinya lagi ...

Untungnya, Jack menyediakan beberapa fitur penting bagi kami di luar kotak:

  • Retrolambda - tidak diperlukan. Jack bisa menangani lambda dengan baik
  • Proguard - sekarang sudah dimasukkan ke dalam Jack, jadi Anda masih dapat menggunakan obfuscation dan minimisasi

Keuntungan:

Jack mendukung bahasa pemrograman Java 1.7 dan mengintegrasikan fitur tambahan yang dijelaskan di bawah ini.

  • Predexing

    Saat membuat file pustaka JACK, .dex pustaka dibuat dan disimpan di dalam file pustaka .jack sebagai pre-dex. Saat mengompilasi, JACK menggunakan kembali pre-dex dari setiap library. Semua perpustakaan sudah di-dex.

  • Kompilasi inkremental

    Kompilasi inkremental berarti bahwa hanya komponen yang disentuh sejak kompilasi terakhir, dan dependensinya, yang dikompilasi ulang. Kompilasi inkremental bisa jauh lebih cepat daripada kompilasi lengkap ketika perubahan dibatasi hanya pada sekumpulan komponen yang terbatas.

  • Mengemas kembali

    JACK menggunakan file konfigurasi jarjar untuk melakukan pengemasan ulang.

  • Dukungan multidex

    Karena file dex dibatasi hingga 65 ribu metode, aplikasi dengan lebih dari 65 ribu metode harus dipecah menjadi beberapa file dex. (Lihat 'Membangun Aplikasi dengan Lebih dari 65K Metode' untuk informasi lebih lanjut tentang multidex.)

Kekurangan:

  • Transform API tidak didukung oleh Jack - tidak ada bytecode Java perantara yang dapat Anda modifikasi, jadi beberapa plugin yang tidak saya sebutkan di sini akan berhenti berfungsi
  • Pemrosesan anotasi saat ini tidak didukung oleh Jack, jadi jika Anda sangat bergantung pada pustaka seperti Dagger, AutoValue, dll., Anda harus berpikir dua kali sebelum beralih ke Jack. EDIT: Seperti yang ditunjukkan oleh Jake Wharton, Jack di N Preview memiliki dukungan pemrosesan anotasi, tetapi belum diekspos melalui Gradle.
  • Pendeteksi lint yang beroperasi pada level bytecode Java tidak didukung.
  • Jacoco tidak didukung - yah, menurut saya Jacoco patut dipertanyakan (tidak benar-benar menunjukkan apa yang ingin Anda lihat), jadi saya bisa hidup tanpanya
  • Dexguard - Proguard versi perusahaan saat ini tidak didukung
Dhaval Jivani
sumber
apakah 'Pemrosesan anotasi saat ini tidak didukung oleh Jack' masih berlaku per September 2016? Sepertinya sekarang didukung ...
ticofab
ini didukung, tetapi masih ada bug: mis. pengikatan data belum berfungsi: lihat android # 210615
TmTron
Perhatikan, bahwa pemrosesan anotasi TIDAK didukung sepenuhnya oleh Jack - ini dalam keadaan jompo yang sama seperti di Eclipse Compiler, yang menjadi dasar Jack ( beberapa metode diimplementasikan sebagai placeholder, yang memunculkan pengecualian saat dipanggil , ada banyak bug yang belum diperbaiki, diajukan pada bugtracker ECJ).
pengguna1643723
7

Google tidak akan mendorong Jack sebagai alat default, tetapi Jack and Jill.
Kompilasi file .class ke dex dengan Jill akan tetap ada. Jika tidak, Anda dapat mengucapkan selamat tinggal pada perpustakaan jar / aar.

Apakah Jack atau Jill akan lebih lambat masih diperdebatkan. Tim Android berharap jack akan lebih cepat daripada proses build saat ini, tetapi bukan itu masalahnya saat ini

Selain itu, Jack dan Dex tersedia di tempat terbuka, tidak ada yang mencegah tim kotlin menulis alat yang mengeluarkan file .jack atau .dex dari kotlin source code.

Teovald
sumber
7

PEMBARUAN (03/16/2017)

Untungnya, Jack sudah mati sehingga tidak akan memengaruhi developer Kotlin.


Jika Jack adalah masa depan maka Anda akan terjebak di masa lalu dengan Kotlin. Saat ini Jack tidak mendukung plugin yang dapat mengkompilasi sumber non-Java menjadi bytecode Dalvik. Dan bahkan jika itu terjadi, JetBrains perlu menambahkan backend baru ke compiler Kotlin yang bukan merupakan tugas yang sepele. Jadi Anda harus menggunakan Kotlin dengan Jill dan itu akan menjadi sesuatu yang sangat mirip dengan toolchain yang Anda gunakan sekarang.

Seperti yang Anda lihat pada gambar di bawah ini meskipun tidak mungkin untuk mematikan Jack secara eksplisit, Anda masih dapat mengubah proyek menjadi proyek perpustakaan untuk menggunakan Jill. Dan proyek aplikasi hanya akan mereferensikan proyek perpustakaan ini.

Pembuatan Aplikasi Jack dan Jill

Satu-satunya cara saya melihat bagaimana Kotlin dapat bekerja dengan Jack, yang mungkin tidak akan diterapkan, adalah menambahkan backend Java ke kompilator Kotlin, yaitu backend yang menghasilkan kode Java seperti Xtend . Dalam kasus ini, kode yang dihasilkan oleh compiler Kotlin dapat diproses oleh Jack sebagai kode Java lainnya.

Tetapi saat ini kami tidak tahu persis apa yang akan didukung Jack ketika dirilis. Mungkin sesuatu akan berubah secara dramatis dan menambahkan dukungan Kotlin ke Jack akan menjadi mungkin.

Michael
sumber
7
Sebenarnya tim Kotlin memiliki rencana untuk mendukung Jack & Jill, saya mendengarnya di acara langsung mereka, tetapi saya lebih suka posting resmi dari JetBrains di sini, jadi saya tidak menjawab pertanyaan itu.
hotkey
Itu akan bagus tapi satu-satunya dukungan yang saya dengar adalah melalui Jill. Dan seperti yang saya sebutkan dalam jawaban, tidak banyak cara untuk menambahkan dukungan ini.
Michael
Faktanya, ada sesuatu tentang pembuatan kode dalam memori (dan tentang opsi yang kurang realistis, Kotlin -> dex), sehingga Kotlin Android build juga akan memiliki percepatan yang signifikan.
hotkey
Tidak mengerti bagaimana hubungan pembuatan kode dalam memori dengan integrasi Jack. Dan kompilasi Kotlin ke dex berarti JetBrains perlu menulis dan mendukung toolchain mereka sendiri yang mirip dengan Jack.
Michael
1
Tidak yakin siapa pun selain tim Kotlin harus mengatakan apa yang mereka bisa dan tidak bisa lakukan, atau apa yang mungkin atau mungkin tidak mereka lakukan. Mereka telah membicarakan hal ini sebelumnya, dan memiliki rencana yang dapat mereka sampaikan.
Jayson Minard
5

Seperti yang dikatakan dalam posting blog ( Kotlin's Android Roadmap ) yang muncul hari ini:

Saat ini ada beberapa masalah yang mencegah Jack menangani bytecode yang dibuat oleh Kotlin dengan benar ( 196084 dan 203531 ), tetapi kami berencana untuk bekerja sama dengan tim Google untuk menyelesaikan masalah atau memberikan solusi di pihak kami. Setelah ini selesai, kami hanya dapat menerjemahkan file kelas yang diubah menggunakan Jill selama kompilasi inkremental, sebagai kebalikan dari menerjemahkan semua file kelas setiap saat (yang merupakan satu-satunya perilaku yang mungkin dalam alat Android lama).

Jadi Kotlin pada akhirnya akan mendukung Jack & Jill dan mendapatkan keuntungan darinya.

hotkey
sumber
2

Sesuai pengumuman google terbaru -

Kami telah memutuskan untuk menambahkan dukungan untuk fitur bahasa Java 8 langsung ke set alat javac dan dx saat ini, dan menghentikan toolchain Jack. Dengan arah baru ini, alat dan plugin yang ada yang bergantung pada format file kelas Java akan terus berfungsi. Ke depannya, fitur bahasa Java 8 akan didukung secara native oleh sistem build Android. Kami bertujuan untuk meluncurkan ini sebagai bagian dari Android Studio dalam beberapa minggu mendatang, dan kami ingin membagikan keputusan ini lebih awal dengan Anda.

Kami awalnya menguji menambahkan dukungan Java 8 melalui toolchain Jack. Seiring waktu, kami menyadari biaya beralih ke Jack terlalu tinggi bagi komunitas kami ketika kami mempertimbangkan pemroses anotasi, penganalisis bytecode, dan penulis ulang yang terkena dampak. Terima kasih telah mencoba toolchain Jack dan memberi kami umpan balik yang bagus. Anda dapat terus menggunakan Jack untuk membuat kode Java 8 Anda hingga kami merilis dukungan baru. Bermigrasi dari Jack seharusnya membutuhkan sedikit atau tanpa pekerjaan.

Jadi kita tidak perlu khawatir tentang jack toolchain menjadi toolchain default untuk pengembangan android. Anda dapat terus menggunakan kotlin atau menggunakan seperangkat alat javac / dx normal.

Sumber: Dukungan Fitur Bahasa Java 8 Masa Depan di Android

Aniket Thakur
sumber
1

Saya sudah menemukan entri blog ini dari blog resmi Kotlin:: Peta Jalan Android Kotlin

Di sana Anda akan menemukan bagian yang mengatakan bahwa:

Hal berikutnya yang kami rencanakan untuk meningkatkan performa build Android adalah menyediakan integrasi dengan toolchain Jack and Jill Android yang baru . Saat ini ada beberapa masalah yang mencegah Jack menangani bytecode yang dibuat oleh Kotlin dengan benar ( 196084 dan 203531 ), tetapi kami berencana untuk bekerja sama dengan tim Google untuk menyelesaikan masalah atau memberikan solusi di pihak kami. Setelah ini selesai, kami hanya dapat menerjemahkan file kelas yang diubah menggunakan Jill selama kompilasi tambahan, sebagai lawan menerjemahkan semua file kelas setiap saat (yang merupakan satu-satunya perilaku yang mungkin dalam alat Android lama).

Jadi seperti yang dikatakan @LukasBergstrom, tidak akan ada masalah dengan "macet di masa lalu" ;-)

Anda juga dapat memeriksa Redditdiskusi yang terkait dengan topik ini: Bagaimana status Kotlin dengan Jack dan Jill?

Selamat membuat kode.

piotrek 1543
sumber
0

Menurut blog Kotlin , rilis 1.1-beta2 bagian Fitur Baru:

Dukungan untuk membuat proyek Android saat toolchain Jack diaktifkan (jackOptions {true});

David Kindred
sumber