Android N Java 8 özellikleri (Jack derleyicisi) ve Kotlin birlikte çalışması


98

Güncelleme 3. KOTLIN ARTIK ANDROID GELİŞTİRME İÇİN RESMİ OLARAK DESTEKLENMEKTEDİR . GOOGLE TARAFINDAN. YAAAAAAAAS!

Güncelleme 2 : Görünüşe göre JetBrains, uzun vadede Android için Kotlin'i gerçekten desteklemeye kararlı . Ben mutlu bir kotlin kullanıcısıyım :).

Güncelleme : JetBrains'ten Hadi Hariri, bu konu hakkında bazı bilgiler yayınlayacaklarından bahsetti . Yaptıklarında bu gönderiyi güncelleyeceğim.


=== KULLANIMDAN KALDIRILMIŞ ŞEYLER SONRAKİ ===

Google, bazı ilginç özelliklere sahip yaklaşan Android N için bir önizleme yayınladı, en dikkate değer olanı kısmi Java 8 dil desteği . Bu, Google'ın üzerinde çalıştığı yeni Jack araç zinciri nedeniyle mümkün .

Kullanarak mevcut araç zinciri javac veya kotlinc :
Javac ( .java-> .class) -> dx ( .class-> .dex)
kotlinc ( .kt-> .class) -> dx ( .class-> .dex)

Yeni Jack araç zinciri:
Jack ( .java-> .jack-> .dex)

Google'ın Jack'i Android geliştirme için varsayılan araç zinciri yapma yolunda ilerleyeceğini varsayıyorum . Güncelleme: Jack artık kullanımdan kaldırıldı . Yas.

Sorum şu; bu yeni araç zinciri, gelecekte Android geliştirme için bir kotlin kullanıcısı olarak beni nasıl etkileyecek ? "Geçmişte takılıp kalacağım" mı?


1
(kotlin_library (çoklu * .kt) => .jar) sonra Jill (.jar => Jayce) sonra jack'a aktar (diğer (android olmayan) (sade java) kavanozlarına benzer)
Selvin

Belgeleri okumak: "Jack'i kullanmak için farklı bir şey yapmanız gerekmez - ağacı veya projenizi derlemek için standart makefile komutlarınızı kullanın. Jack, M için varsayılan Android derleme araç zinciridir." - kaynak: source.android.com/source/jack.html kesinlikle bu bir yazım hatası ve 'N' , 'M' değil mi?
Mark Keen

Jack öldü, sevinin: P
EpicPandaForce

Yanıtlar:


63

feragatname: Jack üzerinde çalışıyorum

Bu seni etkilemeyecek. Kotlin'in derleyicisi, Jack / Jill'in gayet iyi içe aktarabileceği Java 6 bayt kodunu üretir.


7
Bununla ilgili bazı ayrıntıları paylaşır mısınız? :)
Tudor Luca

Ancak Kotlin, Jack'in performans optimizasyonundan yararlanabilecek mi? (en az bir gün) çünkü jack oldukça harika görünüyor (şu anda bazı kriterler için sabırsızlanıyorum)
NitroG42

Bunu bulmak mümkün olacak googling ile biraz, ProGuard yazarı bir kriter video sunumunu gördüm
sakis kaliakoudas

Ekli Kotlin stdlib ile Android projesini oluştururken bazı zorluklar yaşıyoruz. Jill / Jack'teki bir hataya benziyor. Lütfen içine bakar mısınız? code.google.com/p/android/issues/detail?id=196084
yanex

1
Jill'in Java 8 bayt kodunu kabul etmediği anlamına mı geliyor? Kütüphane modülleri ne olacak? .Aar olarak derlenirlerse ve Jill tarafından içe aktarılırlarsa, Java 8 kullanamazlar mı? Yani bu, Java'nın yeni özelliklerinin yalnızca dahili proje .java kaynakları için mevcut olduğu anlamına mı geliyor?
far.be

15

@Pavel Dudka

Jack - bir derleyicidir. Javac'a benzer, ancak biraz farklı bir şey yapar:

görüntü açıklamasını buraya girin

Gördüğünüz gibi Jack, Java kaynak kodunu doğrudan Dex dosyasına derliyor! Artık ara * .class dosyalarımız yok, bu yüzden dx aracına gerek yok!

Fakat bekle! Projeme bir üçüncü taraf kitaplığı eklersem (.class dosyalarından oluşan bir koleksiyon olarak gelir) ne olur?

İşte o zaman Jill devreye giriyor:

görüntü açıklamasını buraya girin

Jill, sınıf dosyalarını işleyebilir ve bunları Jack derleyicisi için girdi olarak kullanılabilecek özel Jayce biçimine dönüştürebilir.

Öyleyse şimdi biraz kenara çekilip düşünelim ... Bu kadar bağımlı olduğumuz tüm o harika eklentilere ne olacak? Hepsinin .class dosyalarına ihtiyacı var ve Jack derleyicisi artık bunlara sahip değil ...

Neyse ki Jack, bizim için önemli özelliklerden bazılarını kutudan çıkarıyor:

  • Retrolambda - gerekli olmayacak. Jack lambdaları düzgün bir şekilde idare edebilir
  • Proguard - şimdi Jack'e pişirildi, böylece gizlemeyi ve küçültmeyi kullanmaya devam edebilirsiniz

Avantajlar:

Jack, Java programlama dili 1.7'yi destekler ve aşağıda açıklanan ek özellikleri entegre eder.

  • Hazırlık

    Bir JACK kitaplık dosyası oluştururken, kitaplığın .dex'i oluşturulur ve ön dex olarak .jack kitaplık dosyası içinde saklanır. JACK, derlerken her kitaplıktaki ön dex'i yeniden kullanır. Tüm kütüphaneler önceden tanımlanmıştır.

  • Artımlı derleme

    Artımlı derleme, yalnızca son derlemeden bu yana dokunulan bileşenlerin ve bunların bağımlılıklarının yeniden derlendiği anlamına gelir. Artımlı derleme, değişiklikler yalnızca sınırlı bir bileşen kümesiyle sınırlı olduğunda tam derlemeden önemli ölçüde daha hızlı olabilir.

  • Yeniden paketleme

    JACK, yeniden paketleme yapmak için jarjar yapılandırma dosyalarını kullanır.

  • Multidex desteği

    Dex dosyaları 65.000 yöntemle sınırlı olduğundan, 65.000'den fazla yöntemi olan uygulamalar birden çok dex dosyasına bölünmelidir. (Multidex hakkında daha fazla bilgi için bkz. '65K'dan Fazla Yöntemle Uygulama Oluşturma'.)

Dezavantajları:

  • Dönüştürme API'si Jack tarafından desteklenmez - değiştirebileceğiniz ara Java bayt kodu yoktur, bu nedenle burada bahsetmediğim bazı eklentiler çalışmayı durduracak
  • Ek açıklama işleme şu anda Jack tarafından desteklenmemektedir, bu nedenle, Dagger, AutoValue, vb. Gibi kitaplıklara büyük ölçüde bağımlıysanız, Jack'e geçmeden önce iki kez düşünmelisiniz. DÜZENLEME: Jake Wharton tarafından belirtildiği gibi, Jack in N Preview ek açıklama işleme desteğine sahiptir, ancak henüz Gradle aracılığıyla gösterilmemiştir.
  • Java bayt kodu seviyesinde çalışan lif detektörleri desteklenmez.
  • Jacoco desteklenmiyor - ben şahsen Jacoco'yu şüpheli buluyorum (gerçekten görmek istediklerinizi göstermiyor), bu yüzden onsuz tamamen yaşayabilir
  • Dexguard - Proguard'ın kurumsal sürümü şu anda desteklenmiyor

"Ek açıklama işleme şu anda Jack tarafından desteklenmiyor", Eylül 2016 itibarıyla hâlâ geçerli mi? Görünüşe göre şimdi destekleniyor ...
ticofab

destekleniyor, ancak hala hatalar var: örneğin, veri bağlama henüz çalışmıyor: bkz. android # 210615
TmTron

Ek açıklama işlemenin Jack tarafından tam olarak desteklenmediğini unutmayın - Jack'in temel aldığı Eclipse Compiler ile aynı yıpranmış durumda ( yer tutucular olarak uygulanmış, çağrıldığında istisnalar atan birçok yöntem vardır, çok sayıda düzeltilmemiş hata vardır, dosyalanmış ECJ bugtracker üzerinde).
user1643723

7

Google, Jack'i varsayılan araç olarak zorlamayacak, ancak Jack and Jill.
Jill ile .class dosyalarını dex'e derlemek burada kalıcıdır. Aksi takdirde, jar / aar kitaplıklarına veda edebilirsiniz.

Jack veya Jill'in daha yavaş olup olmayacağı hala tartışmalı. Android ekibi, jack'in mevcut geliştirme sürecinden daha hızlı olacağını umuyor, ancak şu anda durum böyle değil

Dahası, Jack ve Dex açıkta mevcuttur, hiçbir şey kotlin ekibinin .jack veya .dex dosyalarını kotlin kaynak kodundan çıkaran bir araç yazmasını engellemez.


7

GÜNCELLEME (03/16/2017)

Neyse ki Jack öldü ve bu yüzden Kotlin geliştiricilerini etkilemeyecek.


Gelecek Jack ise, Kotlin ile geçmişte sıkışıp kalacaksınız. Şu anda Jack, Java dışı kaynakları Dalvik bayt koduna derleyebilen eklentileri desteklemiyor. Ve öyle olsa bile JetBrains'in Kotlin derleyicisine önemsiz bir görev olmayan yeni bir arka uç eklemesi gerekecekti. Bu yüzden, Kotlin'i Jill ile kullanmanız gerekecek ve bu, şu anda kullandığınız alet zincirine çok benzer bir şey olacak.

Aşağıdaki resimde görebileceğiniz gibi, Jack'i açıkça kapatmak imkansız olsa bile, projeyi Jill'i kullanmak için bir kütüphane projesine dönüştürebilirsiniz. Ve uygulama projesi sadece bu kütüphane projesine referans verecektir.

Jack ve Jill Uygulama Derlemesi

Kotlin'in Jack ile nasıl çalışabileceğini görmemin tek yolu, muhtemelen uygulanmayacaktır, Kotlin derleyicisine bir Java arka uç, yani Xtend gibi Java kodu üreten bir arka uç eklemektir . Bu durumda Kotlin derleyicisi tarafından üretilen kod, herhangi bir Java kodu gibi Jack tarafından işlenebilir.

Ancak şu anda Jack'in piyasaya çıktığında neyi destekleyeceğini tam olarak bilmiyoruz. Belki bir şeyler çarpıcı biçimde değişecek ve Jack'e Kotlin desteğini eklemek mümkün olacaktır.


7
Aslında Kotlin ekibinin Jack & Jill'i destekleme planları var, bunu canlı etkinliklerinde duydum, ancak burada JetBrains'ten resmi bir gönderiyi tercih ederim, bu yüzden soruyu cevaplamadım.
kısayol tuşu

Bu harika olurdu ama duyduğum tek destek Jill aracılığıyla. Ve cevapta da bahsettiğim gibi, bu desteği nasıl ekleyeceğimiz çok fazla yol yok.
Michael

Aslında, bellek içi kod oluşturma hakkında bir şeyler vardı (ve çok daha az gerçekçi bir seçenek olan Kotlin -> dex), böylece Kotlin Android derlemesi de önemli ölçüde hızlanacaktı.
kısayol tuşu

Bellek içi kod üretmenin Jack entegrasyonuyla nasıl bir ilgisi olduğunu anlamayın. Kotlin'den dex derlemesine, JetBrains'in Jack'e benzer kendi araç zincirlerini yazması ve desteklemesi gerektiği anlamına gelir.
Michael

1
Kotlin ekibinden başka hiç kimsenin yapabileceklerini ve yapamayacaklarını ya da ne yapıp yapamayacaklarını söylememesi gerektiğinden emin değilim. Bundan daha önce bahsetmişler ve sunabilecekleri planları var.
Jayson Minard

5

Bugün yayınlanan blog gönderisinde ( Kotlin'in Android Yol Haritası ) söylendiği gibi :

Şu anda Jack'in Kotlin tarafından oluşturulan bayt kodunu doğru şekilde işlemesini engelleyen bazı sorunlar var ( 196084 ve 203531 ), ancak sorunları çözmek veya bizim tarafımızda geçici çözümler sağlamak için Google ekibiyle birlikte çalışmayı planlıyoruz. Bu yapıldıktan sonra, her seferinde tüm sınıf dosyalarını çevirmenin aksine (eski Android araçlarında tek olası davranış olan budur), artımlı derleme sırasında yalnızca değiştirilmiş sınıf dosyalarını Jill'i kullanarak çevirebileceğiz.

Yani Kotlin sonunda Jack & Jill'i destekleyecek ve bundan fayda sağlayacak.


2

En son Google duyurusuna göre -

Java 8 dil özellikleri için doğrudan mevcut javac ve dx araç setine destek eklemeye ve Jack araç zincirini kullanımdan kaldırmaya karar verdik. Bu yeni yön ile, Java sınıfı dosya biçimine bağlı mevcut araçlar ve eklentiler çalışmaya devam etmelidir. Gelecekte, Java 8 dil özellikleri Android derleme sistemi tarafından yerel olarak desteklenecektir. Bunu önümüzdeki haftalarda Android Studio'nun bir parçası olarak başlatmayı hedefliyoruz ve bu kararı sizlerle erkenden paylaşmak istedik.

Başlangıçta Jack araç zinciri aracılığıyla Java 8 desteği eklemeyi test ettik. Etkilenen ek açıklama işlemcileri, bayt kodu çözümleyicileri ve yeniden yazarları göz önünde bulundurduğumuzda, zamanla Jack'e geçmenin maliyetinin topluluğumuz için çok yüksek olduğunu fark ettik. Jack araç zincirini denediğiniz ve bize harika geri bildirimler verdiğiniz için teşekkür ederiz. Yeni desteği kullanıma sunana kadar Java 8 kodunuzu oluşturmak için Jack'i kullanmaya devam edebilirsiniz. Jack'ten göç etmek çok az çaba gerektirmeli veya hiç gerektirmemelidir.

Bu nedenle, jack toolchain'in android geliştirme için varsayılan araç zinciri haline gelmesi konusunda endişelenmemize gerek yok. Kotlin'i kullanmaya devam edebilir veya normal javac / dx araç setini kullanabilirsiniz.

Kaynak: Android'de Java 8 Dil Özelliği Desteğinin Geleceği


1

Bu blog gönderisini zaten resmi Kotlin'in blogunda buldum: Kotlin'in Android Yol Haritası

Orada şunu söyleyen bir parça bulacaksınız:

Android derleme performansını iyileştirmek için yapmayı planladığımız bir sonraki şey, Android'in yeni Jack ve Jill araç zinciri . Şu anda Jack'in Kotlin tarafından oluşturulan bayt kodunu doğru şekilde işlemesini engelleyen bazı sorunlar var ( 196084 ve 203531 ), ancak sorunları çözmek veya bizim tarafımızda geçici çözümler sağlamak için Google ekibiyle birlikte çalışmayı planlıyoruz. Bu yapıldıktan sonra, her seferinde tüm sınıf dosyalarını çevirmenin aksine (eski Android araçlarında tek olası davranış olan budur), artımlı derleme sırasında yalnızca değiştirilmiş sınıf dosyalarını Jill'i kullanarak çevirebileceğiz.

@LukasBergstrom'un dediği gibi, "geçmişe takılıp kalma" konusunda herhangi bir sorun olmayacak ;-)

RedditBu konuyla bağlantılı tartışmayı da kontrol edebilirsiniz : Kotlin'in Jack ve Jill ile durumu nedir?

Mutlu kodlamalar.


0

Göre Kotlin blogda , Yeni Özellikleri bölümünde 1.1-beta2 bırakın:

Jack araç zinciri etkinleştirildiğinde Android projeleri oluşturma desteği (jackOptions {true});

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.