2015-06-04 18 views
7

Như tôi đã thấy trong this post, Java 8 không được hỗ trợ chính thức bởi Android ngay bây giờ. Vì vậy, tôi quan tâm nếu có thể xây dựng mô-đun Android với mô-đun Java 7Java (dưới dạng phụ thuộc) với Java 8.Dự án Android Gradle với Java 8 mô-đun

Ví dụ: Tôi đang cố tạo dự án Gradle sẽ chứa một mô-đun Android và một mô-đun Java làm phụ thuộc. Với compileOptions thiết lập cho cả hai mô-đun, mọi thứ hoạt động tốt.

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 

Nhưng nếu tôi cố gắng thay đổi compileOptions cho module Java tôi để

compileJava { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8 
} 

tôi nhận được lỗi sau:

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 

Vậy câu hỏi, đó là thực sự có thể có Android mô-đun được biên dịch với 1.7 phiên bản và phụ thuộc Java mô-đun được biên dịch với 1.8? Và nếu không, vậy tại sao?

UPDATE:

Retrolamba cho Gradle (được đề cập bởi @Saeed) là tốt, tuy nhiên họ chỉ có sự ủng hộ của lambdas, vì vậy không truy cập vào Stream API, DateTime API và các tính năng khác. Hãy tưởng tượng nếu chúng tôi có *.jar tệp được tạo với Java 8 (không có mã số Android). Tôi nghĩ rằng chúng tôi không thể sử dụng tệp *.jar như phụ thuộc cho mô-đun Android, bởi vì mã bytecode sẽ không được hỗ trợ bởi ART hoặc Dalvik, nhưng chỉ bằng JVM cho Java 8.

Trả lời

12

Android có thể hỗ trợ java 1.7 từ API 19 (như bạn thấy trong đây doc không có đề cập đến java 1.8) và cũng không sử dụng JVM và sử dụng ART hoặc Dalvik thay vào đó, Vì vậy, nó tạo ra Dalvik bytecode.

Tôi nghĩ rằng nếu chúng ta muốn sử dụng java 1.8 là compileOptions có thể thời gian chạy android không thể hiểu một số tính năng mới trong java 8 như lambda để gradle không cho phép bạn biên dịch mã của bạn và bạn có ngoại lệ đó.

Vì vậy, bạn cần một máy biến áp bytecode sử dụng

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
    } 

đọc tutorial Nó này chuyển đổi bytecode của bạn để tương thích với java 7.I've thử nghiệm điều này trước và nó làm việc cho tôi.

Update 2016

Android N introduces support for Java 8 language features.

+0

Retrolamba là tốt, tuy nhiên họ chỉ có hỗ trợ lambdas, do đó không truy cập vào 'API dòng', 'API ngày giờ và các tính năng khác. Hãy tưởng tượng nếu chúng ta có tệp '* .jar' được tạo bằng' Java 8' (không có mã 'Android'). Tôi nghĩ rằng chúng tôi không thể sử dụng tệp '* .jar' như phụ thuộc cho mô-đun 'Android', bởi vì bytecode sẽ không được hỗ trợ bởi' ART' hoặc 'Dalvik', nhưng chỉ bởi' JVM' cho' Java 8 '. Tôi có đúng không, @Saeed? –

+0

vâng, đó là sự thật, thực sự họ sẽ cần phải được xây dựng lại. –

Các vấn đề liên quan