Android N Java 8 में (जैक कंपाइलर) और कोटलिन इंटरॉप हैं


98

अद्यतन 3. KOTLIN अब आधिकारिक तौर पर ANDROID विकास के लिए समर्थित है । GOOGLE द्वारा। YAAAAAAAAS!

अद्यतन 2 : ऐसा लगता है कि JetBrains लंबे समय में Android के लिए कोटलिन का समर्थन करने के लिए वास्तव में प्रतिबद्ध है । मैं एक खुश कोटलिन उपयोगकर्ता हूं :)।

अपडेट : जैटबैन्स के हादी हरीरी ने उल्लेख किया कि वे इस विषय पर कुछ जानकारी जारी करेंगे । एक बार वे इस पोस्ट को अपडेट कर देंगे।


=== निर्धारित STUFF अगला ===

Google ने आगामी एंड्रॉइड एन के लिए कुछ दिलचस्प विशेषताओं के साथ एक पूर्वावलोकन जारी किया, सबसे उल्लेखनीय आंशिक जावा 8 भाषा समर्थन है । यह संभव है कि नए जैक टूलचैन के कारण Google काम कर रहा है।

वर्तमान toolchain का उपयोग कर javac या kotlinc :
javac ( .java-> .class) -> dx ( .class-> .dex)
kotlinc ( .kt-> .class) -> dx ( .class-> .dex)

न्यू जैक टूलचैन:
जैक ( .java-> .jack-> .dex)

मुझे लगता है कि Google Android के विकास के लिए जैक को डिफ़ॉल्ट टूलचैन बनाने की दिशा में आगे बढ़ाएगा । अद्यतन: जैक अब पदावनत हो गया है । Yas।

मेरा सवाल यह है कि भविष्य में एंड्रॉइड विकास के लिए कोटलिन उपयोगकर्ता के रूप में यह नया टूलचैन मुझे कैसे प्रभावित करेगा ? क्या मैं "अतीत में फंस जाऊंगा"?


1
(Kotlin_library (एकाधिक * .kt) => .jar) तो जिल (.jar => Jayce) तो जैक (अन्य (गैर एंड्रॉयड के रूप में समान) (सादा जावा) जार) के आयात
Selvin

डॉक्स पढ़ना: "आपको जैक का उपयोग करने के लिए अलग से कुछ भी करने की ज़रूरत नहीं है - बस पेड़ या अपने प्रोजेक्ट को संकलित करने के लिए अपने मानक मेकफाइल कमांड का उपयोग करें। जैक एम के लिए डिफ़ॉल्ट एंड्रॉइड बिल्ड टूलचैन है।" - source: source.android.com/source/jack.html निश्चित रूप से एक टाइपो है और उनका मतलब है 'एन' नहीं 'एम' ?
मार्क कीन

जैक मर चुका है, आनन्दित हैं: पी
एपिकपांडर्सफोर

जवाबों:


63

अस्वीकरण: मैं जैक पर काम करता हूं

यह आपको प्रभावित नहीं करेगा। कोटलिन के कंपाइलर जावा 6 बाईटेकोड का उत्पादन करते हैं, जिसे जैक / जिल ठीक-ठाक आयात कर सकते हैं।


7
क्या आप उस पर कुछ विवरण साझा कर सकते हैं? :)
ट्यूडर लुका

लेकिन क्या कोटलिन जैक के प्रदर्शन अनुकूलन का लाभ उठा पाएंगे? (कम से कम एक दिन) क्योंकि जैक बहुत भयानक लगता है (मैं अभी कुछ बेंचमार्क की प्रतीक्षा नहीं कर सकता)
NitroG42

मैंने प्रोगार्ड के लेखक से एक बेंचमार्क की एक वीडियो प्रस्तुति देखी है, थोड़ी सी
गुगली के

हम कोटलिन stdlib संलग्न के साथ Android परियोजना के निर्माण के साथ कुछ कठिनाइयों का सामना कर रहे हैं। जिल / जैक में एक बग जैसा दिखता है। क्या आप कृपया इसे देख सकते हैं? code.google.com/p/android/issues/detail?id=196084
yanex

1
इसका मतलब यह है कि जिल जावा 8 बायटेकोड को स्वीकार नहीं करता है? पुस्तकालय मॉड्यूल के बारे में क्या? यदि उन्हें संकलित किया जाता है। जिल द्वारा आयात किया गया है और वे जावा 8 का उपयोग करने में भी असमर्थ हैं? Ie का मतलब है कि जावा नई सुविधाएँ केवल आंतरिक परियोजना .java स्रोतों के लिए उपलब्ध हैं?
दूर

15

@ पावेल दुदका

जैक - एक संकलक है। जेवैक के समान, लेकिन यह थोड़ा अलग काम करता है:

यहां छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं, जैक जावा स्रोत कोड को सीधे Dex फाइल में संकलित करता है! हमारे पास अब मध्यवर्ती * .class फ़ाइलें नहीं हैं, इसलिए dx टूल की आवश्यकता नहीं है!

लेकिन रुकें! यदि मैं अपनी परियोजना में एक तृतीय-पक्ष पुस्तकालय (जो .class फ़ाइलों के संग्रह के रूप में आता है) को शामिल करूं तो क्या होगा?

और जब जिल खेल में आता है:

यहां छवि विवरण दर्ज करें

जिल क्लास फ़ाइलों को संसाधित कर सकते हैं और उन्हें विशेष जेसी प्रारूप में बदल सकते हैं जिसका उपयोग जैक कंपाइलर के लिए इनपुट के रूप में किया जा सकता है।

तो अब एक सेकंड के लिए एक तरफ कदम बढ़ाएं और सोचें ... उन सभी कूल प्लगइन्स का क्या होने वाला है, जिनकी हमें इतनी लत लग गई है? वे सभी की जरूरत है .class फ़ाइलें और जैक संकलक उन अब और नहीं है ...

सौभाग्य से, जैक हमारे लिए कुछ महत्वपूर्ण सुविधाएँ प्रदान करता है:

  • Retrolambda - की जरूरत नहीं होगी। जैक लंबोदर को ठीक से संभाल सकता है
  • प्रोगार्ड - यह अब जैक में बेक किया गया है, इसलिए आप अभी भी मोटापे और कम से कम उपयोग कर सकते हैं

लाभ:

जैक जावा प्रोग्रामिंग भाषा 1.7 का समर्थन करता है और नीचे वर्णित अतिरिक्त सुविधाओं को एकीकृत करता है।

  • Predexing

    JACK लाइब्रेरी फ़ाइल बनाते समय, .dex लाइब्रेरी को प्री-डेक्स के रूप में .jack लाइब्रेरी फ़ाइल के अंदर जनरेट और स्टोर किया जाता है। संकलन करते समय, JACK प्रत्येक लाइब्रेरी से प्री-डेक्स का पुन: उपयोग करता है। सभी पुस्तकालय पूर्व -कृत हैं।

  • वृद्धिशील संकलन

    वृद्धिशील संकलन का मतलब है कि केवल वे घटक जिन्हें अंतिम संकलन के बाद से छुआ गया था, और उनकी निर्भरताएं, पुनर्नवीनीकरण की गई हैं। वृद्धिशील संकलन पूर्ण संकलन की तुलना में काफी तेज हो सकता है जब परिवर्तन केवल घटकों के एक सीमित सेट तक सीमित होते हैं।

  • repackaging

    JACK रेकजिंग करने के लिए jarjar कॉन्फ़िगरेशन फ़ाइलों का उपयोग करता है।

  • मल्टीडेक्स समर्थन

    चूंकि डेक्स फाइलें 65K विधियों तक सीमित हैं, इसलिए 65K से अधिक विधियों वाले एप्लिकेशन को कई डेक्स फ़ाइलों में विभाजित किया जाना चाहिए। (मल्टीडेक्स के बारे में अधिक जानकारी के लिए 'बिल्डिंग एप्स विद 65 के मेथड्स' देखें।)

नुकसान:

  • ट्रांसफ़ॉर्म एपीआई जैक द्वारा समर्थित नहीं है - कोई मध्यवर्ती जावा बाइटकोड नहीं है जिसे आप संशोधित कर सकते हैं, इसलिए कुछ प्लगइन्स जिसका मैंने यहां उल्लेख नहीं किया है वे काम करना बंद कर देंगे
  • एनोटेशन प्रोसेसिंग वर्तमान में जैक द्वारा समर्थित नहीं है, इसलिए यदि आप डैगर, ऑटोवैल्यू आदि जैसे पुस्तकालयों पर बहुत अधिक निर्भर करते हैं, तो आपको जैक पर स्विच करने से पहले दो बार सोचना चाहिए। EDIT: जैसा कि जेक व्हार्टन द्वारा बताया गया है, एन प्रीव्यू में जैक के पास एनोटेशन प्रोसेसिंग सपोर्ट है, लेकिन ग्रैडल के माध्यम से यह अभी तक सामने नहीं आया है।
  • एक जावा बाइटकोड स्तर पर काम करने वाले लिंट डिटेक्टर समर्थित नहीं हैं।
  • जैकोको समर्थित नहीं है - ठीक है, मुझे व्यक्तिगत रूप से जैकोको संदिग्ध लगता है (यह वास्तव में वह नहीं दिखाता है जो आप देखना चाहते हैं), इसलिए इसके बिना जीवित रह सकते हैं
  • डेक्सगार्ड - प्रोगार्ड का उद्यम संस्करण वर्तमान में समर्थित नहीं है

सितंबर 2016 के अनुसार अभी भी 'एनोटेशन प्रोसेसिंग जैक द्वारा समर्थित नहीं है'? ऐसा लगता है कि यह अब समर्थित है ...
टिकोफैब

यह समर्थित है, लेकिन अभी भी कीड़े हैं: जैसे डेटा-बाइंडिंग अभी तक काम नहीं करती है: एंड्रॉइड # 210615
TmTron

ध्यान दें, कि एनोटेशन प्रोसेसिंग IS पूरी तरह से जैक द्वारा समर्थित नहीं है - यह एक ही डिक्रिपिट स्टेट में है जैसा कि एक्लिप्स कंपाइलर में है, जो जैक पर आधारित है ( कई तरीकों को प्लेसहोल्डर के रूप में लागू किया जाता है , जब अपवाद कहा जाता है , तो कई प्रत्यय बग, दायर किए जाते हैं। ECJ बगट्रैकर पर)।
user1643723

7

Google को डिफ़ॉल्ट उपकरण के रूप में जैक पुश करने के लिए नहीं जा रहा है, लेकिन Jack and Jill
जिल के साथ डेक्स की संकलन .class फाइलें यहाँ रहने के लिए है। अन्यथा, आप जार / ऐर लाइब्रेरी को अलविदा कह सकते हैं।

जैक या जिल धीमी होगी या नहीं अभी भी बहस के लिए तैयार है। एंड्रॉइड टीम को उम्मीद है कि जैक वर्तमान बिल्ड प्रक्रिया से तेज होगा, लेकिन अभी ऐसा नहीं है

इसके अलावा, जैक और डेक्स खुले में उपलब्ध हैं, कुछ भी कोटलिन टीम को टूल से बाहर निकलने वाले .jack या .dex फ़ाइलों को लिखने से रोकता है।


7

अद्यतन (03/16/2017)

सौभाग्य से, जैक मर चुका है और इसलिए यह कोटलिन डेवलपर्स को प्रभावित नहीं करेगा।


यदि जैक भविष्य है तो आप कोटलिन के साथ अतीत में फंस जाएंगे। वर्तमान में जैक उन प्लग इन का समर्थन नहीं करता है जो गैर-जावा स्रोत को डाल्विक बायटेकोड में संकलित कर सकते हैं। और यहां तक ​​कि अगर यह JetBrains को Kotlin संकलक के लिए एक नया बैकएंड जोड़ने की आवश्यकता होगी जो एक तुच्छ कार्य नहीं है। तो आपको जिल के साथ कोटलिन का उपयोग करना होगा और यह आपके द्वारा उपयोग किए जाने वाले टूलचेन के समान ही होगा।

जैसा कि आप नीचे दी गई छवि में देख सकते हैं, भले ही जैक को स्पष्ट रूप से बंद करना असंभव हो, आप अभी भी जिल को उपयोग करने के लिए प्रोजेक्ट को लाइब्रेरी प्रोजेक्ट में परिवर्तित करने में सक्षम होंगे। और आवेदन परियोजना सिर्फ इस पुस्तकालय परियोजना को संदर्भित करेगी।

जैक और जिल एप्लीकेशन बिल्ड

एक ही तरीका है कि मैं देखता हूं कि कोटलिन जैक के साथ कैसे काम कर सकता है, जिसे शायद लागू नहीं किया जाएगा, कोटलिन कंपाइलर के लिए एक जावा बैकएंड जोड़ रहा है, यानी एक बैकेंड जो कि Java कोड को Xtend जैसा बनाता है । इस मामले में कोटलिन कंपाइलर द्वारा उत्पन्न कोड को किसी अन्य जावा कोड के रूप में जैक द्वारा संसाधित किया जा सकता है।

लेकिन फिलहाल हम नहीं जानते कि जैक रिलीज होने पर क्या समर्थन करेगा। शायद कुछ नाटकीय रूप से बदल जाएगा और जैक को कोटलिन समर्थन जोड़ना संभव हो जाएगा।


7
दरअसल कोटलिन की टीम की योजना जैक एंड जिल को सपोर्ट करने की है, मैंने इसके बारे में उनके लाइव इवेंट में सुना था, लेकिन मैं यहां JetBrains की आधिकारिक पोस्ट पसंद करूंगा, इसलिए मैंने इस सवाल का जवाब नहीं दिया।
हॉटकी

यह बहुत अच्छा होगा, लेकिन एकमात्र समर्थन जो मैंने सुना है वह जिल के माध्यम से है। और जैसा कि मैंने उत्तर में उल्लेख किया है कि इस समर्थन को जोड़ने के कई तरीके नहीं हैं।
माइकल

वास्तव में, इन-मेमोरी कोड पीढ़ी (और बहुत कम यथार्थवादी विकल्प, कोटलिन -> डेक्स) के बारे में कुछ था, ताकि कोटलिन एंड्रॉइड बिल्ड में महत्वपूर्ण गति-अप भी होगा।
हॉटकी

समझ में नहीं आता कि इन-मेमोरी कोड पीढ़ी जैक एकीकरण से कैसे संबंधित है। और कॉटलिन टू डीएक्स संकलन का मतलब है कि जेटब्रेन्स को जैक के समान अपने स्वयं के टूलचेन को लिखने और समर्थन करने की आवश्यकता है।
माइकल

1
यकीन नहीं है कि कोटलिन टीम के अलावा किसी को भी यह कहना चाहिए कि वे क्या कर सकते हैं और क्या नहीं, या वे क्या कर सकते हैं या नहीं कर सकते हैं। उन्होंने पहले इस बारे में बात की है, और उनकी योजना है कि वे प्रस्तुत कर सकते हैं।
जैसन मिनार्ड

5

जैसा कि ब्लॉग पोस्ट में कहा गया है ( कोटलिन का एंड्रॉइड रोडमैप ) जो आज दिखाई दिया:

अभी कुछ ऐसे मुद्दे हैं जो जैक को कोटलिन -जनरेट किए गए बाईटेकोड को सही तरीके से ( 196084 और 203531 ) तक रोकने से रोकते हैं , लेकिन हम Google टीम के साथ मिलकर काम करने की योजना बना रहे हैं ताकि या तो मुद्दों को हल किया जा सके या हमारी तरफ से वर्कअराउंड प्रदान किया जा सके। एक बार यह हो जाने के बाद, हम वृद्धिशील संकलन के दौरान जिल का उपयोग करके केवल परिवर्तित वर्ग फ़ाइलों का अनुवाद करने में सक्षम होंगे , क्योंकि हर बार सभी वर्ग फ़ाइलों के अनुवाद के विपरीत (जो पुराने एंड्रॉइड टूलिंग में केवल संभव व्यवहार है)।

इसलिए कोटलिन अंततः जैक एंड जिल का समर्थन करेंगे और इससे लाभ प्राप्त करेंगे।


2

नवीनतम Google घोषणा के अनुसार -

हमने जावा 8 भाषा की विशेषताओं के लिए सीधे वर्तमान जेवैक और डीएक्स सेट टूल में समर्थन जोड़ने का फैसला किया है, और जैक टूलचैन को चित्रित किया है। इस नई दिशा के साथ, जावा क्लास फ़ाइल फॉर्मेट पर निर्भर मौजूदा टूल और प्लगइन्स को काम करते रहना चाहिए। आगे बढ़ते हुए, जावा 8 भाषा सुविधाओं को मूल रूप से एंड्रॉइड बिल्ड सिस्टम द्वारा समर्थित किया जाएगा। हम आने वाले हफ्तों में इसे एंड्रॉइड स्टूडियो के हिस्से के रूप में लॉन्च करने का लक्ष्य बना रहे हैं, और हम इस निर्णय को आपके साथ जल्दी से साझा करना चाहते हैं।

हमने शुरू में जावा टूलचिन के माध्यम से जावा 8 समर्थन को जोड़ने का परीक्षण किया। समय के साथ, हमने महसूस किया कि जैक पर स्विच करने की लागत हमारे समुदाय के लिए बहुत अधिक थी जब हमने एनोटेशन प्रोसेसर, बायटेकोड एनालाइजर और रीराइटर्स पर विचार किया। जैक टूलचैन की कोशिश करने और हमें शानदार प्रतिक्रिया देने के लिए धन्यवाद। जब तक हम नया समर्थन जारी नहीं करेंगे तब तक आप अपने जावा 8 कोड का निर्माण करने के लिए जैक का उपयोग जारी रख सकते हैं। जैक से पलायन करने के लिए बहुत कम या कोई काम नहीं करना चाहिए।

इसलिए हमें एंड्रॉइड डेवलपमेंट के लिए जैक टूलचैन को डिफ़ॉल्ट टूलचैन बनने की चिंता नहीं करनी चाहिए। आप कोटलिन का उपयोग करना जारी रख सकते हैं या सामान्य जेवैक / डीएक्स सेट का उपयोग कर सकते हैं।

स्रोत: Android पर जावा 8 भाषा फ़ीचर सपोर्ट का भविष्य


1

मुझे यह ब्लॉग पोस्ट पहले ही आधिकारिक कोटलिन के ब्लॉग से मिल गया है:: कोटलिन का एंड्रॉइड रोडमैप

वहाँ आपको एक हिस्सा मिलेगा जो बताता है कि:

एंड्रॉइड बिल्ड प्रदर्शन को बेहतर बनाने के लिए अगली योजना जो हम करते हैं वह एंड्रॉइड के नए जैक और जिल टूलचिन के साथ एकीकरण प्रदान कर रहा है । अभी कुछ ऐसे मुद्दे हैं जो जैक को कोटलिन -जनरेट किए गए बाईटेकोड को सही तरीके से ( 196084 और 203531 ) तक रोकने से रोकते हैं , लेकिन हम Google टीम के साथ मिलकर काम करने की योजना बना रहे हैं ताकि या तो मुद्दों को हल किया जा सके या हमारी तरफ से वर्कअराउंड प्रदान किया जा सके। एक बार यह हो जाने के बाद, हम वृद्धिशील संकलन के दौरान जिल का उपयोग करके केवल परिवर्तित वर्ग फ़ाइलों का अनुवाद करने में सक्षम होंगे, क्योंकि हर बार सभी वर्ग फ़ाइलों के अनुवाद के विपरीत (जो पुराने एंड्रॉइड टूलिंग में केवल संभव व्यवहार है)।

तो जैसा कि @LukasBergstrom ने कहा, "अतीत में फंसने" के साथ कोई समस्या नहीं होगी;;

आप Redditइस विषय से जुड़ी चर्चा को भी देख सकते हैं: जैक और जिल के साथ कोटलिन की स्थिति क्या है?

खुश कोडिंग।


0

कोटलिन ब्लॉग के अनुसार , 1.1-बीटा 2 नई सुविधाएँ अनुभाग जारी करें:

जब जैक टूलचैन सक्षम हो जाता है तो एंड्रॉइड प्रोजेक्ट्स के निर्माण के लिए समर्थन (jackOptions {true});

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.