2015-06-04 9 views
7

this post da gördüğüm gibi, Java 8 resmi olarak şu anda Android tarafından desteklenmemektedir. Java 8 ile Android modülü Java 7 ve Java modülü (bağımlılık olarak) oluşturmak mümkün olup olmadığını merak ediyorum. Örneğin, bir Android modülü ve bir Java modülünü bağımlı olarak içerecek bir Gradle projesi oluşturmaya çalışıyorum. Örneğin, bir Gradle projesi oluşturmaya çalışıyorum. Her iki modülden oluşan aşağıdaki compileOptions ile her şey iyi çalışıyor. Ben aşağıdaki hatayı alıyorumJava 8 modülü ile Gradle Android Projesi

compileJava { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8 
} 

benim Java modülü için compileOptions değiştirmeye çalışırsanız

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 

Ama:

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 

Yani soruyu Android olması aslında mümkündür modülü 1.7 sürümü veile derlenmiş bağımlı Java modülü ile derlenmiştirmu? Ve değilse, neden olmasın?

GÜNCELLEME: (@Saeed bahsettiği) Gradle için

Retrolamba ancak bu kadar Stream API, DateTime API ve diğer özelliklere erişim değil, lambdas sadece destek var, iyidir. Java 8 (Android kodlu) ile oluşturulmuş *.jar dosyanız varsa düşünün. Android modülüne bağımlı olarak bu *.jar dosyasını kullanamayacağımızı düşünüyorum, çünkü bayt kodu ART veya Dalvik tarafından desteklenmeyecek, ancak Java 8 için yalnızca JVM tarafından desteklenmeyecektir.

cevap

12

Android, API 19'dan beri java 1.7'yi destekleyebilir (bu doc'da gördüğünüz gibi java 1.8'den bahsedilmemiştir) ve ayrıca JVM'yi ve ART veya Dalvik'i kullanmaz, dolayısıyla Dalvik bytecode üretir.

Eğer java 1.8'i compileOptions olarak kullanmak istiyorsak, belki de android çalışma zamanı java 8'deki lambda gibi bazı yeni özellikleri anlayamıyor, bu yüzden gradle kodunuzu derlemenize izin vermiyor ve bu istisnayı aldınız.

Yani bir baytkodu transformatör bu tutorial It java 7.I've ile uyumlu olacak şekilde koddan dönüştürür oku

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
    } 

kullanmadan önce bu test gerekiyor ve bu benim için çalışıyor.

Güncelleme 2016

Android N introduces support for Java 8 language features.

+0

Retrolamba iyidir, ancak sadece lambda desteği vardır, bu nedenle "Stream API", "DateTime API" ve diğer özelliklerine erişemezler. “Java 8” ile oluşturulmuş *. Ben bu tür '' .jar' dosyasını 'Android' modülüne bağımlılık olarak kullanamayacağımızı düşünüyorum, çünkü bytecode 'ART' veya' Dalvik' tarafından desteklenmeyecek, ancak yalnızca Java 8 için' JVM' tarafından desteklenmeyecek. '. Doğru muyum? –

+0

evet doğru, aslında yeniden inşa edilmeleri gerekiyor. –