2015-06-04 6 views
7

के साथ ग्रैडल एंड्रॉइड प्रोजेक्ट जैसा कि मैंने this post में देखा है, Java 8 आधिकारिक तौर पर Android द्वारा समर्थित नहीं है। इसलिए मुझे दिलचस्पी है कि Android मॉड्यूल Java 7 और Java मॉड्यूल (निर्भरता के रूप में) Java 8 के साथ बनाना संभव है।जावा 8 मॉड्यूल

उदाहरण के तौर पर, मैं Gradle प्रोजेक्ट बनाने की कोशिश कर रहा हूं जिसमें एक Android मॉड्यूल और एक Java मॉड्यूल निर्भरता के रूप में होगा। निम्नलिखित compileOptions दोनों मॉड्यूल के लिए सेट के साथ, सबकुछ ठीक काम करता है।

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 

लेकिन अगर मैं

compileJava { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8 
} 

मैं निम्न त्रुटि प्राप्त करने के लिए मेरी Java मॉड्यूल के लिए compileOptions बदलने की कोशिश:

Error:Execution failed for task ':fc-android:preDexFreeDebug'. 
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_45\bin\java.exe'' finished with non-zero exit value 1 

तो सवाल, Android के लिए है कि वास्तव में संभव है 1.7 संस्करण के साथ संकलित मॉड्यूल औरके साथ संकलित Java मॉड्यूल पर निर्भर? और यदि नहीं, तो क्यों?

अद्यतन:

RetrolambaGradle (@Saeed ने उल्लेख किया) के लिए अच्छा है, लेकिन वे lambdas के एकमात्र आधार है, इसलिए Stream API, DateTime API और अन्य सुविधाओं के लिए पहुँच नहीं। कल्पना करें कि हमारे पास *.jar फ़ाइल Java 8 (Android कोड) के साथ बनाई गई है। मुझे लगता है कि हम फ़ाइल का उपयोग Android मॉड्यूल के लिए निर्भरता के रूप में नहीं कर सकते हैं, क्योंकि यह बाइटकोड ART या Dalvik द्वारा समर्थित नहीं होगा, लेकिन केवल JVMJava 8 के लिए समर्थित नहीं होगा।

उत्तर

12

एंड्रॉयड (जैसा कि आप इस doc में देख जावा 1.8 का कोई उल्लेख नहीं है) और यह भी यह बजाय JVM और एआरटी का उपयोग कर या Dalvik का उपयोग नहीं करता एपीआई 19 के बाद से जावा 1.7 का समर्थन कर सकते हैं, तो यह Dalvik bytecode उत्पन्न करता है।

मुझे लगता है कि अगर हम जावा 1.8 को compileOptions के रूप में उपयोग करना चाहते हैं तो शायद एंड्रॉइड रन टाइम जावा 8 में कुछ नई विशेषताओं को समझ नहीं सकता है जैसे कि लैम्ब्डा, इसलिए ग्रेडल आपको अपने कोड को संकलित करने की अनुमति नहीं देता है और आपको यह अपवाद मिला है।

तो तुम एक बाईटकोड ट्रांसफार्मर

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
    } 

उपयोग करने के लिए पढ़ें यह tutorial यह जावा 7.I've के साथ संगत होना करने के लिए अपने bytecodes धर्मान्तरित इस से पहले परीक्षण किया की जरूरत है और यह मेरे लिए काम करता है।

अद्यतन 2016

एंड्रॉयड एन introduces support for Java 8 language features

+0

रेट्रोलम्बा अच्छा है, हालांकि उनके पास केवल लैम्बडा का समर्थन है, इसलिए 'स्ट्रीम एपीआई', 'डेटटाइम एपीआई' और अन्य सुविधाओं तक पहुंच नहीं है। कल्पना करें कि हमारे पास 'जावा 8' (कोई' एंड्रॉइड' कोड) के साथ निर्मित '* .jar' फ़ाइल है। मुझे लगता है कि हम '' .jar' फ़ाइल को 'एंड्रॉइड' मॉड्यूल के लिए निर्भरता के रूप में उपयोग नहीं कर सकते हैं, क्योंकि यह बाइटकोड 'एआरटी' या 'दलविक' द्वारा समर्थित नहीं होगा, बल्कि 'जावा 8' के लिए केवल 'JVM' द्वारा समर्थित होगा '। क्या मैं सही हूँ, @ सईद? –

+0

हाँ यह सच है, वास्तव में उन्हें पुनर्निर्मित करने की आवश्यकता होगी। –